php – 如何通过某个meta_key计算meta_value在列中出现的次数?

前端之家收集整理的这篇文章主要介绍了php – 如何通过某个meta_key计算meta_value在列中出现的次数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图从wordpress中的数据库查询我的表中的列上每条记录存在多少次并导出该列.我该怎么办?

在excel导出中,我希望Meta_value中的列包含Meta_key“user_valid”,列中包含Meta_value在mysql列中存在的次数.

Meta_key          Meta_value

user_valid        '1,2,3'      
user_valid        '1,1' 
user_valid        '1,3'

要使用Meta_key’user_valid’导出列’Meta_value’,我使用了:

SELECT Meta_value FROM `us_test` WHERE Meta_key = 'user_valid'

在使用此查询后,我使用MysqL中的导出按钮导出.

我不知道如何对其他列进行查询.

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

SELECT Meta_value,COUNT( * ) c FROM `us_test` WHERE Meta_key = 'user_valid' GROUP BY Meta_value
这里有两个选项,wordpress方式和另一种方式sql.

就在我开始之前,你永远不应该对数据库名称进行硬编码,问题是,如果你将代码移动到具有不同数据库名称的另一个网站,你需要在所有查询中更改数据库名称,当你更改您正在使用的站点上的数据库名称.如果您忘记这一点,这可以让您进行疯狂的追逐

您应始终始终清理并验证输入数据,以确保可以安全地防止将任何恶意代码注入您的站点. 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’);对于默认帖子类型帖子的met​​a_key my_key的帖子计数和仅发布的帖子
> echo get_post_meta_key_count(‘my_key’,”,’custom_post_type’,’trash’);对于自定义帖子类型custom_post_type的Meta_key my_key的帖子计数和仅删除的帖子
> echo get_post_meta_key_count(‘my_key’,’my_value’);对于Meta_key my_key和Meta_value的帖子计数,默认帖子类型帖子的my_value以及仅发布的帖子

WP_Query

如果您正在寻找构建方法(这应该始终是您的第一个选项),您可以使用WP_Query类来执行此操作.

使用WP_Query的问题在于,如果使用不正确,它可能会非常昂贵.许多人因此而避免使用WP_Query,或者在不知情的情况下运行非常昂贵且不必要的查询.因此,我们将研究一种与自定义SQL查询一样快的方法.

WP_Query在自定义SQL查询之上的真正优势是,您可以通过简单地传递所需的参数来调整查询,WP_Query将始终负责根据传递的参数构建正确的SQL查询.

让我们看一下优化WP_Query,以便只返回一个帖子计数

>首先,我们只会查询一个帖子.默认情况下,WP_Query构建为无论查询了多少帖子(1,100或所有帖子),WP_Query将继续查找与查询匹配的所有帖子,即使它已找到并返回查询的帖子数量.这样做的原因是分页.为了正确计算分页,WP_Query需要知道有多少帖子与查询匹配.

因此,WP_Query在返回查询的帖子数量后继续查看数据库,以便计算与查询匹配的所有帖子.此帖子计数存储在查询的$found_posts属性中,并且此数字与posts_per_page结合使用,后者用于计算将有多少页面.

虽然get_posts使用WP_Query,但这对get_posts不起作用. get_posts传递’no_found_rows’=>对于WP_Query,如果找到查询的帖子数量,则会立即中断查询.这合法地破坏了分页,这就是为什么get_posts正确地分页是如此令人头痛的原因
>其次,我们只查询我们需要查询的单个帖子的ID,而不是查询完整的WP_Post对象.这节省了查询时间.

那么让我们来看看这个功能

function get_post_meta_key_count( $key = '',$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_Query使用帖子后类型并发布为帖子状态,因此我们不需要为正常发布的帖子设置此项.我在这里添加了一个名为$args的第三个参数,该参数接受与WP_Query类完全相同的参数,因为它们都直接传递给WP_Query.因此,您可以在此处添加任何参数以从特定元键或值中获取计数

> echo get_post_meta_key_count(‘my_key’);对于默认帖子类型帖子的met​​a_key my_key的帖子计数和仅发布的帖子
> echo get_post_meta_key_count(‘my_key’,默认帖子类型帖子的my_value以及仅发布的帖子
> echo get_post_meta_key_count(‘my_key’,’my_value’,[‘post_type’=>’cpt’,’cat’=> 1]);对于Meta_key my_key和Meta_value的帖子计数,自定义帖子类型cpt的my_value以及仅从类别ID 1发布的帖子

对具有24个帖子的met​​a_key进行性能测试

> sql – > 1个查询/ – 0.005秒
> WP_Query – > 2个查询/ – 0.012秒

正如您所看到的,性能上存在微小的差异,因此WP_Query方法很容易成为最佳选择,因为它更加动态,即使只是稍微慢一点

原文链接:https://www.f2er.com/php/134390.html

猜你在找的PHP相关文章