web-dev-qa-db-ja.com

特定の分類法でカスタム投稿タイプを表示するためのショートコードを作成する

特定の製品ラインのすべての製品をリストするためのページテンプレートを作成しました。ここで、各ページのショートコードに記載されている分類法に基づいて、このカスタム投稿タイプ(商品)からすべての投稿を一覧表示します。

例:

「全プライム商品一覧」ページ

[products line = "prime"]

私はこのコードを試してみました:

function shortcode_mostra_produtos ( $atts ) {
  $atts = shortcode_atts( array(
    'default' => ''
  ), $atts );
    $terms = get_terms('linhas');
    wp_reset_query();
    $args = array('post_type' => 'produtos',
      'tax_query' => array(
        array(
          'taxonomy' => 'linhas',
          'field' => 'slug',
          'terms' => $atts,
        ),
      ),
     );
     $loop = new WP_Query($args);
     if($loop->have_posts()) {
        while($loop->have_posts()) : $loop->the_post();
            echo ' "'.get_the_title().'" ';
        endwhile;
     }
}
add_shortcode( 'produtos','shortcode_mostra_produtos' );
6
Luan Davi

まず最初に、一般的なfunctions.phpファイルではなくinitの間にショートコードを登録することが常に良い方法です。少なくともadd_shortcode()initに含まれるべきです。とにかく、始めましょう!

add_shortcode() を使うときはいつでも、最初のパラメータはショートコードの名前になり、2番目のパラメータはコールバック関数になります。この意味は:

[products line="prime"]

代わりにする必要があります。

[produtos line="prime"]

これまでのところ、これがあります。

/**
 * Register all shortcodes
 *
 * @return null
 */
function register_shortcodes() {
    add_shortcode( 'produtos', 'shortcode_mostra_produtos' );
}
add_action( 'init', 'register_shortcodes' );

/**
 * Produtos Shortcode Callback
 * - [produtos]
 * 
 * @param Array $atts
 *
 * @return string
 */
function shortcode_mostra_produtos( $atts ) {
    /** Our outline will go here
}

処理属性を見てみましょう。 shortcode_atts() は、ショートコードに渡された属性を渡された配列内の属性と照合しようとする方法です。左側がキー、右側がデフォルトです。そのため、代わりにdefaultslineに変更する必要があります。デフォルトのカテゴリにする場合は、これが場所になります。

$atts = shortcode_atts( array(
    'line' => ''
), $atts );

ユーザーがショートコードline="test"に属性を追加すると、配列インデックスlinetestを保持します。

echo $atts['line']; // Prints 'test'

他のすべての属性は、それらをshortcode_atts()配列に追加しない限り無視されます。最後にそれはWP_Queryとあなたが必要とするものを印刷するだけです:

/**
 * Register all shortcodes
 *
 * @return null
 */
function register_shortcodes() {
    add_shortcode( 'produtos', 'shortcode_mostra_produtos' );
}
add_action( 'init', 'register_shortcodes' );

/**
 * Produtos Shortcode Callback
 * 
 * @param Array $atts
 *
 * @return string
 */
function shortcode_mostra_produtos( $atts ) {
    global $wp_query,
        $post;

    $atts = shortcode_atts( array(
        'line' => ''
    ), $atts );

    $loop = new WP_Query( array(
        'posts_per_page'    => 200,
        'post_type'         => 'produtos',
        'orderby'           => 'menu_order title',
        'order'             => 'ASC',
        'tax_query'         => array( array(
            'taxonomy'  => 'linhas',
            'field'     => 'slug',
            'terms'     => array( sanitize_title( $atts['line'] ) )
        ) )
    ) );

    if( ! $loop->have_posts() ) {
        return false;
    }

    while( $loop->have_posts() ) {
        $loop->the_post();
        echo the_title();
    }

    wp_reset_postdata();
}
7
Howdy_McGee
    add_shortcode( 'product-list','bpo_product_list' );
function bpo_product_list ( $atts ) {
  $atts = shortcode_atts( array(
    'category' => ''
  ), $atts );
    $terms = get_terms('product_category');
    wp_reset_query();
    $args = array('post_type' => 'product',
      'tax_query' => array(
        array(
          'taxonomy' => 'product_category',
          'field' => 'slug',
          'terms' => $atts,
        ),
      ),
     );
     $loop = new WP_Query($args);
     if($loop->have_posts()) {
        while($loop->have_posts()) : $loop->the_post();
            echo ' "'.get_the_title().'" ';
        endwhile;
     }

     else {
            echo  'Sorry, no posts were found';
          }
}

上記のコードでは、商品CPTと商品CPTのproduct_category分類法を作成しました。

[商品リストカテゴリ= "シャツ"]

上記のコードは完璧に動作します。

0
Pradeep