web-dev-qa-db-ja.com

すべてのカテゴリのショートコードのカスタム投稿タイプリストを取得する

自分が属するカテゴリの下にあるすべてのカスタム投稿を一覧表示するためのショートコードを作成しようとしています。これが私のコードで、私はコーディングの専門家ではありませんが、これでうまくいくと思いました。誰かが私が間違っていることを私に言うことができるならば役に立つでしょう。任意の助けは大歓迎です!前もって感謝します! :)

<?php

add_shortcode( 'categorylist', 'msc_category_post_list_shortcode' );

function msc_category_post_list_shortcode($atts) {

    $categories_args = array(
    'orderby'                  => 'name',
    'order'                    => 'ASC',
    'hide_empty'               => 1,
    'taxonomy'                 => 'cars_category'

); 

    $categories = get_categories( $categories_args );

    foreach( $categories as $category ) :

        $postlist_args = array(
            'posts_per_page'   => -1,
            'offset'           => 0,
            'category'         => $category->cat_ID,
            'orderby'          => 'post_date',
            'order'            => 'DESC',
            'post_type'        => 'msccar',
            'post_status'      => 'publish' );

            $custom_posts = get_posts( $postlist_args );
            foreach ( $custom_posts as $post ) : setup_postdata( $post ); ?>
                <?php $posts .= '<li>'; ?>
                    <?php $posts .= '<a href="' . the_permalink() . '">' . the_title() . '</a>' ?>
                <?php $posts .= '</li>'; ?>

            <?php endforeach; 
            wp_reset_postdata();
            return $posts;
    endforeach;


}
1
Fredrik

あなたはカテゴリを扱っていません。あなたはカスタム分類法を扱っています。

$postlist_args = array(
  'posts_per_page'   => -1,
  'offset'           => 0,
  // 'category'      => $category->cat_ID, // not this
  'tax_query'        => array(
    array(
      'taxonomy' => 'cars_category',
      'field'    => 'id',
      'terms'    =>  $category->term_ID,
    )
  ),
  'orderby'          => 'post_date',
  'order'            => 'DESC',
  'post_type'        => 'msccar',
  'post_status'      => 'publish'
);

それはテストされていません、そしてそれをテストするために私の最後には少しの設定が必要でしょう - 分類学、ポストなどを作成する - しかしそれは考えであるべきです。

私は、これ(またはいくつかのバリエーション)は機能するはずですが、非常に非効率的になる可能性もあることを指摘しておく必要があります。カテゴリに対して1つのデータベースクエリと、返されたカテゴリごとに1つのクエリを実行します。そのコードブロックだけで、30、40、50、またはそれ以上のクエリを簡単に持つことができます。

私の経験上、できるだけ少ないクエリを実行し、結果をPHPでシャッフルするほうが、ほとんど常に効率的です。

参照してください: https://wordpress.stackexchange.com/a/91263/21376

1
s_ha_dum