将类别添加到自定义帖子类型并根据类别显示

时间:2015-01-12 05:58:27

标签: wordpress categories custom-post-type

我正在使用主题名称为 flozo 的wordpress网站。它有一个名为work的自定义帖子类型。 我想根据每个类别在模板中显示作品。

以下是代码:

<?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; ?>

也没有帮助。

修改:

类别网址是

  

http://jointviews.com/wp-admin/edit-tags.php?action=edit&taxonomy=categories&tag_ID=15&post_type=work

帖子类型注册码是:

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 )));



}

4 个答案:

答案 0 :(得分:10)

其他两个答案都不正确,特别是来自OP的答案。 query_posts应该永远不会使用,甚至在codex中说明,所以请阅读codex。此外,您永远不应该使用自定义查询替换主查询。

解决方案很简单,如下所述,这是正确的方法

原始答案

你有几个缺陷

  • 要使您的自定义帖子类型具有存档,您需要在自定义帖子类型注册参数中将has_archive参数设置为true。请参阅register_post_type()

  • 如果您不打算使用自定义帖子类型,请将hierarchical参数设置为false。将此设置为true会大大减慢后端,因为您的帖子会增加,因为Wordpress会尝试为每个帖子构建一个树,就像它为页面构建一样

  • 决不使用自定义查询代替主查询。它总是比较麻烦,浪费资源。有关正确使用自定义查询的位置和时间的完整说明,请参阅this post

  • 这一点是前一个的延伸。如果您需要更改主查询,请使用pre_get_posts执行此操作。它使用与WP_Query完全相同的参数,因为主查询使用WP_Query来获取帖子。这些都在上面的链接帖子中解释了

  • 您的自定义查询的主要缺陷是您不了解类别,标记和自定义分类之间的区别。我已经写了一篇完整的帖子(你可以阅读here),并且实际上也将它输入到了手抄本中。您正在使用自定义分类,因此类别参数将不起作用。您需要使用tax_query进行自定义分类

要解决您的问题,请执行以下步骤

  • 在注册自定义帖子类型时将has_achive参数添加到参数中,并将其设置为true。如果需要,请在自定义帖子类型中将hierarchical参数设置为false。 (不要为自定义分类设置此项,这将使您的分类法像普通标记一样行事

  • 在此之后,通过访问“设置”下的永久链接页面并点击“更新”来刷新重写规则

  • 访问您的主页,以确保新规则已保存

  • 删除自定义查询并返回默认循环。您的archive-work.php应该是这样的

    if( have_posts() ) {
        while( have_posts() ) {
            the_post();
    
            // Your custom markup and template tags
    
        }
    }
    
  • 如果您需要显示特定字词的帖子,请创建taxonomy.phptaxonomy-{$taxonomy}.phptaxonomy-{$taxonomy}-{$term}.php模板。查看Template Hierarchy了解详情

编辑1

如果您只需要在自定义帖子类型存档字词中显示特定字词,请在完成上述操作后使用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

以下是解决此问题的代码

复制并粘贴以下代码,代替您注册帖子类型的代码。我添加了has_archive参数。我还将分类法的重写规则更改为categories。为自定义帖子类型和分类法设置相同的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
}

在archive-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>';
?>

非常重要 - &gt;好了,现在访问设置&gt;&gt;后端(管理区域)中的永久链接,然后单击保存更改。这将刷新永久链接并设置新的永久链接结构

您现在应该在访问

时看到自定义帖子类型中的所有帖子
  

http://example.com/work/

答案 1 :(得分:1)

<?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得到了它 完美

答案 2 :(得分:0)

尝试使用以下代码,

<?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; ?>

答案 3 :(得分:0)

如何将html标记为短代码

<div class="news-grid" itemtype="http://schema.org/Article" itemscope>
                    <h2 class="title">top news</h2>

                    <div class="featured">
                        <a href="" itemprop="url" title=""><img width="282" height="178" src="" class="lead-thumbnail wp-post-image" alt="" /></a>
                        <h3><a href="" itemprop="url" title="</a></h3>
                        <p itemprop="description"><a href='' class='readmore'> &raquo</a></p>                       
                    </div>

                    <div class="more-item">
                        <ul>
                                                    <li><p><a href="" rel="bookmark" itemprop="url" title=""></a></li>
                                                    <li><p><a href="" rel="bookmark" itemprop="url" title=""></a></li>
                                                    <li><p><a href="" rel="bookmark" itemprop="url" title=""></a></li>
                                                    <li><p><a href="" rel="bookmark" itemprop="url" title=""></a></li>

                        </ul>
                    </div>                      
                </div>