web-dev-qa-db-fra.com

Affichage de plusieurs pages spécifiques à l'aide de WP_Query ()

Je souhaite afficher les pages "célèbre" et "mschief".

En utilisant ce code, WP_query () ne renvoie aucun résultat:

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

Ce code renvoie l'une des 2 pages:

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

Et ce code renvoie les 2 pages correctement:

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

Pourquoi le premier morceau de code (le seul correct pour moi) ne fonctionne-t-il pas? Et pourquoi les deux autres produisent ces résultats?

3
drake035

Si vous examinez l'objet de requête après avoir exécuté ces requêtes, vous verrez qu'aucun de ces exemples ne fait ce que vous pensez qu'ils font. Le premier problème est que vous ne pouvez pas mélanger les paramètres de chaîne de requête et de tableau, et le deuxième problème est que pagename ne peut être utilisé que pour charger une seule page.

Dans celui-ci, il vous manque un devis de clôture après pagename. En supposant qu'il s'agisse d'une faute de frappe, le problème est noté ci-dessus - il recherche une seule page avec slug famousmschief

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

Dans celui-ci, pagename est ignoré et il ne fait que rechercher la page la plus récente en utilisant la valeur par défaut des publications par page, qui semble être 1.

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

Dans celui-ci, le même problème que le dernier, mais vous chargez plus de pages, donc il ne fait que charger les trois pages les plus récentes:

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

Si vous souhaitez interroger plusieurs pages, utilisez l'argument post__in , ainsi que les ID de page:

$args = array(
    'post_type' => 'page',
    'post__in' => array( 23,42 )
);
4
Milo

L'attribut post_name__in

À partir de WordPress 4.4, nous pouvons utiliser l'attribut post_name__in de la classe WP_Query. Voir le billet de train # 33065 .

Exemple:

$args = [
    'post_name__in'      => ['famous', 'mschief'],
    'post_type'          => 'page',
   'ignore_sticky_posts' => 1,
];
3
birgire

Pour la première, vous avez des citations incompatibles sur la troisième ligne. Ce que vous avez essayé de faire, c'est:

'pagename' => 'famous,mschief',
0
hornj

Vous pouvez écrire votre propre fonction en utilisant un filtre posts_where

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) ) {
      // using this function itself to filter next query
      add_filter('posts_where', __FUNCTION__, 999 ); 
      return new WP_Query('post_type=page'); // return the filtered query
    } else { // no valid page names passed
      $pages = NULL;
      return new WP_Query('p=-1'); // return a WP_Query with no posts
    }
  } 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; // reset static variable
    remove_filter('posts_where', __FUNCTION__, 999 ); // remove filter
    return $n . rtrim($w, ',') . ')';
  }
}

après cela, vous pouvez l'utiliser comme si

$query =  page_names_query( array('famous','mschief') ); // return a WP_Query

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

// your loop here

endwhile; endif;
wp_reset_post_data();
0
gmazzap

Votre question nécessite des éclaircissements. Je suppose que vous faites référence à 2 messages plutôt que 2 pages.

Vous pouvez utiliser ce code PHP dans le fichier functions.php de votre thème enfants pour afficher les posts de post i.d's.

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

    }
}

Ce code n'affichera que les publications avec les lettres 007 et 008 de l'i.d dans la boucle de votre page d'accueil. Si vous utilisez une page statique à partir de, ce code fonctionnera sur votre page de messages en fonction de vos paramètres de lecture.

L'utilisation de i.d est préférable car ils restent les mêmes, même lorsque vous modifiez le slug.

0
Brad Dalton

ajouter une catégorie à la page avec:

function wpc_cat_pages() {
    register_taxonomy_for_object_type('category', 'page');
}
add_action('init', 'wpc_cat_pages');

et l'afficher avec:

$args = array(
        'post_type' => 'page',
        'category' => 'categori',
        'posts_per_page' => 'number post'
);
0
Mazgour Aziz