Mezclando tipos de publicaciones regulares y personalizadas (con meta_query) en la página de inicio

9

No estoy seguro de cómo lograr esto. Estoy intentando mezclar publicaciones estándar y publicaciones personalizadas en la página de inicio de un sitio, pero solo quiero mostrar las publicaciones personalizadas si se establece un valor meta. La visualización de las publicaciones funciona bien 'post_type' => array('game', 'post') , pero cuando agrego la meta_query, las publicaciones normales ya no se muestran (lo que tiene sentido ya que no cumplen con la condición de meta_query).

Entonces, ¿cómo limito la meta_query solo al tipo de publicación personalizada para que la publicación regular aún se incluya?

    
pregunta lrm 10.01.2014 - 06:50

1 respuesta

4

Hay diferentes maneras de hacer el truco, 2 me viene a la mente:

  1. usar una consulta $wpdb personalizada completa
  2. usa WP_Query con filtros, usa WP_Meta_Query para construir el sql adicional

Pondré aquí un código de muestra para el caso # 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'];
  }
}

Ver comentarios en línea para una explicación más detallada.

También consulte WP_Meta_Query en Codex para obtener documentos completos sobre cómo establecer sus consultas de meta consulta.

Editar

He refactorizado el código en un complemento reutilizable, utilizando una clase. Disponible como Gist .

    
respondido por el gmazzap 10.01.2014 - 13:45

Lea otras preguntas en las etiquetas