[Plugin: Posts 2 Posts] How to call two post types connected in one query?
-
First, this plugin is fantastic! Second, the problem. In my project there are two post types connected:
postandwriters. At home there are nested loops with last 10 posts, each post with its writer. But I wonder if there are too many queries to DB.`while (have_posts()) : the_post();
the_title();$the_query = new WP_Query( array(
‘post_type’ => ‘writer’,
‘connected’ => $post->ID, ) );
while ($the_query->have_posts()) : $the_query->the_post();
the_title();
endwhile;endwhile;`
Is it posible to create only one WP_Query object with last 10 posts with its writers connected for only one loop?
I hope I make myself clear. Thanks!
-
How about something like this:
$query = new WP_Query( array( 'post_type' => 'post', 'each_connected_to' => array( 'post_type' => 'writer', 'orderby' => 'title', 'order' => 'asc' ), 'each_connected_meta' => array() // optional ) ); while ( $query->have_posts() ) : $query->the_post(); the_title(); foreach ( $post->connected_to as $p2p_id => $writer ) { echo $writer->post_title; } endwhile;As you can see, each $post has a
connected_toproperty, which is an array of connected posts.Note that this is not implemented yet; I’m just brainstorming.
It would be very usefull! Do you think you could develope it soon?
Try the development version (0.6-alpha).
So you have
'each_connected','each_connected_to'and'each_connected_from', with matching$post->connected,$post->connected_toand$post->connected_from.Also, you can nest it as many levels as you want:
$posts = get_posts( array( 'post_type' => 'post', 'nopaging' => true, 'each_connected' => array( 'post_type' => 'writer', 'nopaging' => true, 'each_connected' => array( 'post_type' => 'genre', 'nopaging' => true, ), ), 'suppress_filters' => false ) ); echo "<pre>"; foreach ( $posts as $post ) { echo $post->post_title . "\n"; foreach ( $post->connected as $writer ) { echo $writer->post_title . "\n"; foreach ( $writer->connected as $genre ) { echo $genre->post_title . "\n"; } } } echo "</pre>";// 1. WITH get_posts
$posts = get_posts( array(
‘post_type’ => ‘post’,
‘nopaging’ => true,
‘orderby’ => ‘ID’,
‘each_connected’ => array(
‘post_type’ => ‘writer’,
‘nopaging’ => true,
),
‘suppress_filters’ => false
) );echo “
"; foreach ( $posts as $post ) { echo $post->post_title . "\n"; foreach ( $post->connected as $writer ) { echo $writer->post_title . "\n"; } } echo "“;
Sorry, my last message was an error.
Hi Scribu! I tried with
get_post()and it works fine:// 1. WITH get_posts $posts = get_posts( array( 'post_type' => 'post', 'nopaging' => true, 'orderby' => 'ID', 'each_connected' => array( 'post_type' => 'writer', 'nopaging' => true, ), 'suppress_filters' => false ) ); echo ""; foreach ( $posts as $post ) { echo $post->post_title . "\n"; foreach ( $post->connected as $writer ) { echo $writer->post_title . "\n"; } } echo "";
But when I tried with WP_Query some writers didn’t appeared:
// 2. WITH WP_Query $query = new WP_Query( array( 'post_type' => 'post', 'orderby' => 'ID', 'order' => 'ASC', 'each_connected' => array( 'post_type' => 'writer', 'order' => 'asc' ), ) ); while ( $query->have_posts() ) : $query->the_post(); the_title(); foreach ( $post->connected as $p2p_id => $writer ) { echo $writer->post_title; } echo "<hr/>"; endwhile;I don´t understand what happens in my code.
When you’re using WP_Query, you forgot to set
'nopaging' => trueinside ‘each_connected’.Excellent! Your plugin is fantastic and very usefull!
Hi scribu! I am using your 0.6 alpha version. It have been doing well until I tried to filter writters by category. Some writters do not appear and some do (without logic). I do not understand what happens…
$query = new WP_Query( array( 'post_type' => 'post', 'nopaging' => true, 'orderby' => 'title', 'order' => 'ASC', 'each_connected' => array( 'post_type' => 'writter', 'nopaging' => true, 'cat' => '3', ), ) );What do think that it could be happen?
Does it work properly if you just do the inner query? How about if you also add a ‘connected’ query var to the inner query?
Sorry scribu! I do not know where I should put the ‘connected’ query var… I tried but it gave me an error message:
$query = new WP_Query( array( 'post_type' => 'post', 'nopaging' => true, 'orderby' => 'title', 'order' => 'ASC', 'connected' => 'any', 'each_connected' => array( 'post_type' => 'writter', 'nopaging' => true, 'cat' => '3', ), ) );I mean like this:
$query = new WP_Query( array( 'post_type' => 'writter', 'nopaging' => true, 'cat' => '3', ) );then, like this:
$query = new WP_Query( array( 'connected' => $some_post_id, 'post_type' => 'writter', 'nopaging' => true, 'cat' => '3', ) );Hi Scribu,
I’m having a similar problem, and I’m going nuts here. This should be pretty simple but can’t get it to work.
I have this setup in my functions.php
function my_connection_types() { if ( !function_exists( 'p2p_register_connection_type' ) ) return; p2p_register_connection_type( array( 'from' => 'promocion', 'to' => 'post' ) ); } add_action( 'init', 'my_connection_types', 100 );And now I’m trying to get promotions connected to posts that are archived under category ‘4’ for example.
$promotions = get_posts( array( 'post_type' => 'promotion', 'nopaging' => true, 'orderby' => 'ID', 'each_connected' => array( 'post_type' => 'post', 'nopaging' => true, 'cat' => '4' ), 'suppress_filters' => false ) );Is this possible? Thanks in advance
Anyone? I really need to sort this out ASAP. Or at least any idea how to workaround this?
It doesn’t work like that.
What you’re getting are promotions. Then, for each promotion, you’re getting the posts connected to that promotion, which belong in category 4.
You should probably be doing it the other way around: Get the posts in category 4 and then get the promotions connected to those posts.
It’s easier to understand if you don’t use each_connected at first, but foreach loops.
The topic ‘[Plugin: Posts 2 Posts] How to call two post types connected in one query?’ is closed to new replies.