webentwicklung-frage-antwort-db.com.de

Serialisierte Arrays mit meta_query abgleichen

Ich habe zuvor eine verwandte Frage gestellt, aber ich glaube, ich habe endlich den Kern meines Problems herausgefunden.

Ich verwende Erweiterte benutzerdefinierte Felder und habe eine Reihe benutzerdefinierter Felder an meinen Beitragstyp angehängt. Ich versuche, die URL so zu ändern, dass Posts über ihr benutzerdefiniertes Feld und ihren Wert empfangen werden.

Und ich komme ganz nah. Dies ist, was derzeit in meiner functions.php :

add_action('pre_get_posts', 'my_pre_get_posts');

function my_pre_get_posts( $query ) {
    if( is_admin() ) { return; }

    $meta_query = $query->get('meta_query'); // get original meta query

        if( isset($_GET['type']) ) {                        

        $type = '"' . $_GET['type'] . '"';      

        $meta_query[] = array(
            'key'       => 'type',
            'value'     => $type,
            'compare'   => 'LIKE',
        );
    }
    $query->set('meta_query', $meta_query); // update the meta query args
    return; // always return
}

Da ACF bei der Verarbeitung mehrerer Werte in benutzerdefinierten Feldern serialisierte Arrays verwendet, verwende ich die Abfrage LIKE. Das benutzerdefinierte Feld type akzeptiert tatsächlich mehrere Werte, und ich kann Beiträge von einer type (d. H. Frauen) erfolgreich anzeigen.

website.com?type=women

Wenn Sie jedoch versuchen, mehrere type abzurufen (z. B. Frauen, Männer, Jungen), funktioniert dies nicht.

website.com?type=women,men,boys

Jetzt ist mir klar, dass ich hier mit serialisierten Arrays arbeite und wenn ich mehrere type abfragen möchte, müsste ich diese $type-Variable explodieren, aber das scheint auch nicht zu funktionieren.

Wenn jemand helfen kann, bin ich verzweifelt nach einer Lösung. Vielen Dank!

BEARBEITEN | Mehrmals für jeden Typ:

$meta_query[] = array(
    'relation'  => 'OR',
    array( 
        'key'       => 'type',
        'value'     => 'men',
    ),
    array( 
        'key'       => 'type',
        'value'     => 'women',
    ),
    array( 
        'key'       => 'type',
        'value'     => 'boys',
    ),
);
4
realph

Ich habe gerade selbst herausgefunden, wie es geht

Schauen Sie sich dieses Beispiel an:

$args = array();
$args['relation'] = 'OR';
foreach ( $tag_ids as $t ) {
    $args[] = array(
        'key'     => 'afz_entry_tags',
        'value'   => serialize( strval( $t->id ) ),
        'compare' => 'LIKE'
    );
}

$query->set( 'meta_query', $args );

Ich erhalte $tag_ids mit einem normalen get_results.

Dann erstelle ich das erste Element des Arrays für meta_query, um das OR zu definieren, das ich brauche.

Dann durchlaufe ich die Sammlung von Objekten, die ich von get_results erhalten habe, und erstelle so viele Arrays für die meta_query, wie ich brauche.

Es wirkt wie ein Zauber.

7
e4rthdog

LIKE akzeptiert keinen Array-Wert. Ihre Optionen sind wahrscheinlich:

  1. Fügen Sie für jeden Typ eine Meta-Abfrage hinzu, die möglicherweise nicht gut funktioniert, da Sie dieses Zeug bereits anhängen und eine OR-Klausel benötigen.
  2. Verwenden Sie REGEXP compare und fügen Sie mehrere Typen in reguläre Ausdrücke ein. Die Ausführung ist möglicherweise sehr langsam.
0
Rarst