Mélange de types de publication réguliers et personnalisés (avec meta_query) sur la page d'accueil


9

Je ne sais pas comment y parvenir. J'essaie de mélanger des publications standard et des publications personnalisées sur la page d'accueil d'un site, mais je ne souhaite afficher les publications personnalisées que si une méta-valeur est définie. L'affichage des messages fonctionne bien, 'post_type' => array('game', 'post')mais lorsque j'ajoute dans la méta_query les messages réguliers ne s'affichent plus (ce qui est logique car ils ne remplissent pas la condition meta_query).

Alors, comment puis-je limiter la meta_query au seul type de publication personnalisé afin que la publication régulière soit toujours incluse?


1
Bonne question ... +1. Je pense que vous ne pourrez pas faire cela avec un défaut WP_Query. Vous devrez soit utiliser pre_get_postsmodifier votre requête ou une instruction SQL personnalisée. Quoi qu'il en soit, veuillez montrer votre code actuel.
kaiser

Réponses:


4

Il y a différentes façons de faire l'affaire, 2 me vient à l'esprit:

  1. utiliser une $wpdbrequête personnalisée complète
  2. utiliser WP_Queryavec des filtres, utiliser WP_Meta_Querypour construire le sql supplémentaire

Je posterai ici un exemple de code pour le cas # 2

/**
 * Run on pre_get_posts and if on home page (look at url)
 * add posts_where, posts_join and pre_get_posts hooks
 */
function home_page_game_sql( $query ) {
  // exit if is not main query and home index
  if ( ! ( $query->is_main_query() && ! is_admin() && is_home() ) ) return;
  add_filter( 'posts_where', 'home_page_game_filter' );
  add_filter( 'posts_join', 'home_page_game_filter' );
}
add_action('pre_get_posts', 'home_page_game_sql');


/**
 * Set the SQL filtering posts_join and posts_where
 * use WP_Meta_Query to generate the additional where clause
 */
function home_page_game_filter( $sql = '' ) {
  // remove filters
  remove_filter( current_filter(), __FUNCTION__);
  static $sql_game_filters;
  if ( is_null($sql_game_filters) ) {
    // SET YOUR META QUERY ARGS HERE
    $args = array(
      array(
        'key' => 'my_custom_key',
        'value'   => 'value_your_are_looking_for',
        'compare' => '='
      )
    );
    $meta_query = new WP_Meta_Query( $args );
    $sql_game_filters = $meta_query->get_sql('post', $GLOBALS['wpdb']->posts, 'ID');
  }
  // SET YOUR CPT NAME HERE
  $cpt = 'game';
  global $wpdb;
  if ( current_filter() === 'posts_where' && isset($sql_game_filters['where']) ) {
    $where = "AND ($wpdb->posts.post_status = 'publish') ";
    $where .= "AND ( $wpdb->posts.post_type = 'post' OR ( ";
    $where .= $wpdb->prepare( "$wpdb->posts.post_type = %s", $cpt);
    $where .= $sql_game_filters['where'] . ' ) )';
    $where .= " GROUP BY $wpdb->posts.ID ";
    return $where;
  }
  if ( current_filter() === 'posts_join' && isset($sql_game_filters['join']) ) {
    return $sql .= $sql_game_filters['join'];
  }
}

Voir les commentaires en ligne pour plus d'explications.

Regardez également WP_Meta_Query sur Codex pour des documents complets sur la façon de définir vos arguments de méta-requête.


Éditer

J'ai refactorisé le code dans un plugin réutilisable, en utilisant une classe. Disponible en Gist .


1
A parfaitement fonctionné et merci pour les commentaires en ligne. J'ai simplement copié le code dans mon plugin utils.php, mis les valeurs appropriées dans la méta-requête args que vous avez fourni les talons pour, actualisé la page d'accueil et il y avait mes publications et publications de jeu dans toute leur splendeur. Merci encore.
lrm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.