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?

lrm
la source
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 .

gmazzap
la source
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