Cómo usar el plugin Posts 2 Posts de Scribu en WordPress
Tengo un sitio WordPress que depende en gran medida de relaciones. Es un sitio web de una discográfica donde los artistas pueden estar relacionados con giras, reseñas, lanzamientos de álbumes y productos de la tienda en todo el sitio.
Encontré el plugin Posts to Posts de Scribu que parece hacer lo que necesito, pero no entiendo cómo usarlo correctamente. Scribu ha publicado código de ejemplo, pero por alguna razón no logro comprenderlo.
Aquí hay un ejemplo de lo que quiero hacer con el sitio en el que estoy trabajando.
Página de Giras.
Un elemento de gira tiene un título y un campo meta personalizado llamado 'tickets_link'.
Al cargar la página de giras, se mostrarán todas las giras con su artista asignado y, si tiene un enlace de boletos, también se mostrará ese.
Si alguien aquí puede entender el código publicado en el sitio de Scribu para el plugin y luego explicármelo, se lo agradecería mucho.
Aquí está mi código del archivo functions.php registrando las conexiones:
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);
Pseudocódigo para mostrar lo que quiero hacer en mi código:
- Obtener todas las giras en mi archivo de posts personalizados de giras usando un bucle que obtenga todas las giras agregadas al sitio.
- Cada gira está relacionada con un artista, así que muestra todas las giras para un artista en particular.
- Los elementos están en forma de un encabezado (nombre del artista) y cada elemento es una gira que se ha relacionado con un artista en particular en el backend usando el metabox que aparece como resultado de registrar una conexión.
Actualización adicional junto con el código que estoy usando y valores de print_r.
Tengo los artistas relacionados apareciendo en los contenidos print_r de mi consulta donde antes no aparecían. Cuando hago un print_r obtengo lo siguiente que aparece, pero no hay forma de acceder a los datos.
[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
El código que estoy usando para relacionar artistas con giras es el siguiente:
$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 para mostrar contenidos del objeto post.
Actualización para 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;

Está bien, la idea es que tengas un bucle externo que muestre los tours.
Y luego tienes un bucle interno que muestra cada artista.
La forma en que funciona The Loop es que llena muchas variables globales, como $post
, por lo que parece magia.
Veamos un enfoque más uniforme:
$tours = get_posts( array(
'post_type' => 'tours',
'nopaging' => true,
'each_connected_to' => array(
'post_type' => 'artists',
'nopaging' => true,
),
'suppress_filters' => false
) );
// bucle externo
foreach ( $tours as $tour ) {
echo get_the_title( $tour->ID );
echo get_post_meta( $tour->ID, 'ticket_link', true );
// bucle interno
foreach ( $tour->connected_to as $artist ) {
echo get_the_title( $artist->ID );
echo '<br/>';
}
}
Actualización: Esta respuesta está obsoleta; para un ejemplo actual, consulta https://github.com/scribu/wp-posts-to-posts/wiki/Looping-The-Loop

Eso es perfecto Scribu, pero no lo estoy usando en elementos individuales de tours ya que no habrá elementos individuales de tours. Básicamente estoy usando un archivo de publicaciones personalizado, ¿tu plugin es capaz de trabajar con archivos de publicaciones personalizados? Mi dilema parece ser que no tengo un ID para consultar publicaciones relacionadas. ¿Puedo hacer una consulta que me permita extraer todos los tours y sus artistas asociados?

He agregado el código que estoy usando en mi archivo functions.php por si acaso también cometí algún error allí.

Disculpa si parezco un poco lento, pero todavía no parece funcionar para mí. ¿De dónde viene $post? ¿Se supone que debo llenarlo con algo o el plugin debería hacerlo? Mira mi pregunta para ver el último código que estoy intentando. Aprecio tu ayuda Scribu.

Olvidé mencionar que estoy recibiendo el error "Warning: Invalid argument supplied for foreach()" cuando intento usar el bucle foreach $post->connected.

Sí, eso es un error (corregido en la versión de desarrollo). Puedes solucionarlo usando 'each_connected_to' y luego verificando la propiedad $post->connected_to
. Mira la respuesta nuevamente.
