Ignoriere Post durch Metawert in der Hauptabfrage

Ich benutze diese function, um am Anfang der Schleife zwei Beiträge einzufügen (mit Metaschlüssel und Wert)

add_filter( 'posts_results', 'insert_post_wpse_96347', 10, 2 ); function insert_post_wpse_96347( $posts, \WP_Query $q ) { remove_filter( current_filter(), __FUNCTION__ ); if ( $q->is_main_query() && $q->is_home() && 0 == get_query_var( 'paged' ) ) { $args = [ 'meta_key' => 'caja', 'meta_value' => ['uno','dos'], 'post__not_in' => get_option( "sticky_posts" ), 'posts_per_page' => '2', 'suppress_filters' => true ]; $p2insert = new WP_Query($args); $insert_at = 0; if ( !empty( $p2insert->posts ) ) { array_splice( $posts, $insert_at, 0, $p2insert->posts ); } } return $posts; } 

Aber diese Beiträge erscheinen immer noch in der Schleife, sie müssten sich verstecken, um nicht zweimal zu schauen.

Wie kann ich das machen?

Solutions Collecting From Web of "Ignoriere Post durch Metawert in der Hauptabfrage"

Wir können den folgenden alternativen Weg versuchen:

  • Entfernen Sie die beiden Posts, die wir über unsere benutzerdefinierte Abfrage aus der Hauptabfrage auswählen, über die Aktion pre_get_posts

  • the_posts Sie die beiden Posts auf der ersten Seite über den Filter the_posts

Schauen wir uns möglichen Code an:

 add_action( 'pre_get_posts', function ( $q ) { remove_filter( current_filter(), __FUNCTION__ ); if ( $q->is_home() // Only target the home page && $q->is_main_query() // Only target the main query ) { // Set our query args and run our query to get the required post ID's $args = [ 'meta_key' => 'caja', 'meta_value' => ['uno','dos'], 'posts_per_page' => '2', 'fields' => 'ids', // Get only post ID's ]; $ids = get_posts( $args ); // Make sure we have ID's, if not, bail if ( !$ids ) return; // We have id's, lets remove them from the main query $q->set( 'post__not_in', $ids ); // Lets add the two posts in front on page one if ( $q->is_paged() ) return; add_filter( 'the_posts', function ( $posts, $q ) use ( $args ) { if ( !$q->is_main_query() ) return $posts; // Lets run our query to get the posts to add $args['fields'] = 'all'; $posts_to_add = get_posts( $args ); $stickies = get_option( 'sticky_posts' ); if ( $stickies ) { $sticky_count = count( $stickies ); array_splice( $posts, $sticky_count, 0, $posts_to_add ); return $posts; } // Add these two posts in front $posts = array_merge( $posts_to_add, $posts ); return $posts; }, 10, 2 ); } }); 

Dies sollte den aktuellen Code ersetzen, den Sie in Ihrer Frage geschrieben haben

Versuchen Sie es stattdessen:

HINWEIS: Stellen Sie sicher, dass Sie zusätzliche Bedingungslogik hinzufügen, die Sie für Ihren Anwendungsfall benötigen, z. B. eine Prüfung für is_home() und den Wert für get_query_var( 'paged' ) . Ich habe diese nur kurz der Kürze halber weggelassen.

 function custom_pre_get_posts_meta_query( $query ) { if ( is_admin() || ! $query->is_main_query() ) return; $meta_key = 'caja'; //meta_key to query $query->set( 'orderby', array( 'meta_value' => 'DESC', 'date' => 'DESC' ) ); $query->set( 'meta_query', array( array( 'key' => $meta_key, 'value' => 'IGNORE THIS VALUE', //this just needs to be something random 'compare' => 'NOT EXISTS' ) ) ); add_filter( 'posts_where', 'custom_where_meta_query' ); } add_action( 'pre_get_posts', 'custom_pre_get_posts_meta_query', 1 ); function custom_where_meta_query( $where = '' ){ global $wpdb; $meta_key = 'caja'; //meta_key $meta_values = array('uno', 'dos'); //meta_values $sql = "'" . implode( "', '", array_map( 'esc_sql', $meta_values ) ) . "'"; $where .= $wpdb->prepare( " OR (( {$wpdb->postmeta}.meta_key = %s AND {$wpdb->postmeta}.meta_value IN ( {$sql} ) ))", $meta_key ); remove_filter( 'posts_where', 'custom_where_meta_query' ); return $where; } 

Die erste Callback-function auf pre_get_posts wird pre_get_posts einleiten, die das notwendige SQL erstellt, das wir dann in der zweiten Callback-function filtern.

Die Ergebnisse werden zuerst von meta_value DESC dann von date DESC geordnet. Dadurch werden die zwei übereinstimmenden Beiträge für den Meta-Schlüssel caja oben gruppiert und die verbleibenden Beiträge werden danach nach Datum sortiert.

Dadurch wird vermieden, dass Sie die database erneut nach zwei bestimmten Posts durchsuchen müssen, die Ergebnismenge spleißen und schließlich die Ergebnismenge der Duplikate löschen.