私は関係にかなり強く依存している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;
わかりました、ツアーを表示する外側のループがあるということです。
そして、各アーティストを表示する内側のループがあります。
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 を参照してください。