Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何计算某个meta_键在列中显示meta_值的次数?_Php_Mysql_Sql_Wordpress - Fatal编程技术网

Php 如何计算某个meta_键在列中显示meta_值的次数?

Php 如何计算某个meta_键在列中显示meta_值的次数?,php,mysql,sql,wordpress,Php,Mysql,Sql,Wordpress,我试图从WordPress的数据库中查询每个记录在我的表中的一列上存在的次数,并导出该列。我该怎么做 在导出的excel中,我想让meta_键为“user_valid”的from meta_value列和一个计数该meta_值在mysql列中存在多少次的列 meta_key meta_value user_valid '1, 2, 3' user_valid '1, 2, 1' user_valid '1, 2, 3'

我试图从WordPress的数据库中查询每个记录在我的表中的一列上存在的次数,并导出该列。我该怎么做

在导出的excel中,我想让meta_键为“user_valid”的from meta_value列和一个计数该meta_值在mysql列中存在多少次的列

meta_key          meta_value

user_valid        '1, 2, 3'      
user_valid        '1, 2, 1' 
user_valid        '1, 2, 3'
对于使用meta_键“user_valid”导出列“meta_value”:

SELECT meta_value FROM `us_test` WHERE meta_key = 'user_valid'
使用此查询后,我使用export按钮从MYSQL导出

我不知道如何查询另一列

我认为应该是这样,但我不确定,因为当我使用下一个查询时,它不会返回所有记录:

SELECT meta_value, COUNT( * ) c FROM `us_test` WHERE meta_key = 'user_valid' GROUP BY meta_value

因此,我将回答我自己的问题:

我的问题中的疑问绝对正确:

SELECT meta_value, COUNT( * ) c FROM `us_test` WHERE meta_key = 'user_valid' GROUP BY meta_value

这里有两种选择,Wordpress方式和SQL方式

在我开始之前,您永远不应该硬编码db名称,问题是,如果您将代码移动到另一个具有不同db名称的网站,并且在您正在工作的网站上更改db名称,那么您需要在所有查询中更改db名称,而这是硬编码。如果你忘记了这一点,这会让你陷入白费力气

您应该始终清理和验证输入数据,以确保安全,防止任何恶意代码被注入您的站点。SQL注入很常见,许多黑客使用SQL注入攻击网站

SQL SQL给人的控制力要小一些,因为它不太动态。例如,如果只需要获取某个术语的计数,则需要直接更改查询,或者需要实现某种过滤系统

正如我所说的,永远不要硬编码db名称,而是使用wpdb类来设置前缀。这将避免未来的问题。另外,正如我所说,您必须进行清理以避免SQL注入,在这种情况下,我们将使用wpdb类的
prepare
方法来处理卫生问题,并防止SQL注入

下面是函数,我在这里和那里对其进行了评论,以使其有意义:

function get_post_meta_key_count( $key = '', $value = '', $type = 'post', $status = 'publish' ) 
{
    // Use $wpdb to avoid bugs and errors, do not hardcode db names
    global $wpdb;

    if( empty( $key ) )
        return;


    // Set the default WHERE clause where we return the count of the key regardless of value
    $where = $wpdb->prepare( 
        "
            pm.meta_key = '%s' 
            AND p.post_type = '%s' 
            AND p.post_status = '%s'
        ", 
        $key, 
        $type, 
        $status 
    );

    // If a value is specified, add that to the WHERE clause
    if ( $value ) {
        $where .= $wpdb->prepare( 
            "
                AND pm.meta_value = '%s'
            ", 
            $value 
        );
    }

    // Query the db to return the post count according to key and value if value is set
    $count = $wpdb->get_var(
        "
            SELECT count(DISTINCT pm.post_id)
            FROM {$wpdb->postmeta} pm
            JOIN {$wpdb->posts} p ON (p.ID = pm.post_id)
            WHERE {$where}
        "
    );

    return $count;
}
我在这里做的是,如果您需要获取特定元键的特定元值的计数,我设置了一个参数

用法

您现在可以按如下方式使用该功能:

  • echo get_post_meta_key_count('my_key')
    用于默认帖子类型
    post
    meta\u key
    的帖子计数,仅用于发布的帖子

  • echo get_post_meta_key_count('my_key','custom_post_type','trash')
    用于自定义帖子类型的
    meta_key
    my_key
    的帖子计数
    用于自定义帖子类型
    且仅用于垃圾帖子

  • echo get_post_meta_key_count('my_key','my_value')
    对于
    meta\u key
    my\u key
    的帖子计数,对于
    meta\u value
    my\u value
    对于默认帖子类型
    post
    ,仅发布帖子

WP\u查询
如果您正在寻找一种内置方式来实现这一点(这应该是您的第一个选择),那么您可以使用
WP\u Query
类来实现

使用
WP\u Query
的问题是,如果使用不当,可能会非常昂贵。因此,许多人避免使用
WP\u Query
,或者在不知不觉中运行非常昂贵且不必要的查询。因此,我们将研究一种方法,使其与自定义SQL查询一样快

与自定义SQL查询相比,
WP\u Query
的真正优势在于,您可以通过简单地传递所需的参数来调整查询,
WP\u Query
将始终负责根据传递的参数构造适当的SQL查询的艰苦工作

让我们看一下优化
WP\u查询
,以便只返回post计数

  • 首先,我们只查询一篇文章<默认情况下,
    WP\u Query
    的构建方式是,无论查询多少帖子(1100篇或所有帖子),
    WP\u Query
    将继续查找与查询匹配的所有帖子,即使它已经找到并返回了查询的帖子数量。原因是分页。为了正确计算分页,
    WP_Query
    需要知道与查询匹配的帖子数量

    因此,
    WP_Query
    在返回查询的帖子数量后,继续查看数据库,以便统计与查询匹配的所有帖子。此帖子计数存储在查询的
    $found\u posts
    属性中,此数字与每页
    posts\u一起使用,用于计算将有多少页面

    这不适用于
    get_posts
    ,尽管
    get_posts
    使用
    WP_Query
    get_posts
    'no_found_rows'=>true
    传递到
    WP_Query
    ,一旦找到查询的posts数量,就会中断查询。这在法律上破坏了分页,这就是为什么正确分页是如此令人头痛的问题

  • 其次,我们将只查询需要查询的单个post的ID,而不是完整的
    WP_post
    对象。这样可以节省查询时间

让我们看看这个函数:

function get_post_meta_key_count( $key = '', $value = '', $args = [] ) 
{
    // If the $key value is empty, bail
    if( empty( $key ) )
        return;

    // Set the defaults and override any value set for the specific default
    $args['posts_per_page'] = 1;
    $args['fields']         = 'ids';

    if ( $value ) {
        $args['meta_query'][] = [
            'key'   => $key,
            'value' => $value
        ];
    } else {
        $args['meta_query'][] = [
            'key' => $key,
        ];
    }
    $q = new WP_Query( $args );

    // Return the post count
    return $q->found_posts;
}
用法

WP\u Query
,默认情况下,使用
post
post类型和
publish
作为post状态,因此我们不需要为正常发布的帖子设置此选项。我在这里包含了第三个参数,名为
$args
,该参数接受与
WP\u Query
类相同的精确参数,因为这些参数都直接传递给
WP\u Query
。因此,您可以在这里添加任何参数,以从特定的元键o获取计数