web-dev-qa-db-fra.com

wpdb Custom Meta Data avec 2 conditions

C’est l’un de ces problèmes sur lequel j’ai passé beaucoup trop de temps et il ya probablement une solution TRÈS simple qui me manque. Toute aide serait grandement appréciée.

J'essaie de renseigner une zone de sélection avec des noms de données personnalisées (meta_key "pyd_pub_author"). Mais, je ne peux pas appeler les données directement, car il faut également s'assurer que meta_key "pyd_pub_type" = "Newsletter"

Le meta_value pour meta_key "pyd_pub_type" doit être "Newsletter" et le nom de l'auteur doit provenir de la méta_key "pyd_pub_author". La difficulté réside dans le fait qu’il existe de nombreux autres "pyd_pub_authors" associés à d’autres "pyd_pub_type". Je dois également les filtrer.

Donc, je dois filtrer la méta_valeur "Newsletter" et tous les "pyd_pub_author" qui lui sont associés.

Voici ce que j'ai fait:

 $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
        )
    );

Ceci retourne le nom d'un auteur pour chacun des post_id (s) qui correspondent à la liste, même s'ils sont dupliqués. Le "DISTINCT" ne filtre pas les noms car il vérifie le post_id.
Donc, ce qui me laisse à faire est d’exécuter un array_unique () pour éliminer les doublons. Cela fonctionne, mais il doit exister un moyen plus simple et moins coûteux de le faire.

tête-> bureau, tête-> bureau, tête-> bureau ...

1
mgyura

J'ai trouvé mon erreur dans la requête ci-dessus. Il y a peut-être encore une meilleure façon de faire cela, merci kaiser, et je mettrai à jour une fois que j'aurai fait plus d'étude. Ce que j’avais oublié de faire, c’était GROUP_CONCAT, une autre méta_valeur pour pouvoir en extraire des bits différents. Cela semble toujours plus long que nécessaire, mais le travail est fait rapidement. Voici le code, emballez-le simplement dans un formulaire et sélectionnez-le. Vous pouvez créer une liste déroulante de valeurs méta uniques avec quelques filtres.

    $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

Vous pouvez utiliser le filtre posts_clauses pour intercepter la requête et modifier tout ce dont vous avez besoin. Il vous donne également à l’imho de meilleures informations sur l’ensemble des parties de la requête et un moyen plus simple de déboguer.

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

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