web-dev-qa-db-ja.com

2つの条件を持つwpdbカスタムメタデータ

これは私があまりにも多くの時間を費やしてきたそれらの問題のうちの1つです、そして、私が見逃している非常に単純な解決策がおそらくあります。任意の助けは大歓迎です。

カスタムデータから名前を選択ボックスに入力しようとしています(meta_key "pyd_pub_author")。ただし、データを直接呼び出すことはできません。メタキー"pyd_pub_type" = "Newsletter"を確認する必要もあるためです。

meta_valuemeta_key "pyd_pub_type""Newsletter"である必要があり、著者名はmeta_key "pyd_pub_author"から来る必要があります。注意が必要なのは、他の "pyd_pub_authors"に関連付けられている "pyd_pub_type"が他にもたくさんあることです。それらを除外する必要があります。

そのため、meta_value "Newsletter"とそれに関連するすべての "pyd_pub_author"を除外する必要があります。

私がしたことはこれです:

 $metakey       = $prefix . 'pub_author';
    $authors_query = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT DISTINCT meta_value, post_id
             FROM $wpdb->postmeta
             WHERE meta_key = %s
             HAVING post_id = ANY (
             SELECT DISTINCT post_id
             FROM $wpdb->postmeta
             WHERE meta_value = 'Newsletter'
             )
            ", $metakey
        )
    );

これは、たとえそれらが重複していても、リストにマッチする各post_idの作者の名前を返します。 "DISTINCT"はpost_idをチェックしているので名前のフィルタリングを行いません。
だから、これが私を任せているのは、重複を取り除くためにarray_unique()を実行することです。それはうまくいくが、これを行うためのより簡単でより安価な方法がなければならない。

頭→机、頭→机、頭→机...

1
mgyura

上記のクエリでエラーが見つかりました。もっと良い方法がまだあるかもしれませんが、kaiserに感謝します。もっと勉強したら更新します。忘れていたのはGROUP_CONCAT別のmeta_valueでしたので、別のビットを取り出すことができました。それは必要以上に長いように見えますが、仕事は早く終わります。これがコードです。これをフォームにラップして選択するだけで、いくつかのフィルターを使用して固有のmeta_valuesをドロップダウンできます。

    $metakey       = $prefix . 'pub_author';
    $authors_query = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT meta_value, post_id, GROUP_CONCAT(meta_value)
                             FROM pyd_postmeta
                             WHERE meta_key = %s
                             GROUP BY meta_value
                             HAVING post_id = ANY (
                             SELECT post_id
                             FROM pyd_postmeta
                             WHERE meta_value = 'Newsletter'
                             )
            ", $metakey
        )
    );

    if ( $authors_query ) {
        foreach ( $authors_query as $author ) {
            ?>
        <option value="<?php echo $author ?>" <?php selected( $pydnet_show_author, $author ) ?> ><?php echo $author ?></option>';
        <?php
        }
    }
1
mgyura

posts_clausesフィルタを使用してクエリを傍受し、必要なものをすべて変更できます。それはまたあなたにimhoより良い洞察を与えます 全体のクエリ部分について そしてデバッグするより簡単な方法。

function debug_query( $pieces )
{
    $dump  = '<pre>';
    $dump .= var_export( $pieces, FALSE );
    $dump .= '</pre>';

    echo $dump;
}
add_filter( 'posts_clauses', 'debug_query' );
1
kaiser