具有2个条件的wpdb自定义元数据

时间:2012-03-08 作者:mgyura

这是我花了太多时间研究的问题之一,可能有一个我错过的非常简单的解决方案。任何帮助都将不胜感激。

我试图用自定义数据中的名称填充选择框(meta_key “”pyd_pub_author)但是,我不能直接调用数据,因为它还需要确保"pyd_pub_type" = "Newsletter"

这个meta_value 对于meta_key "pyd_pub_type" 需要是"Newsletter" 作者的名字必须来自meta\\u key“pyd_pub_author“棘手的是,还有很多其他的”pyd_pub_authors“与其他关联的”pyd_pub_type“,我也需要过滤掉它们。

因此,我需要过滤掉meta\\u值“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\\u id的作者名称,即使它们是重复的。“DISTINCT”没有过滤名称,因为它正在检查post\\u id。
因此,我要做的就是运行一个array\\u unique()来去除重复项。这是可行的,但必须有一种更简单、更便宜的方法来做到这一点。

头->桌子,头->桌子,头->桌子。。。

2 个回复
最合适的回答,由SO网友:mgyura 整理而成

我在上面的查询中发现了错误。也许还有更好的方法可以做到这一点,谢谢凯撒,我会在完成更多研究后更新。我忘了做的是GROUP\\u CONCAT另一个meta\\u值,这样我可以提取不同的位。它似乎比需要的时间还要长,但它很快就完成了任务。这是代码,只需将其包装成一个表单并选择,您就可以通过几个过滤器下拉出唯一的meta\\u值。

    $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
        }
    }

SO网友:kaiser

您可以使用posts_clauses 筛选以拦截查询并更改所需内容。它还为您提供了更好的见解about the whole query parts 以及更简单的调试方法。

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

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

结束

相关推荐

这个wpdb查询有什么问题?

我想选择一些具有相同term\\u组的标记,我在phpadmin中对其进行了测试,查询得到了正确的结果,但一旦添加了$wpdb flavor,它将返回一个空数组。有什么建议吗?$primary_tag_id = // a function to return term_group, result is 3, comfirmed $terms = $wpdb->get_col( $wpdb->prepare( \"SELECT name