web-dev-qa-db-ja.com

カスタム投稿タイプにカテゴリを追加し、カテゴリに基づいて表示します

私はテーマ名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; ?>

これも役に立ちませんでした。

編集:

カテゴリのURLは

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



}
6
user4260940

他の両方の答え、特にOPからの答えは正しくありません。 _query_posts_は決して使用しないでください。コーデックスにも記載されているので、コーデックスを読んでください。また、メインクエリをカスタムクエリに置き換えないでください。

解決策は私が以下に説明するように単純であり、それはそれを行う正しい方法です。

元の回答

ここにいくつかの欠陥があります

  • カスタム投稿タイプにアーカイブを含めるには、カスタム投稿タイプ登録引数で_has_archive_パラメーターをtrueに設定する必要があります。 register_post_type() を参照してください

  • ページのようなカスタム投稿タイプを使用しない場合は、hierarchicalパラメーターをfalseに設定します。これをtrueに設定すると、投稿が増えるにつれてバックエンドの速度が大幅に低下します。Wordpressは、ページの場合と同様に、投稿ごとにツリーを構築しようとします。

  • メインクエリの代わりにカスタムクエリを使用しないでください。それは常により厄介で、リソースの浪費です。カスタムクエリを正しく使用する場所とタイミングの詳細については、 この投稿 を参照してください。

  • この点は前の点の延長です。メインクエリを変更する必要がある場合は、_pre_get_posts_を使用して変更します。メインクエリが_WP_Query_を使用して投稿をフェッチするため、_WP_Query_とまったく同じパラメータを使用します。これはすべて上記のリンクされた投稿で説明されています

  • カスタムクエリの主な欠点は、カテゴリ、タグ、カスタム分類法の違いが何であるかを理解していないことです。私はこれについて完全な投稿(あなたが読むことができる ここ )を書き、実際にそれをコーデックスにも入力しました。カスタム分類法を使用しているため、カテゴリパラメータは機能しません。カスタム分類には _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.php_、_taxonomy-{$taxonomy}.php_、または_taxonomy-{$taxonomy}-{$term}.php_テンプレートを作成します。詳細については、 テンプレート階層 を確認してください

編集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に変更しました。カスタム投稿タイプと分類法の両方に同じスラッグを使用するのは本当に面倒です。これはデフォルトでは機能せず、すべてを完全にターゲットから外します

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

非常に重要-> OK、今度は設定>>バックエンド(管理領域)のパーマリンクにアクセスしてください変更を保存をクリックします。これにより、パーマリンクがフラッシュされ、新しいパーマリンク構造が設定されます

にアクセスすると、カスタム投稿タイプのすべての投稿が表示されます。

http://example.com/work/

11
Pieter Goosen
<?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(); ?>

私はついにそれを ここ 完璧から手に入れました

1
user4260940

以下のコードで試してください、

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

この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>
0
Maroof Ahmed