it-swarm.com.de

filter Suchergebnis mit verfügbaren Beitragstyp Metaschlüssel

Die Standardsuche gibt alle Beitragstypen zurück, was ich möchte. Aber für einen bestimmten benutzerdefinierten Beitragstyp möchte ich das Ergebnis auf einen bestimmten Metaschlüsselwert beschränken (ein benutzerdefiniertes Datum, das größer als heute sein muss).

Wenn ich den pre_get_posts-Hook verwende und die meta_query einstelle, erhalte ich das richtige Ergebnis für diesen Beitragstyp, aber es werden auch alle Beitragstypen herausgefiltert, für die dieser Schlüssel nicht festgelegt ist.

Ist es möglich, die meta_query nur für eine bestimmte cpt zu verwenden?

Das sollte klar genug sein, aber hier ist trotzdem ein Code:

function searchExcludeOldMatches($query) {
    if (!is_admin()&&$query->is_search) {
        $query->set('meta_query', array(
            array(
                'key' => 'cpt-match-date'
                ,'value' => date('Y/m/d',time())
                ,'type' => 'DATE'
                ,'compare' => '>'
            )
        ));
    };
    return $query;
};
add_filter('pre_get_posts','searchExcludeOldMatches');
2
Sjeiti

Das hat vielleicht vorher nicht funktioniert, aber die Meta-Abfragen von WordPress unterstützen jetzt den Relations-Parameter. Um abzuschließen, wonach @s_ha_dum gesucht hat, fügen Sie einfach den Relationsparameter (als OR) hinzu und fügen Sie eine zweite Meta-Abfrage für NOT EXISTS hinzu. Beispiel:

function searchExcludeOldMatches( $query ) {
    //if we're on the admin panel, or it's a search, or it's not the post type we want to filter, return the original query
    if( is_admin() || !$query->is_search() || $query->get( 'post_type' ) != 'yourposttype' )
        return $query;

    //this is the query we want to update
    $query->set('meta_query', array(
        'relation' => 'OR',
        array(
            'key' => 'cpt-match-date'
            ,'value' => date('Y/m/d',time())
            ,'type' => 'DATE'
            ,'compare' => '>'
        ),
        array(
            'key' => 'cpt-match-date'
            ,'value' => date('Y/m/d',time())
            ,'type' => 'DATE'
            'compare' => 'NOT EXISTS'
        ),
    ));
    return $query;
}
add_filter('pre_get_posts','searchExcludeOldMatches');

Weitere Informationen finden Sie auf der Seite WP Meta Query Codex: https://codex.wordpress.org/Class_Reference/WP_Meta_Query

17. November 2015: Filter für benutzerdefinierten Beitragstyp hinzugefügt und bedingte Anweisung vereinfacht.

1
Elliott Post

Sie können Ihre Anfrage noch weiter einschränken ...

if (
  !is_admin() 
  && $query->is_search() 
  && ($query->get('post_type') == 'yourposttype')
) { 
  // ...

Wenn Sie jedoch alle Beitragstypen abfragen möchten, diese Ergebnisse jedoch nur für einen Beitragstyp in derselben Abfrage einschränken möchten, können Sie dies nicht tun. Sie benötigen wahrscheinlich eine UNION -Anweisung, und WP_Query unterstützt dies nicht. Sie müssen mehrere Abfragen verwenden oder eine eigene SQL schreiben.

Am einfachsten geht das so:

$post_ids = new WP_Query(array(
  // query for one post type
  'fields' => 'ids',
  // other parameters
));

$post_ids_2 = new WP_Query(array(
  // query for the others
  'fields' => 'ids',
  // other parameters
));
// join them
$post_ids = $post_ids->posts + $post_ids_2->posts;
$posts_qry = new WP_Query(array('post__in'=> $posts_ids));

Aber nicht die effizienteste. Das sind drei Fragen. Ich erwähne andere Möglichkeiten in einem anderen Thread: Benutzerdefinierte Abfrage mit Kategorieausschluss und Post-Meta "Whitelist"

Verbunden

https://wordpress.stackexchange.com/a/79977/21376

1
s_ha_dum