Visualizzare pagine specifiche con WP_Query() in WordPress

28 dic 2013, 00:08:56
Visualizzazioni: 16.1K
Voti: 4

Voglio visualizzare le pagine 'famous' e 'mschief'.

Utilizzando questo codice, WP_query() non restituisce alcun risultato:

$args = array(
'post_type' => 'page',
'pagename' => 'famous,mschief',  // Parametro errato per multiple pagine
'posts_per_page' => 3
);

Questo codice restituisce una delle 2 pagine:

$args = array(
'post_type' => 'page',
'pagename=famous,mschief',  // Sintassi errata per array
);

E questo codice restituisce correttamente entrambe le pagine:

$args = array(
'post_type' => 'page',
'pagename=famous,mschief',  // Funziona ma sintassi non standard
'posts_per_page' => 3
);

Perché il primo pezzo di codice (l'unico corretto secondo me) non funziona? E perché gli altri due producono questi risultati?

2
Commenti

Sto avendo difficoltà a capire perché qualcuno di questi dovrebbe funzionare. C'è un grave errore di sintassi nel primo e gli altri due non corrispondono a nessuno schema valido che io conosca. Interessante...

s_ha_dum s_ha_dum
28 dic 2013 00:28:29

Scusa, il primo l'ho cambiato molte volte e ho incollato l'ultima versione, ma anche con la sintassi corretta non restituisce nulla.

drake035 drake035
28 dic 2013 00:30:21
Tutte le risposte alla domanda 6
2

Se osservi l'oggetto della query dopo che queste query sono eseguite, vedrai che nessuno di questi esempi sta facendo ciò che pensi. Il primo problema è che non puoi mescolare parametri nella stringa della query e parametri in array, e il secondo problema è che pagename può essere utilizzato solo per caricare una singola pagina.

In questo esempio, manca una virgoletta di chiusura dopo pagename. Supponendo che sia un errore di battitura, il problema è quello menzionato sopra - sta cercando una singola pagina con slug famousmschief

$args = array(
'post_type' => 'page',
'pagename => 'famous,mschief',
'posts_per_page' => 3
);

In questo esempio, pagename viene ignorato e sta semplicemente interrogando la pagina più recente utilizzando il valore predefinito di post per pagina, che sembra essere 1.

$args = array(
'post_type' => 'page',
'pagename=famous,mschief',
);

In questo esempio, stesso problema del precedente, ma stai caricando più pagine, quindi sta semplicemente caricando le tre pagine più recenti:

$args = array(
'post_type' => 'page',
'pagename=famous,mschief',
'posts_per_page' => 3
);

Se vuoi interrogare più pagine, utilizza l'argomento post__in e gli ID delle pagine:

$args = array(
    'post_type' => 'page',
    'post__in' => array( 23,42 )
);
28 dic 2013 00:29:43
Commenti

Quindi non esiste un modo diretto per selezionare più pagine utilizzando gli slug? È davvero un peccato!

drake035 drake035
28 dic 2013 00:43:27

@drake035: Selezionare una pagina tramite slug attiva query aggiuntive. Vedi questo e questo quindi non mi sorprende che non sia facile passare una lista. E, in realtà, dovresti evitare di usare quel parametro se puoi.

s_ha_dum s_ha_dum
28 dic 2013 01:40:49
0

L'attributo post_name__in

A partire da WordPress 4.4 possiamo utilizzare l'attributo post_name__in della classe WP_Query. Vedi il ticket trac #33065.

Esempio:

$args = [
    'post_name__in'      => ['famous', 'mschief'],
    'post_type'          => 'page',
   'ignore_sticky_posts' => 1,
];
16 nov 2015 20:32:03
0

Per il primo, hai degli apici non corrispondenti nella terza riga. Quello che sembra tu volessi fare era:

'pagename' => 'famous,mschief',
28 dic 2013 00:28:49
0

Puoi scrivere la tua funzione, utilizzando un posts_where filter

function page_names_query( $n = array() ) {
  static $pages;
  if ( is_null($pages) && ! empty($n) && is_array($n) ) {
    $pages = array_filter( array_map('sanitize_title', $n) );
    if ( ! empty($pages) ) {
      // usando questa funzione stessa per filtrare la query successiva
      add_filter('posts_where', __FUNCTION__, 999 ); 
      return new WP_Query('post_type=page'); // restituisce la query filtrata
    } else { // nessun nome di pagina valido passato
      $pages = NULL;
      return new WP_Query('p=-1'); // restituisce una WP_Query senza post
    }
  } elseif( current_filter() === 'posts_where' && ! empty($pages) && is_string($n) ) {
    $w = ' AND post_name IN (';
    global $wpdb;
    foreach ( $pages as $page ) { $w .= $wpdb->prepare('%s,', $page); }
    $pages = NULL; // resetta la variabile statica
    remove_filter('posts_where', __FUNCTION__, 999 ); // rimuove il filtro
    return $n . rtrim($w, ',') . ')';
  }
}

dopo di che puoi usarla così

$query =  page_names_query( array('famous','mschief') ); // restituisce una WP_Query

if ( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post();

// il tuo loop qui

endwhile; endif;
wp_reset_postdata();
28 dic 2013 01:44:09
0

La tua domanda necessita di chiarimenti. Immagino tu ti riferisca a 2 articoli piuttosto che a 2 pagine.

Puoi utilizzare questo codice PHP nel file functions.php del tuo child theme per visualizzare articoli specifici tramite i loro ID.

add_action( 'pre_get_posts', 'wpsites_display_specific_posts_home_page' );

function wpsites_display_specific_posts_home_page( $query ) {

if( $query->is_main_query() && $query->is_home() ) {

    $query->set( 'post__in', array( 007, 008 ) );

    }
}

Questo codice visualizzerà solo gli articoli con ID 007 e 008 nel loop della tua homepage. Se stai utilizzando una pagina statica come front page, questo codice funzionerà nella tua pagina degli articoli secondo le impostazioni di lettura.

L'uso degli ID è preferibile perché rimangono gli stessi anche quando modifichi lo slug.

28 dic 2013 09:17:49
0

aggiungi una categoria alla pagina con:

function wpc_cat_pages() {
    // Registra la tassonomia 'category' per il post type 'page'
    register_taxonomy_for_object_type('category', 'page');
}
// Esegui la funzione durante l'inizializzazione di WordPress
add_action('init', 'wpc_cat_pages');

e visualizzala con:

$args = array(
        'post_type' => 'page',          // Tipo di post: pagina
        'category' => 'categoria',     // Slug della categoria
        'posts_per_page' => 'numero_di_post' // Numero di post da mostrare
);
3 set 2018 11:48:23