Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Wordpress中为自定义帖子类型添加其他页面_Php_Wordpress_Custom Post Type - Fatal编程技术网

Php 在Wordpress中为自定义帖子类型添加其他页面

Php 在Wordpress中为自定义帖子类型添加其他页面,php,wordpress,custom-post-type,Php,Wordpress,Custom Post Type,我创建了一个名为“课程”的自定义帖子类型 Wordpress会自动为“课程”添加以下URL: :存档页面(即Archive course.php) :课程页面(即single-course.php) 不过,我希望再增加几页: :每门课程的查询页面 :某些课程的演示页,如果它们满足特定条件 问题是我不确定如何“正确”添加这些页面。我现在的做法是: function create_post_types() { // ...add custom post types ...

我创建了一个名为“课程”的自定义帖子类型

Wordpress会自动为“课程”添加以下URL:

  • 存档页面(即Archive course.php)
  • 课程页面(即single-course.php)
不过,我希望再增加几页:

  • 每门课程的查询页面
  • 某些课程的演示页,如果它们满足特定条件
问题是我不确定如何“正确”添加这些页面。我现在的做法是:

function create_post_types() {
    // ...add custom post types ...

    add_rewrite_rule("course/([^/]+)/enquiry/?$",
        'index.php?post_type=course&course=$matches[1]&enquiry=true', 'top');

    add_rewrite_rule("course/([^/]+)/demo/?$",
        'index.php?post_type=course&course=$matches[1]&demo=true', 'top');
}
add_action( 'init', 'create_post_types' );

function add_query_vars_filter( $vars ){
    $vars[] = "enquiry";
    $vars[] = "demo";
    return $vars;
}
add_filter( 'query_vars', 'add_query_vars_filter' );
然后在“single course.php”中,我添加了以下if语句:

if (get_query_var('enquiry')) {
    // enquiry page code
} else if (get_query_var('demo')) {
    // Demo Page code
} else {
    // Single course page code
}
然而,我做这件事的方式更像是一种黑客行为,并不像Wordpress做这件事的正确方式。因此,它不能很好地与其他插件(如“Yoast SEO插件”)配合使用,因为“Yoast SEO插件”无法识别我在其XML站点地图中的其他页面。我想面包屑也会出现类似的问题

为自定义帖子类型添加额外页面的最佳做法或更好的方法是什么


可选问题:实现演示页面的合适方式是什么(因为这需要通过
get\u字段(“在线课程”)检查课程是否满足特定条件==True

声明自定义帖子类型

在您的函数中。php:

$labelsCourse = array(
        'name' => 'Course',
        'singular_name' => 'Course',
        'add_new' => 'Add New',
        'add_new_item' => 'Add New Course',
        'edit_item' => 'Edit Course',
        'new_item' => 'New Course',
        'view_item' => 'View Course',
        'search_items' => 'Search Courses',
        'not_found' => 'No courses found.',
        'not_found_in_trash' => 'No courses found in Trash.'
    );
register_post_type('course', array(
    'labels' => $labelsCourse,
    'public' => true,
    'publicly_queryable'    => true,
    'has_archive' => 'course',
    'show_ui' => true,
    'capability_type' => 'page',
    'hierarchical' => true,
    'rewrite' => array( 'slug' => 'course', 'with_front' => false ),
    'query_var' => true,
    'supports' => array('title', 'thumbnail', 'editor', 'page-attributes')
));
然后在你的管理员中添加一个新课程,标题为:“课程名称”,然后添加另一个新课程,标题为:“演示”


然后在single-course.php中,您可以添加一个条件语句来调用子页面。

我认为您的方法是最正确的方法……但是,如果yoast的wordpress SEO、自动站点地图中的包含等是一个优先事项,那么我认为最兼容的解决方案将是实际创建额外页面作为子页面(当然是自动的)。如果特定课程没有演示,条件演示页面应该只返回404,如果您创建“物理”子页面这是一个不需要动脑筋的方法:不要创建子页面。如果您坚持使用当前方法,请检查页面本身并返回404。注意:您需要很多操作挂钩,以确保子页面始终反映家长的状态,并且不会意外地手动删除(如果可能存在问题)…换言之,它将比您当前的解决方案更加“黑客化”——但我仍然认为它将更加兼容。为什么不作为您的CPT的子级添加页面?我同意@Mikk3lRo,使用重写来创建这些类型的页面。您真的想为联系人表单编制索引吗?这不是一个好的解决方案,而且会非常复杂(为了让它更可靠),所以我不会花时间整理一个完整的例子。但是你可以通过编程创建、删除、更新帖子(谷歌it,我在iphone上写这个),你可以在需要的时候将几乎所有的更改挂到你的自定义帖子类型,以更新孩子们的状态等。因此,理论上这绝对是可能的……但我越想它,我认为它在现实中就越糟糕……这似乎比我的方式更骇人听闻,因为“演示”不是一门课程,而只是“课程”的另一页.这也意味着我必须在每门课程中添加一个演示。不过这是个不错的主意。