Wordpress |自定义帖子|显示内容

时间:2016-03-02 19:22:49

标签: wordpress wordpress-theming custom-post-type

我正在尝试创建一个Wordpress主题,要求定制的帖子类型。

我通过functions.php创建了帖子类型。这似乎已经起作用并显示在管理区域中,并允许我生成帖子。代码exerpt如下:

// Register Custom Post Type
function courses_post_type() {
    $labels = array(
        'name'                  => _x( 'Courses', 'Post Type General Name', 'text_domain' ),
        'singular_name'         => _x( 'Course', 'Post Type Singular Name', 'text_domain' ),
        'menu_name'             => __( 'Training Courses', 'text_domain' ),
        'name_admin_bar'        => __( 'Course Type', 'text_domain' ),
        'archives'              => __( 'Course Archives', 'text_domain' ),
        'parent_item_colon'     => __( 'Parent Course:', 'text_domain' ),
        'all_items'             => __( 'All Courses', 'text_domain' ),
        'add_new_item'          => __( 'Add New Course', 'text_domain' ),
        'add_new'               => __( 'New Course', 'text_domain' ),
        'new_item'              => __( 'New Course', 'text_domain' ),
        'edit_item'             => __( 'Edit Course', 'text_domain' ),
        'update_item'           => __( 'Update Course', 'text_domain' ),
        'view_item'             => __( 'View Course', 'text_domain' ),
        'search_items'          => __( 'Search Courses', 'text_domain' ),
        'not_found'             => __( 'No courses found', 'text_domain' ),
        'not_found_in_trash'    => __( 'No courses found in Trash', 'text_domain' ),
        'featured_image'        => __( 'Featured Image', 'text_domain' ),
        'set_featured_image'    => __( 'Set featured image', 'text_domain' ),
        'remove_featured_image' => __( 'Remove featured image', 'text_domain' ),
        'use_featured_image'    => __( 'Use as featured image', 'text_domain' ),
        'insert_into_item'      => __( 'Insert into item', 'text_domain' ),
        'uploaded_to_this_item' => __( 'Uploaded to this item', 'text_domain' ),
        'items_list'            => __( 'Items list', 'text_domain' ),
        'items_list_navigation' => __( 'Items list navigation', 'text_domain' ),
        'filter_items_list'     => __( 'Filter items list', 'text_domain' ),
    );
    $rewrite = array(
        'slug'                  => 'post_type',
        'with_front'            => true,
        'pages'                 => true,
        'feeds'                 => true,
    );
    $args = array(
        'label'                 => __( 'Course', 'text_domain' ),
        'description'           => __( 'Training Course information pages', 'text_domain' ),
        'labels'                => $labels,
        'supports'              => array( 'title', 'editor', 'excerpt', 'thumbnail', 'custom-fields', ),
        'taxonomies'            => array( 'category', 'post_tag' ),
        'hierarchical'          => true,
        'public'                => true,
        'show_ui'               => true,
        'show_in_menu'          => true,
        'menu_position'         => 5,
        'menu_icon'             => 'dashicons-welcome-learn-more',
        'show_in_admin_bar'     => true,
        'show_in_nav_menus'     => true,
        'can_export'            => true,
        'has_archive'           => false,       
        'exclude_from_search'   => false,
        'publicly_queryable'    => true,
        'query_var'             => 'course',
        'rewrite'               => $rewrite,
        'capability_type'       => 'page',
    );
    register_post_type( 'courses', $args );

}
add_action( 'init', 'courses_post_type', 0 );

我的问题是如何从帖子中获取要在自定义主题中显示的内容?

我目前陷入困境并遇到错误。这是我最喜欢的地方:

我创建了一个名为 single-course.php 的模板,现在没有更改任何与我的主模板不同的内容。

然而,当我在浏览器中查看帖子时,我收到错误消息:

抱歉,没有符合条件的帖子。

在single-course.php中,我已将下面的代码放在我想要显示内容的<div></div>内。

如果它有助于视觉我想要实现的整体是一个自定义的帖子类型(在我的情况下每个帖子是一个培训课程)和一个显示每个自定义帖子的页面。同样可以是商店和自定义帖子是我的single-course.php应该在为此目的预留的div中显示特定产品信息的产品。

// This div shows the post title using a wordpress php function
<div class="page-title bg-alpha-moderateblue">
<h1 style="margin:0px;"><?php echo get_the_title(); ?></h1>
</div>

//This div should show the post or in my case the training course overview
//From my understading I have to use the loop although I only want to SHOW THE CONTENT OF A PARTICULAR CUSTOM (course) POST.
<div class="page-content bg-white">
<?php 

//Define your custom post type name in the arguments

$args = array('post_type' => 'courses');

//Define the loop based on arguments

$loop = new WP_Query( $args );

//Display the contents

while ( $loop->have_posts() ) : $loop->the_post();
?>
<h1 class="entry-title"><?php the_title(); ?></h1>
<div class="entry-content">
<?php the_content(); ?>
</div>
<?php endwhile;?>
</div>

所有建设性的反馈和建议都非常适用,提前感谢

3 个答案:

答案 0 :(得分:0)

我不确定你是否自己编写了所有代码(来自你的functions.php文件),或者你是否从其他地方写过代码,但我建议使用https://codex.wordpress.org/Post_Types#Custom_Post_Types的示例代码尽可能少的自定义。您可能还想使用Wordpress的TwentySixteen单一模板(https://github.com/WordPress/twentysixteen/blob/master/single.php)中的代码,谁比Wordpress更了解Wordpress?我并不是说生产中的代码只是作为一个起点来帮助你消除错误在这两个代码块中的可能性。

那就是说,你尝试过将single-course.php重命名为single-courses.php吗?毕竟这是您在register_post_type调用中指定的名称。

希望有所帮助,祝你好运!

答案 1 :(得分:0)

使用代码生成器时问题解决了我未能更改默认的'slug'=&gt; 'post_type'到我的自定义帖子类型名称,在我的情况下是“课程”。

答案 2 :(得分:0)

如果您使用的是single-courses.php,请注意,您不需要使用

<?php 

//Define your custom post type name in the arguments

$args = array('post_type' => 'courses');

//Define the loop based on arguments

$loop = new WP_Query( $args );

//Display the contents

while ( $loop->have_posts() ) : $loop->the_post();
?>
<h1 class="entry-title"><?php the_title(); ?></h1>
<div class="entry-content">
<?php the_content(); ?>
</div>
<?php endwhile;?>
</div>

如果主题模板名称正确,您应该只能使用标准的wordpress循环和标记来显示您的内容。

即。无需再调用另一个查询。

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

//Content

<?php endwhile; endif; ?>

除非您正在修改查询以获取单个内容中的相关内容。

在这种情况下,我建议使用get_posts();用一个简单的foreach。

$args = array(
  'post_type' = 'courses',
  'posts_per_page' = -1,
);

<?php $related_posts = get_posts($args);

if ( $related_posts ) : ?>

<?php $temp_post = $post; //temporarily store the $post query for use after the related content
foreach ( $related_posts as $post ) : setup_postdata( $post ); ?>

  <h3><?php the_title(); ?></h3>

  <?php the_content(); ?>

<?php endforeach;
$post = $temp_post; //set the post back to the main query 
endif; ?>

Wordpress codex for get_posts