it-swarm.com.de

Verwenden OR Bedingungen in meta_query für das Argument query_posts

Ich habe hoch und niedrig nach diesem gesucht, aber ich kann nicht scheinen, irgendetwas zu lokalisieren.

Ich versuche, einige Ergebnisse zu filtern, und als ich ein Args-Array wie dieses erstelle und an query_posts übergebe, habe ich festgestellt, dass die generierte SQL AND anstelle von OR für den Wert 'class_1_days' verwendet. Ich möchte als OP machen. Wie würde ich das machen? (Ich verwende dort LIKE, da die Daten serialisiert werden. Andernfalls hätte ich ein "IN" versucht und ein Array übergeben. Wie gehe ich vor?

$args = array(
            'taxonomy' => 'courses', 
            'term' => 'drawing', 
            'post_type' => 'school', 
            'paged' => $paged,
            'meta_query' =>
                #$checkbox_array,
                array(
                    array(
                        'key' => 'instructor',
                        'value' => '1128',
                        'compare' => 'LIKE',
                    ),
                    array(
                        'key' => 'class_1_days',
                        'value' => 'Friday',
                        'compare' => 'LIKE',
                    ),
                    array(
                        'key' => 'class_1_days',
                        'value' => 'Saturday',
                        'compare' => 'LIKE',
                    ),
                )

        );

Dies ist die relevante SQL, die dort generiert wird, wo ich das UND bemerkt habe

[138] => Array
    (
        [0] => SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN     wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN     wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) WHERE 1=1  AND (     wp_term_relationships.term_taxonomy_id IN (18) ) AND wp_posts.post_type = 'school' AND     (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND (     (wp_postmeta.meta_key = 'instructor' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%1128%')
AND  (mt1.meta_key = 'class_1_days' AND CAST(mt1.meta_value AS CHAR) LIKE '%Friday%')
AND  (mt2.meta_key = 'class_1_days' AND CAST(mt2.meta_value AS CHAR) LIKE '%Saturday%') ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 5
3
Devario Johnson

Verwenden Sie 'relation' => 'OR'wie im folgenden Codex-Beispiel :

$args = array(
    'post_type' => 'product',
    'meta_query' => array(
        'relation' => 'OR', /* <-- here */
        array(
            'key' => 'color',
            'value' => 'blue',
            'compare' => 'NOT LIKE'
        ),
        array(
            'key' => 'price',
            'value' => array( 20, 100 ),
            'type' => 'numeric',
            'compare' => 'BETWEEN'
        )
    )
);
$query = new WP_Query( $args );

Dadurch erhalten Sie eine OR für alle Ihre meta_query-Blöcke. Wenn Sie etwas wie WHERE "instructor" = 1128 AND (class_1_days = "value1" OR class_1_days = "value2") benötigen, dann würde so etwas tun, wenn Ihre Daten nicht serialisiert wären.

$args = array(
        'taxonomy' => 'courses', 
        'term' => 'drawing', 
        'post_type' => 'school', 
        'paged' => $paged,
        'meta_query' =>
            array(
                array(
                    'key' => 'instructor',
                    'value' => '1128',
                    'compare' => 'LIKE',
                ),
                array(
                    'key' => 'class_1_days',
                    'value' => array('Friday','Saturday')
                    'compare' => 'IN',
                )
            )

    );

Angesichts der Tatsache, dass Sie Daten serialisiert haben, wird dies schwierig. Sie könnten einen Filter für posts_where schreiben, aber ich würde erwarten, dass das Ergebnis ineffizient und fehleranfällig ist.

Der richtige Ansatz für Fälle wie diesen, in denen Sie nach bestimmten Informationen suchen/filtern/sortieren müssen, besteht meiner Erfahrung nach darin, Ihre Daten gar nicht erst als serialisiertes Array zu speichern. Das ist einfach der falsche Ansatz, wenn Sie Fragen wie diese benötigen.

Wenn ich dieses Projekt übernehmen würde, würde ich die Daten durchlaufen, die auf diese Weise abgefragt werden müssen, und jedes Stück an einem Schlüssel/Wert-Paar neu speichern. Die Teile, die Sie nicht abfragen, können serialisiert bleiben. Es gibt keine (gute) Möglichkeit, dies in MySQL mit MySQL-Funktionen zu tun, weder als Teil der Abfrage, die Sie versuchen, noch als eigenständige Abfrage. Ich habe Versuche gesehen, eine MySQL "unserialize" -Funktion zu erstellen, aber ich verstehe den Punkt nicht. Das erneute Speichern der Daten ist der richtige Weg.

Es sollte eine ziemlich einfache Abfrage sein, um alle class_1_days-Daten abzurufen. Führen Sie dann eine Schleife durch und speichern Sie die Teile, die Sie als unabhängige Schlüssel abfragen müssen, und setzen Sie den Rest als serialisierte Daten zurück.

2
s_ha_dum