Ottenere una lista di post personalizzati per autore

22 lug 2013, 23:38:12
Visualizzazioni: 20.7K
Voti: 5

Sto cercando di creare una pagina dove un utente possa visualizzare tutti i tipi di post personalizzati dopo aver cliccato su un autore da una pagina precedente, ma non riesco a trovare nulla di utile tra le funzioni PHP integrate in WordPress.

Esiste un modo semplice per eseguire questa query? Non ho trovato molto online a riguardo.

2
Commenti

È un tipo di post specifico o intendi "qualsiasi cosa che non sia un tipo di post core di WordPress"?

Pat J Pat J
22 lug 2013 23:45:40

È solo uno specifico custom post type.

m0ngr31 m0ngr31
22 lug 2013 23:48:33
Tutte le risposte alla domanda 2
10

Qualcosa come questo dovrebbe funzionare:

// Assumendo che tu abbia $author_id impostato
// e che il tuo post type si chiami 'your_post_type'
$args = array(
    'author' => $author_id,
    'post_type' => 'your_post_type',
);
$author_posts = new WP_Query( $args );
if( $author_posts->have_posts() ) {
    while( $author_posts->have_posts() ) { 
        $author_posts->the_post();
        // titolo, contenuto, ecc.
        $author_posts->the_title();
        $author_posts->the_content();
        // avrai accesso a tutti i tag che normalmente
        // puoi usare nel Loop
    }
    wp_reset_postdata();
}

Riferimento

WP_Query class

Utilizzo di un file Template per l'Autore

Puoi farlo all'interno di un Template per Autore:

author.php-- questo file deve trovarsi nella directory del tuo tema

<?php get_header(); ?>

<div id="content" class="narrowcolumn">

<!-- Questo imposta la variabile $curauth -->

<?php
    $curauth = (isset($_GET['author_name'])) ? 
        get_user_by('slug', $author_name) : 
        get_userdata(intval($author));
?>

<h2>Informazioni su: <?php echo $curauth->nickname; ?></h2>
<dl>
    <dt>Sito Web</dt>
    <dd><a href="<?php echo $curauth->user_url; ?>"><?php echo $curauth->user_url; ?></a></dd>
    <dt>Profilo</dt>
    <dd><?php echo $curauth->user_description; ?></dd>
</dl>

<h2>Post di <?php echo $curauth->nickname; ?>:</h2>

<ul>
<!-- The Loop -->
<?php

// Assumendo che il tuo post type si chiami 'your_post_type'
$args = array(
    'author' => $curauth->ID,
    'post_type' => 'your_post_type',
);
$author_posts = new WP_Query( $args );
if( $author_posts->have_posts() ) {
    while( $author_posts->have_posts() ) {
        $author_posts->the_post();
        // titolo, contenuto, ecc.
        the_title();
        the_content();
        // avrai accesso a tutti i tag che normalmente
        // puoi usare nel Loop
    }
    wp_reset_postdata();
}
?>

<!-- Fine Loop -->

</ul>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Questo codice del template author.php è preso senza vergogna dal Codex, e dovrebbe essere considerato un punto di partenza, non un prodotto finito.

22 lug 2013 23:59:38
Commenti

So che riceverò qualche critica per questo.. ma sto cercando di farlo con "Allow PHP in Post and Pages" e sembra avere un problema con l'istruzione if. Non riesco a capire perché, ma smette semplicemente di fare qualsiasi cosa non appena arriva a quel punto.

m0ngr31 m0ngr31
23 lug 2013 00:26:36

Il codice che ho postato è pensato per essere aggiunto al tuo file functions.php o a un plugin. Non ho esperienza con il plugin Allow PHP in Posts and Pages (?).

Pat J Pat J
23 lug 2013 00:34:36

Come dovrei aggiungerlo al functions.php? Non sono un esperto di PHP. Immagino di doverlo inserire in una funzione, ma non sono sicuro di come fare la parte add_action o come chiamarlo da una pagina.

m0ngr31 m0ngr31
23 lug 2013 00:48:56

Ho aggiornato la mia risposta.

Pat J Pat J
23 lug 2013 01:55:07

Ciao, risposta tardiva, ma sto provando il tuo metodo per i post di un utente in un CPT (eventi), purtroppo ottengo un errore 500 del server sulla pagina di un utente che ha effettivamente pubblicato qualcosa - gli utenti senza post (cioè query vuota) funzionano bene. Puoi dare un'occhiata? Vedi un incolla del mio file template dell'autore (ignora la parte con i campi personalizzati :) ) qui: http://pastebin.com/NLNSYC0c. Grazie fin da ora!

physalis physalis
19 set 2014 15:27:32

Aggiornamento: ho risolto, con la mia limitata conoscenza di PHP. In realtà devi sostituire $author_posts->the_title(); con il classico get_the_title() ecc., e funziona perfettamente (vedi http://pastebin.com/1FHFGFQs). Grazie comunque per avermi indirizzato nella giusta direzione (forse potresti aggiornare la tua soluzione sopra).

physalis physalis
19 set 2014 15:51:20

Ho aggiornato il codice. Se get_the_title() funziona, allora anche the_title() e the_content() dovrebbero funzionare. (A quanto pare sto facendo qualcosa di molto simile in un sito che ho configurato qualche tempo fa.)

Pat J Pat J
19 set 2014 16:08:14

La prima parte funziona benissimo. Ho semplicemente usato get_the_author_meta('ID'); per impostare $author_id.

Jordan Jordan
23 dic 2016 21:30:53

Hai dimenticato la parentesi di chiusura nell'istruzione while:

while( $author_posts->have_posts()) {

Jason Glisson Jason Glisson
11 lug 2020 06:44:22

L'ho fatto. Ottimo occhio. Ora l'ho sistemato.

Pat J Pat J
11 lug 2020 23:46:44
Mostra i restanti 5 commenti
2

Utilizza pre_get_posts per aggiungere il tuo custom post type al template author.php

Nel tuo functions.php, aggiungi il seguente codice. Questo aggiungerà il tuo custom post type alla query principale in modo che appaia nella pagina dell'autore

function wpse107459_add_cpt_author( $query ) {
    if ( !is_admin() && $query->is_author() && $query->is_main_query() ) {
        $query->set( 'post_type', array('post', 'YOUR_CUSTOM_POST_TYPE' ) );
    }
}
add_action( 'pre_get_posts', 'wpse107459_add_cpt_author' );

Con questo, non c'è bisogno di apportare modifiche ai tuoi file template :-)

19 set 2014 16:18:20
Commenti

Ciao @PieterGoosen Questo è quasi perfetto per quello che mi serve, ma vorrei mostrare solo il CPT. Nella riga $query->set potrei semplicemente rimuovere 'post', ma questo causerà problemi sul blog principale. Sai come potrei impostarlo in modo che il codice si applichi solo ai custom post type? In pseudo codice sarebbe: if (post-type('cpt-name') { // esegui il codice } ma non sembro trovare una soluzione.

pjk_ok pjk_ok
11 gen 2018 22:53:54

Grazie per questo. Ho appena risolto il mio problema dopo aver provato 10 metodi diversi.

Abdul Sadik Yalcin Abdul Sadik Yalcin
7 nov 2018 17:54:40