サポート » プラグイン » posts 2 posts を使用して関連付けた記事をターム毎に表示したい

  • 解決済 mattwo

    (@mattwo)


    よろしくお願いいたします。
    私、PHPのまったくの初心者でまったく分からず右往左往してしまい。トピックで助けていただきたく投稿させていただきます。

    posts 2 postsでカスタム投稿wheelとcarの投稿記事を関連付けしたものを
    single-car.phpにwheelの関連記事をターム別に出力したいと思ってます。

    Custom Post Type UIを使用してカスタム投稿「wheel」と「car」を作成

    functions.phpにて

    function my_connection_types() {
        if ( !function_exists( 'p2p_register_connection_type' ) )
            return;
         p2p_register_connection_type(
            array(
                'name' => 'wheel_to_car',
                'from' => 'wheel',
                'to' => 'car'
            )
        );
    }
    add_action( 'wp_loaded', 'my_connection_types' );

    を作成しました。そこで、

    カスタム投稿→ wheel
    カスタムタクソノミー→ bland
    ターム→hoge1,hoge2,hoge3

    ※表示方法

    hoge1
    ・記事
    ・記事

    hoge2
    ・記事
    ・記事

    hoge3
    ・記事
    ・記事

    という風に表示したいと思います。

    以下のようですと関連付けた記事がただ一覧として表示されてしまいますので
    foreachを使ってループするのかなと漠然と思っているのですが
    関連しそうな英語圏のサイトなどググって見たのですが
    記述方法をどうして良いのかわかりません。
    ご助力お願い致します。

    <?php
    // Find connected weeks
    $connected = new WP_Query( array(
    'connected_type' => 'wheel_to_car', // the name of your connection type
    'connected_items' => get_queried_object(),
    'nopaging' => true,
    ) );
    // Display connected weeks
    if ( $connected->have_posts() ) : ?>  
    
    <?php while ( $connected->have_posts() ) : $connected->the_post(); ?>
    
    <h3>
    <?php
    if ($terms = get_the_terms($post->ID, 'bland')) {
        foreach ( $terms as $term ) {
            echo esc_html($term->name)  ;
        }
    }
    ?>
    <?php $title= mb_substr($post->post_title,0,12); echo $title . '...';?>
    </h3>
    
    <?php endwhile; ?>
    <?php
    // Prevent weirdness
    wp_reset_postdata();
    endif;
    ?>

    乱文失礼いたします。もし情報が足りなければすぐに足しますので
    ご指摘お願い致します。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • mocomoco

    (@silent_dandy)

    ご質問の条件をテストサイトに再現し、p2pテーブルを覗いてみましたが、
    posts 2 postsが単純に記事に対して記事を関連づけるという機能なため、タクソノミーやターム関連のまとめ表示は想定されていないようですね。

    少し回りくどい方法かもしれませんが、ご希望の出力を行うコードを書いてみました。

    関連記事一覧をID配列として取得し、そのID配列が所属する’bland’ termsを取得、
    termsをforeachでそれぞれのtermについて属する記事を取得し直し出力するという流れです。

    あまり良い例ではないかもしれませんが、ご参考までに。

    <?php
    // Find connected weeks
    $connected = new WP_Query( array(
    'connected_type' => 'wheel_to_car', // the name of your connection type
    'connected_items' => get_queried_object(),
    'nopaging' => true,
    ) );
    $my_post_ids = wp_list_pluck($connected->posts,'ID'); //ID配列を取得
    
    //取得したID配列が所属するblandタームを取得
    $terms = wp_get_object_terms( $my_post_ids, 'bland', array( 'orderby' => 'name', 'order' => 'ASC', 'fields' => 'all' ));
        foreach ( $terms as $term ) : //タームそれぞれについての処理
    		echo esc_html($term->name); //ターム名出力
    		$connected = new WP_Query( array(
    		'connected_type' => 'wheel_to_car', // the name of your connection type
    		'connected_items' => get_queried_object(),
    		'nopaging' => true,
    			'tax_query'=> array(
    				array(
    					'taxonomy' => 'bland',
    					'field' => 'slug',
    					'terms' => array($term->slug)
    				)
    			)
    		) ); //タームに属する記事を取得
    
    		if ($connected->have_posts()) :
    			while ( $connected->have_posts() ) : $connected->the_post(); ?>
    	<?php $title= mb_substr($post->post_title,0,12); echo $title . '...';?>
    	<?php
    			endwhile;
    		endif;
    		wp_reset_postdata();
    	endforeach;
    ?>
    トピック投稿者 mattwo

    (@mattwo)

    mocomocoさま

    ありがとうございます!
    考えていた通りに出力されました!!

    posts 2 postsは相互で関連付けられるので便利なプラグインですが
    まとめ表示がなかなか難しいようなのですね。

    自分がもっとPHPが分かれば上記のように出力できる事がわかったので
    もっと勉強したいと思います。

    ありがとうございました!!

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「posts 2 posts を使用して関連付けた記事をターム毎に表示したい」には新たに返信することはできません。