web-dev-qa-db-ja.com

Wordpressプラグインを使用するにはどうすればよいですか2投稿Scribu

私は関係にかなり強く依存しているWordpressのサイトを持っています。これはレコードレーベルのウェブサイトで、アーティストはツアー、レビュー、アルバムのリリース、そしてサイト全体のストアアイテムに関連付けることができます。

私はプラグイン ScribuによるPosts to Posts を見つけました。 Scribuはサンプルコードを投稿しましたが、どういうわけか私はそれを理解することができません。

これは私が取り組んでいるサイトでやりたいことの例です。

ツアーページ。

ツアーアイテムには、タイトルと「ticket_link」というカスタムメタフィールドがあります。

ツアーページをロードすると、すべてのツアーは割り当てられたアーティストと一緒に表示され、チケットリンクがある場合はそれも表示されます。

Scribuのサイトに掲載されているプラ​​グインのコードを理解して私に説明してくれる人がいたら幸いです。


これは、接続を登録しているfunctions.phpファイルからの私のコードです:

    function my_connection_types() {
    if ( !function_exists('p2p_register_connection_type') )
        return;

    p2p_register_connection_type( 'tours', 'artists' );
    p2p_register_connection_type( 'homepage_carousel', 'artists' );
    p2p_register_connection_type( 'duka', 'artists' );
    p2p_register_connection_type( 'products_carousel', 'artists' );
}
  add_action('init', 'my_connection_types', 100);

自分のコードで何をしたいのかを示す擬似コード:

  • すべてのツアーをサイトに追加するループを使用して、私のツアーのカスタム投稿アーカイブ内のすべてのツアーを取得します。
  • 各ツアーはアーティストに関連しているため、特定のアーティストのすべてのツアーを表示します。
  • 項目は見出し(アーティスト名)の形式であり、各項目は、接続の登録の結果として表示されるメタボックスを使用してバックエンド内の特定のアーティストに関連付けられているツアーです。

私が使用しているコードとprint_r値と共にさらに更新します。

関連するアーティストが私のクエリのprint_rの内容に表示されていました。 print_rを実行すると、次のように表示されますが、データにアクセスする方法はありません。

[connected_connected] => Array ( [0] => stdClass Object ( [ID] => 245 [post_author] => 1 [post_date] => 2011-03-10 13:55:23 [post_date_gmt] => 2011-03-10 13:55:23 [post_content] => [post_title] => 1200 Techniques [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => 1200-techniques [to_ping] => [pinged] => [post_modified] => 2011-03-10 13:55:23 [post_modified_gmt] => 2011-03-10 13:55:23 [post_content_filtered] => [post_parent] => 0 [guid] => http://localhost/testdev/?post_type=artists&p=245 [menu_order] => 0 [post_type] => artists [post_mime_type] => [comment_count] => 0 [p2p_id] => 2 [p2p_from] => 215 [p2p_to] => 245

アーティストとツアーを関連付けるために使用しているコードは次のとおりです。

$connected = new WP_Query(array(
    'post_type' => 'tours',
    'nopaging' => true,
    'each_connected' => array(
        'post_type' => 'artists',
        'nopaging'  => true,
    ),
    'suppress_filters' => false
));

while( $connected->have_posts() ): $connected->the_post();
    the_title();
    echo "<br />";
endwhile;   

print_r($connected); // Print_r for showing contents of post object.

Scribu用に更新:

$args = array
(
    'post_type'        => 'tours',
    'nopaging'         => true,
    'suppress_filters' => false
);

$connected = new WP_Query($args);

while($connected->have_posts()): $connected->the_post();

    the_title();
    echo "<br />";

    foreach ($connected->connected AS $tour_item)
    {
        echo get_the_title($tour_item->ID);
        echo "<br />";
    }

endwhile;
5

わかりました、ツアーを表示する外側のループがあるということです。

そして、各アーティストを表示する内側のループがあります。

The Loopのしくみは、$postなどの多くのグローバル変数を設定することです。そのため、魔法のように見えます。

より均一なアプローチを見てみましょう。

$tours = get_posts( array(
    'post_type' => 'tours',
    'nopaging' => true,
    'each_connected_to' => array(
        'post_type' => 'artists',
        'nopaging' => true,
    ),
    'suppress_filters' => false
) );

// outer loop
foreach ( $tours as $tour ) {
    echo get_the_title( $tour->ID );
    echo get_post_meta( $tour->ID, 'ticket_link', true );

    // inner loop
    foreach ( $tour->connected_to as $artist ) {
        echo get_the_title( $artist->ID );
        echo '<br/>';
    }
}

更新:この答えは時代遅れです。現在の例については、 https://github.com/scribu/wp-posts-to-posts/wiki/Looping-The-Loop を参照してください。

4
scribu