Mischen von regulären und benutzerdefinierten Beitragstypen (mit meta_query) auf der Startseite


9

Ich bin mir nicht sicher, wie ich das erreichen soll. Ich versuche, Standardposts und benutzerdefinierte Posts auf einer Site-Homepage zu mischen, möchte die benutzerdefinierten Posts jedoch nur anzeigen, wenn ein Metawert festgelegt ist. Das Anzeigen der Beiträge funktioniert 'post_type' => array('game', 'post')einwandfrei, aber wenn ich die meta_query hinzufüge, werden die regulären Beiträge nicht mehr angezeigt (was sinnvoll ist, da sie die meta_query-Bedingung nicht erfüllen).

Wie beschränke ich die meta_query auf den benutzerdefinierten Beitragstyp, damit der reguläre Beitrag weiterhin enthalten ist?


1
Gute Frage ... +1. Ich denke, Sie werden das mit einem Standard nicht schaffen WP_Query. Sie müssen entweder pre_get_postsIhre Abfrage ändern oder eine benutzerdefinierte SQL-Anweisung verwenden. Wie auch immer, bitte zeigen Sie Ihren aktuellen Code.
Kaiser

Antworten:


4

Es gibt verschiedene Möglichkeiten, den Trick zu machen, 2 fällt mir ein:

  1. Verwenden Sie eine vollständige benutzerdefinierte $wpdbAbfrage
  2. Verwenden Sie diese Option WP_Querymit Filtern, WP_Meta_Queryum die zusätzliche SQL zu erstellen

Ich werde hier einen Beispielcode für Fall 2 veröffentlichen

/**
 * 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'];
  }
}

Weitere Erläuterungen finden Sie in den Inline-Kommentaren.

In WP_Meta_Query in Codex finden Sie auch vollständige Dokumente zum Festlegen Ihrer Metaabfrage-Argumente .


Bearbeiten

Ich habe Code in einem wiederverwendbaren Plugin mithilfe einer Klasse überarbeitet. Verfügbar als Gist .


1
Hat perfekt funktioniert und danke für die Inline-Kommentare. Ich habe den Code einfach in mein utils.php-Plugin kopiert und die entsprechenden Werte in die Metaabfrage-Argumente eingefügt, für die Sie die Stubs bereitgestellt haben, die Startseite aktualisiert und meine Beiträge und Spielbeiträge in ihrer vollen Pracht angezeigt. Danke noch einmal.
lrm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.