Come Utilizzare Il Plugin Wordpress Posts 2 Posts di Scribu?

13 mar 2011, 07:19:37
Visualizzazioni: 3.97K
Voti: 5

Ho un sito Wordpress che si basa pesantemente sulle relazioni. È un sito di un'etichetta discografica dove gli artisti possono essere collegati a tour, recensioni, uscite di album e articoli del negozio in tutto il sito.

Ho trovato il plugin Posts to Posts di Scribu che sembra fare quello che voglio, ma non capisco come usarlo correttamente. Scribu ha pubblicato del codice di esempio, ma per qualche motivo non riesco a capirlo.

Ecco un esempio di quello che voglio fare con il sito su cui sto lavorando.

Pagina dei Tour.

Un elemento tour ha un titolo e un campo meta personalizzato chiamato 'tickets_link'

Al caricamento della pagina dei tour, tutti i tour verranno mostrati con l'artista assegnato e, se presente, anche il link per i biglietti.

Se qualcuno qui può capire il codice pubblicato sul sito di Scribu per il plugin e poi spiegarmelo, ne sarei grato.


Ecco il mio codice dal file functions.php che registra le connessioni:

    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);

Pseudocodice per mostrare cosa voglio fare nel mio codice:

  • Recupera tutti i tour nell'archivio dei post personalizzati dei tour utilizzando un ciclo che ottiene tutti i tour aggiunti al sito.
  • Ogni tour è correlato a un artista, quindi mostra tutti i tour per un artista specifico.
  • Gli elementi sono sotto forma di un'intestazione (nome dell'artista) e ogni elemento è un tour che è stato correlato a un artista specifico nel backend utilizzando la metabox che viene visualizzata come risultato della registrazione di una connessione.

Aggiornamento con ulteriori dettagli e codice che sto utilizzando con i valori di print_r.

Ho gli artisti correlati che compaiono nei contenuti print_r della mia query, dove prima non c'erano. Quando faccio un print_r ottengo quanto segue che viene mostrato, ma nessun modo per accedere ai dati.

[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

Il codice che sto utilizzando per collegare gli artisti con i tour è il seguente:

$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 per mostrare i contenuti dell'oggetto post.

Aggiornamento per 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;
0
Tutte le risposte alla domanda 1
6

Ok, quindi l'idea è che hai un ciclo esterno che mostra i tour.

E poi hai un ciclo interno che mostra ogni artista.

Il modo in cui funziona The Loop è che popola molte variabili globali, come $post, quindi sembra magia.

Diamo un'occhiata a un approccio più uniforme:

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

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

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

Aggiornamento: Questa risposta è obsoleta; per un esempio attuale, vedere https://github.com/scribu/wp-posts-to-posts/wiki/Looping-The-Loop

13 mar 2011 09:19:28
Commenti

È perfetto Scribu, ma non lo sto utilizzando sui singoli elementi del tour perché non ci saranno singoli elementi del tour. Fondamentalmente sto usando un archivio di post personalizzato, il tuo plugin è in grado di funzionare con archivi di post personalizzati? Il mio dilemma sembra essere che non ho un ID per interrogare i post correlati. Posso fare una query che mi permetta di estrarre tutti i tour e i loro artisti associati?

Dwayne Charrington Dwayne Charrington
13 mar 2011 09:35:01

Ho aggiunto il codice che sto usando nel mio file functions.php nel caso abbia sbagliato qualcosa anche lì.

Dwayne Charrington Dwayne Charrington
13 mar 2011 09:47:34

Scusa se sembro un po' lento, ma ancora non sembra funzionare per me. Da dove viene $post? Dovrei popolarlo con qualcosa o è il plugin che dovrebbe farlo? Vedi la mia domanda per l'ultimo codice che sto provando. Apprezzo il tuo aiuto Scribu.

Dwayne Charrington Dwayne Charrington
13 mar 2011 11:51:09

Ho dimenticato di menzionare che ricevo l'errore "Warning: Invalid argument supplied for foreach()" quando provo a usare il ciclo foreach con $post->connected.

Dwayne Charrington Dwayne Charrington
13 mar 2011 11:53:27

Sì, è un bug (corretto nella versione di sviluppo). Puoi aggirarlo usando 'each_connected_to' e poi verificando la proprietà $post->connected_to. Vedi di nuovo la risposta.

scribu scribu
13 mar 2011 12:14:10

Grazie mille Scribu. Ho risolto tutto, apprezzo il tuo tempo e lo sforzo dedicato a questo.

Dwayne Charrington Dwayne Charrington
13 mar 2011 14:09:40
Mostra i restanti 1 commenti