在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'
我不知道如何对其他列进行查询.
我认为它应该是这样的,但我不确定,因为当我使用下一个查询时,它不会返回所有记录:
SELECT Meta_value,COUNT( * ) c FROM `us_test` WHERE Meta_key = 'user_valid' GROUP BY Meta_value
就在我开始之前,你永远不应该对数据库名称进行硬编码,问题是,如果你将代码移动到具有不同数据库名称的另一个网站,你需要在所有查询中更改数据库名称,当你更改您正在使用的站点上的数据库名称.如果您忘记这一点,这可以让您进行疯狂的追逐
您应始终始终清理并验证输入数据,以确保可以安全地防止将任何恶意代码注入您的站点. 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’);对于默认帖子类型帖子的meta_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’);对于默认帖子类型帖子的meta_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个帖子的meta_key进行性能测试