将类别添加到自定义 post 类型并根据类别显示
Add categories to custom post type and display based on categories
我正在开发主题名称为 flozo 的 wordpress 网站。它有一个名为 work
的自定义 post 类型。
我想根据每个类别显示我模板中的作品。
代码如下:
<?php
$args = array( 'post_type' => 'work', 'posts_per_page' => 15 );
$loop = new WP_Query( $args );
$count = 0;
echo '<ul>';
while ( $loop->have_posts() ) : $loop->the_post();
$count++;
$class = ($count % 3 == 1) ? 'first' : '';
echo '<li class="'.$class.'">';
echo '<a href="';
the_permalink();
echo '">';
echo '<div class="overlay" style="background-color:'.ot_get_option( 'main_colour' ).';"></div>';
the_post_thumbnail('full');
echo '</a>';
echo '<br />';
echo '<h2><a href="';
the_permalink();
echo '">';
the_title();
echo '</a></h2>';
echo '<div class="entry-content">';
echo limit_words(get_the_excerpt(), '30');
echo '..</div>';
echo '</li>';
endwhile;
echo '</ul>';
?>
我已经添加了
$args = array( 'post_type' => 'work', 'tag_ID' => 15 ,'posts_per_page' => 15 );
其中 15
是我的类别的 id,但它不起作用
我也试过了
<?php
$catquery = new WP_Query( 'cat=15&posts_per_page=3' );
while($catquery->have_posts()) : $catquery->the_post();
?>
<ul class="last-cat">
<li><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_post_thumbnail(); ?> <p><?php the_title(); ?></p><span><?php echo get_the_date(); ?></span></a></li></ul>
<?php endwhile; ?>
这也没有帮助。
编辑:
类别 url 是
post类型注册码为:
add_action('init', 'work_register');
function work_register() {
$labels = array(
'name' => _x('Work', 'post type general name'),
'singular_name' => _x('Work Item', 'post type singular name'),
'add_new' => _x('Add New', 'work item'),
'add_new_item' => __('Add New Work Item'),
'edit_item' => __('Edit Work Item'),
'new_item' => __('New Work Item'),
'view_item' => __('View Work Item'),
'search_items' => __('Search Work'),
'not_found' => __('Nothing found'),
'not_found_in_trash' => __('Nothing found in Trash'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',
'rewrite' => array( 'slug' => 'work', 'with_front'=> false ), 'capability_type' => 'post',
'hierarchical' => true,
'menu_position' => null,
'supports' => array('title','editor','thumbnail')
);
register_post_type( 'work' , $args );
register_taxonomy("categories", array("work"), array("hierarchical" => true, "label" => "Categories", "singular_label" => "Category", "rewrite" => array( 'slug' => 'work', 'with_front'=> false )));
}
试试下面的代码,
<?php
$args = array( 'posts_per_page' => 5,'post_type' => 'work','category' => 15 );
$myposts = get_posts( $args );
foreach ( $myposts as $post ):?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endforeach; ?>
<?php
query_posts( array( 'post_type' => 'work', 'categories' => 'slides' ) );
//the loop start here
if ( have_posts() ) : while ( have_posts() ) : the_post();
?>
<h3><?php the_title(); ?></h3>
<?php the_content(); ?>
<?php endwhile; endif; wp_reset_query(); ?>
我终于从here那里得到了它
完美
其他两个答案都不正确,特别是来自 OP 的那个。 query_posts
应该 NEVER EVER 被使用,它甚至在法典中有说明,所以请阅读法典。此外,您永远不应将主查询替换为自定义查询。
解决方法很简单,正如我在下面所描述的,这是正确的方法。
原始答案
你这里有几个缺陷
为了使您的自定义 post 类型具有存档,您需要在自定义 post 类型中将 has_archive
参数设置为 true
注册参数。参见 register_post_type()
如果您不打算使用自定义 post 类型的页面,请将 hierarchical
参数设置为 false
。将此设置为 true 会随着 post 的增加而显着降低后端速度,因为 Wordpress 会尝试为每个 post 构建树,就像它为页面
所做的那样
切勿使用自定义查询代替主查询。总是比较麻烦,比较浪费资源。有关何时何地正确使用自定义查询的完整说明,请参阅 this post。
这一点是前一点的延伸。如果您需要更改主查询,请使用 pre_get_posts
进行更改。它使用与 WP_Query
完全相同的参数,因为主查询使用 WP_Query
来获取 posts。这一切都在上面的链接 post
中进行了解释
您自定义查询的主要缺陷是您不了解类别、标签和自定义分类法之间的区别。我写了一个完整的 post(你可以阅读 here ) on this and actually entered it into the codex as well. You are making use of a custom taxonomy, so the category parameters won't work. You need to use a tax_query
自定义分类
要解决您的问题,请按照以下步骤操作
在注册自定义 post 类型时将 has_achive
参数添加到参数中并将其设置为 true
。如果需要,也可以在自定义 post 类型中将 hierarchical
参数设置为 false
。 (不要为您的自定义分类法设置此项,这将使您的分类法表现得像普通标签)
在此之后,通过访问 "Settings" 下的永久链接页面并单击 "Update"
刷新您的重写规则
访问您的主页只是为了确保您的新规则已保存
删除自定义查询并返回默认循环。你的 archive-work.php
应该是这样的
if( have_posts() ) {
while( have_posts() ) {
the_post();
// Your custom markup and template tags
}
}
如果您需要显示来自特定术语的 post,请创建 taxonomy.php
、taxonomy-{$taxonomy}.php
或 taxonomy-{$taxonomy}-{$term}.php
模板。查看 Template Hierarchy 了解更多信息
编辑 1
如果您只需要在自定义 post 类型的存档术语中显示特定术语,完成上述操作后,使用 pre_get_posts
以正确的方式更改主查询
add_action( 'pre_get_posts', function ( $q ) {
if( !is_admin() && $q->is_main_query() && is_post_type_archive( 'work' ) ) {
$q->set( 'categories', 'slides' );
}
});
编辑 2
这是解决这个问题的代码
复制并粘贴以下代码来代替您注册 post 类型的代码。我添加了 has_archive
参数。我还将您的分类法的重写规则更改为 categories
。自定义 post 类型和分类法都有相同的 slug 真的很麻烦。这在默认情况下不起作用并且完全将所有内容抛出目标
add_action( 'init', 'work_register' );
function work_register() {
$labels = array(
'name' => _x('Work', 'post type general name'),
'singular_name' => _x('Work Item', 'post type singular name'),
'add_new' => _x('Add New', 'work item'),
'add_new_item' => __('Add New Work Item'),
'edit_item' => __('Edit Work Item'),
'new_item' => __('New Work Item'),
'view_item' => __('View Work Item'),
'search_items' => __('Search Work'),
'not_found' => __('Nothing found'),
'not_found_in_trash' => __('Nothing found in Trash'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',
'rewrite' => array( 'slug' => 'work', 'with_front'=> false ),
'capability_type' => 'post',
'hierarchical' => true,
'has_archive' => true,
'menu_position' => null,
'supports' => array('title','editor','thumbnail')
);
register_post_type( 'work' , $args );
register_taxonomy( 'categories', array('work'), array(
'hierarchical' => true,
'label' => 'Categories',
'singular_label' => 'Category',
'rewrite' => array( 'slug' => 'categories', 'with_front'=> false )
)
);
register_taxonomy_for_object_type( 'categories', 'work' ); // Better be safe than sorry
}
在您的存档中-work.php,用此代码替换您的自定义查询
<?php
$count = 0;
echo '<ul>';
while ( have_posts() ) : the_post();
$count++;
$class = ($count % 3 == 1) ? 'first' : '';
echo '<li class="'.$class.'">';
echo '<a href="';
the_permalink();
echo '">';
echo '<div class="overlay" style="background-color:'.ot_get_option( 'main_colour' ).';"></div>';
the_post_thumbnail('full');
echo '</a>';
echo '<br />';
echo '<h2><a href="';
the_permalink();
echo '">';
the_title();
echo '</a></h2>';
echo '<div class="entry-content">';
echo limit_words(get_the_excerpt(), '30');
echo '..</div>';
echo '</li>';
endwhile;
echo '</ul>';
?>
非常重要 -> 好的,现在访问设置>>后端(管理区域)的永久链接并单击保存更改。这将刷新您的永久链接并设置新的永久链接结构
当您访问
时,您现在应该可以看到自定义 post 类型中的所有 post
我正在开发主题名称为 flozo 的 wordpress 网站。它有一个名为 work
的自定义 post 类型。
我想根据每个类别显示我模板中的作品。
代码如下:
<?php
$args = array( 'post_type' => 'work', 'posts_per_page' => 15 );
$loop = new WP_Query( $args );
$count = 0;
echo '<ul>';
while ( $loop->have_posts() ) : $loop->the_post();
$count++;
$class = ($count % 3 == 1) ? 'first' : '';
echo '<li class="'.$class.'">';
echo '<a href="';
the_permalink();
echo '">';
echo '<div class="overlay" style="background-color:'.ot_get_option( 'main_colour' ).';"></div>';
the_post_thumbnail('full');
echo '</a>';
echo '<br />';
echo '<h2><a href="';
the_permalink();
echo '">';
the_title();
echo '</a></h2>';
echo '<div class="entry-content">';
echo limit_words(get_the_excerpt(), '30');
echo '..</div>';
echo '</li>';
endwhile;
echo '</ul>';
?>
我已经添加了
$args = array( 'post_type' => 'work', 'tag_ID' => 15 ,'posts_per_page' => 15 );
其中 15
是我的类别的 id,但它不起作用
我也试过了
<?php
$catquery = new WP_Query( 'cat=15&posts_per_page=3' );
while($catquery->have_posts()) : $catquery->the_post();
?>
<ul class="last-cat">
<li><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_post_thumbnail(); ?> <p><?php the_title(); ?></p><span><?php echo get_the_date(); ?></span></a></li></ul>
<?php endwhile; ?>
这也没有帮助。
编辑:
类别 url 是
post类型注册码为:
add_action('init', 'work_register');
function work_register() {
$labels = array(
'name' => _x('Work', 'post type general name'),
'singular_name' => _x('Work Item', 'post type singular name'),
'add_new' => _x('Add New', 'work item'),
'add_new_item' => __('Add New Work Item'),
'edit_item' => __('Edit Work Item'),
'new_item' => __('New Work Item'),
'view_item' => __('View Work Item'),
'search_items' => __('Search Work'),
'not_found' => __('Nothing found'),
'not_found_in_trash' => __('Nothing found in Trash'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',
'rewrite' => array( 'slug' => 'work', 'with_front'=> false ), 'capability_type' => 'post',
'hierarchical' => true,
'menu_position' => null,
'supports' => array('title','editor','thumbnail')
);
register_post_type( 'work' , $args );
register_taxonomy("categories", array("work"), array("hierarchical" => true, "label" => "Categories", "singular_label" => "Category", "rewrite" => array( 'slug' => 'work', 'with_front'=> false )));
}
试试下面的代码,
<?php
$args = array( 'posts_per_page' => 5,'post_type' => 'work','category' => 15 );
$myposts = get_posts( $args );
foreach ( $myposts as $post ):?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endforeach; ?>
<?php
query_posts( array( 'post_type' => 'work', 'categories' => 'slides' ) );
//the loop start here
if ( have_posts() ) : while ( have_posts() ) : the_post();
?>
<h3><?php the_title(); ?></h3>
<?php the_content(); ?>
<?php endwhile; endif; wp_reset_query(); ?>
我终于从here那里得到了它 完美
其他两个答案都不正确,特别是来自 OP 的那个。 query_posts
应该 NEVER EVER 被使用,它甚至在法典中有说明,所以请阅读法典。此外,您永远不应将主查询替换为自定义查询。
解决方法很简单,正如我在下面所描述的,这是正确的方法。
原始答案
你这里有几个缺陷
为了使您的自定义 post 类型具有存档,您需要在自定义 post 类型中将
has_archive
参数设置为true
注册参数。参见register_post_type()
如果您不打算使用自定义 post 类型的页面,请将
hierarchical
参数设置为false
。将此设置为 true 会随着 post 的增加而显着降低后端速度,因为 Wordpress 会尝试为每个 post 构建树,就像它为页面 所做的那样
切勿使用自定义查询代替主查询。总是比较麻烦,比较浪费资源。有关何时何地正确使用自定义查询的完整说明,请参阅 this post。
这一点是前一点的延伸。如果您需要更改主查询,请使用
pre_get_posts
进行更改。它使用与WP_Query
完全相同的参数,因为主查询使用WP_Query
来获取 posts。这一切都在上面的链接 post 中进行了解释
您自定义查询的主要缺陷是您不了解类别、标签和自定义分类法之间的区别。我写了一个完整的 post(你可以阅读 here ) on this and actually entered it into the codex as well. You are making use of a custom taxonomy, so the category parameters won't work. You need to use a
tax_query
自定义分类
要解决您的问题,请按照以下步骤操作
在注册自定义 post 类型时将
has_achive
参数添加到参数中并将其设置为true
。如果需要,也可以在自定义 post 类型中将hierarchical
参数设置为false
。 (不要为您的自定义分类法设置此项,这将使您的分类法表现得像普通标签)在此之后,通过访问 "Settings" 下的永久链接页面并单击 "Update"
刷新您的重写规则
访问您的主页只是为了确保您的新规则已保存
删除自定义查询并返回默认循环。你的
archive-work.php
应该是这样的if( have_posts() ) { while( have_posts() ) { the_post(); // Your custom markup and template tags } }
如果您需要显示来自特定术语的 post,请创建
taxonomy.php
、taxonomy-{$taxonomy}.php
或taxonomy-{$taxonomy}-{$term}.php
模板。查看 Template Hierarchy 了解更多信息
编辑 1
如果您只需要在自定义 post 类型的存档术语中显示特定术语,完成上述操作后,使用 pre_get_posts
以正确的方式更改主查询
add_action( 'pre_get_posts', function ( $q ) {
if( !is_admin() && $q->is_main_query() && is_post_type_archive( 'work' ) ) {
$q->set( 'categories', 'slides' );
}
});
编辑 2
这是解决这个问题的代码
复制并粘贴以下代码来代替您注册 post 类型的代码。我添加了 has_archive
参数。我还将您的分类法的重写规则更改为 categories
。自定义 post 类型和分类法都有相同的 slug 真的很麻烦。这在默认情况下不起作用并且完全将所有内容抛出目标
add_action( 'init', 'work_register' );
function work_register() {
$labels = array(
'name' => _x('Work', 'post type general name'),
'singular_name' => _x('Work Item', 'post type singular name'),
'add_new' => _x('Add New', 'work item'),
'add_new_item' => __('Add New Work Item'),
'edit_item' => __('Edit Work Item'),
'new_item' => __('New Work Item'),
'view_item' => __('View Work Item'),
'search_items' => __('Search Work'),
'not_found' => __('Nothing found'),
'not_found_in_trash' => __('Nothing found in Trash'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',
'rewrite' => array( 'slug' => 'work', 'with_front'=> false ),
'capability_type' => 'post',
'hierarchical' => true,
'has_archive' => true,
'menu_position' => null,
'supports' => array('title','editor','thumbnail')
);
register_post_type( 'work' , $args );
register_taxonomy( 'categories', array('work'), array(
'hierarchical' => true,
'label' => 'Categories',
'singular_label' => 'Category',
'rewrite' => array( 'slug' => 'categories', 'with_front'=> false )
)
);
register_taxonomy_for_object_type( 'categories', 'work' ); // Better be safe than sorry
}
在您的存档中-work.php,用此代码替换您的自定义查询
<?php
$count = 0;
echo '<ul>';
while ( have_posts() ) : the_post();
$count++;
$class = ($count % 3 == 1) ? 'first' : '';
echo '<li class="'.$class.'">';
echo '<a href="';
the_permalink();
echo '">';
echo '<div class="overlay" style="background-color:'.ot_get_option( 'main_colour' ).';"></div>';
the_post_thumbnail('full');
echo '</a>';
echo '<br />';
echo '<h2><a href="';
the_permalink();
echo '">';
the_title();
echo '</a></h2>';
echo '<div class="entry-content">';
echo limit_words(get_the_excerpt(), '30');
echo '..</div>';
echo '</li>';
endwhile;
echo '</ul>';
?>
非常重要 -> 好的,现在访问设置>>后端(管理区域)的永久链接并单击保存更改。这将刷新您的永久链接并设置新的永久链接结构
当您访问
时,您现在应该可以看到自定义 post 类型中的所有 post