Cum să utilizez plugin-ul WordPress Posts 2 Posts de la Scribu?
Am un site WordPress care se bazează foarte mult pe relații. Este un site de casă de discuri unde artiștii pot fi asociați cu turnee, recenzii, lansări de albume și produse din magazin pe tot site-ul.
Am găsit plugin-ul Posts to Posts de la Scribu care pare să facă ceea ce doresc, dar nu înțeleg cum să-l folosesc corect. Scribu a postat cod exemplu, dar din anumite motive nu reușesc să-l înțeleg.
Iată un exemplu de ceea ce vreau să fac pe site-ul la care lucrez.
Pagina de Turnee.
Un element de turneu are un titlu și un câmp meta personalizat numit 'tickets_link'
La încărcarea paginii de turnee, toate turneele vor fi afișate cu artistul asignat și dacă are un link pentru bilete, acesta va fi afișat de asemenea.
Dacă cineva poate înțelege codul postat pe site-ul lui Scribu pentru acest plugin și apoi să mi-l explice, aș fi foarte recunoscător.
Iată codul meu din fișierul functions.php care înregistrează conexiunile:
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);
Cod pseudo pentru a arăta ce vreau să fac în codul meu:
- Preia toate turneele din arhiva mea de postări personalizate pentru turnee folosind o buclă care obține toate turneele adăugate pe site.
- Fiecare turneu este legat de un artist, așa că afișează toate turneele pentru un anumit artist.
- Elementele sunt sub forma unui titlu (numele artistului) și fiecare element este un turneu care a fost asociat cu un anumit artist în backend folosind cutia meta care apare ca rezultat al înregistrării unei conexiuni.
Actualizare suplimentară împreună cu codul pe care îl folosesc și valorile print_r.
Am artiștii asociați care apar în conținutul print_r al interogării mele, unde înainte nu apăreau. Când fac un print_r obțin următoarele care apar, dar nu am nicio modalitate de a accesa datele.
[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
Codul pe care îl folosesc pentru a asocia artiștii cu turneele este următorul:
$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 pentru afișarea conținutului obiectului post.
Actualizare pentru 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;

Bun, ideea este că ai o buclă exterioară care afișează turneele.
Și apoi ai o buclă interioară care afișează fiecare artist.
Modul în care funcționează The Loop este că populizează multe variabile globale, cum ar fi $post
, așa că pare magie.
Să ne uităm la o abordare mai uniformă:
$tours = get_posts( array(
'post_type' => 'tours',
'nopaging' => true,
'each_connected_to' => array(
'post_type' => 'artists',
'nopaging' => true,
),
'suppress_filters' => false
) );
// bucla exterioară
foreach ( $tours as $tour ) {
echo get_the_title( $tour->ID );
echo get_post_meta( $tour->ID, 'ticket_link', true );
// bucla interioară
foreach ( $tour->connected_to as $artist ) {
echo get_the_title( $artist->ID );
echo '<br/>';
}
}
Actualizare: Acest răspuns este învechit; pentru un exemplu actual, vezi https://github.com/scribu/wp-posts-to-posts/wiki/Looping-The-Loop

Este perfect Scribu, dar nu îl folosesc pe elemente individuale de turneu, deoarece nu vor exista astfel de elemente individuale. Practic, folosesc o arhivă personalizată de postări, este capabil pluginul tău să funcționeze cu arhive personalizate de postări? Dilema mea pare să fie că nu am un ID pentru a interoga postări înrudite. Pot face o interogare care să îmi permită să extrag toate turneele și artistul asociat fiecăruia?

Am adăugat codul pe care îl folosesc în fișierul meu functions.php, pentru orice eventualitate în cazul în cui am greșit ceva și acolo.

Scuze dacă par cam încet, dar încă nu pare să funcționeze pentru mine. De unde provine $post? Trebuie să completez eu asta cu ceva sau ar trebui să facă asta pluginul? Vezi întrebarea mea pentru ultimul cod pe care încerc să-l folosesc. Apreciez ajutorul tău, Scribu.

Am uitat să menționez că primesc eroarea "Warning: Invalid argument supplied for foreach()" când încerc să folosesc bucla foreach cu $post->connected.

Da, este o eroare (corectată în versiunea de dezvoltare). Poți rezolva temporar folosind 'each_connected_to' și apoi verificând proprietatea $post->connected_to
. Vezi răspunsul din nou.
