如何查询wp_options表中what_is_this值为product的所有标签?
获取
what_is_this值为product的标签方法 方法一:直接数据库查询
你的标签额外数据以tag_(标签ID)为键存在wp_options表中,且option_value是序列化后的数组,可通过以下SQL语句查询:
SELECT SUBSTRING(option_name, 4) AS tag_id, option_value FROM wp_options WHERE option_name LIKE 'tag\_%' AND option_value LIKE '%s:12:"what_is_this";s:7:"product";%'
tag\_%用于精准匹配以tag_开头的选项名(转义下划线是因为LIKE语法中_是通配符)SUBSTRING(option_name, 4)从tag_XXX中提取出标签ID- 第二个LIKE条件匹配序列化后包含
what_is_this => product的字段值
方法二:WordPress原生函数实现(推荐)
直接操作数据库存在安全风险,更推荐用WordPress内置函数处理,代码如下:
global $wpdb; // 获取所有tag_开头的选项 $tag_options = $wpdb->get_results( "SELECT option_name, option_value FROM {$wpdb->options} WHERE option_name LIKE 'tag\_%'" ); $target_tags = []; foreach ( $tag_options as $option ) { // 反序列化选项值为数组 $tag_meta = maybe_unserialize( $option->option_value ); // 检查目标字段是否符合条件 if ( isset( $tag_meta['what_is_this'] ) && $tag_meta['what_is_this'] === 'product' ) { // 提取标签ID $tag_id = (int) str_replace( 'tag_', '', $option->option_name ); // 获取完整的标签对象 $tag = get_term( $tag_id, 'post_tag' ); if ( $tag && ! is_wp_error( $tag ) ) { $target_tags[] = $tag; } } } // 遍历输出结果示例 foreach ( $target_tags as $tag ) { echo "标签ID:{$tag->term_id},标签名:{$tag->name}<br>"; }
优化建议:迁移到Termmeta表
当前把标签元数据存在wp_options不是WordPress的标准做法,标准应该用termmeta表。你可以用以下代码迁移数据,之后查询会更高效:
global $wpdb; $tag_options = $wpdb->get_results( "SELECT option_name, option_value FROM {$wpdb->options} WHERE option_name LIKE 'tag\_%'" ); foreach ( $tag_options as $option ) { $tag_id = (int) str_replace( 'tag_', '', $option->option_name ); $tag_meta = maybe_unserialize( $option->option_value ); // 将元数据写入termmeta表 foreach ( $tag_meta as $key => $value ) { update_term_meta( $tag_id, $key, $value ); } // 删除旧的options数据(可选) delete_option( $option->option_name ); }
迁移完成后,只需一行代码即可查询目标标签:
$target_tags = get_terms( [ 'taxonomy' => 'post_tag', 'meta_query' => [ [ 'key' => 'what_is_this', 'value' => 'product', 'compare' => '=' ] ] ] );
内容的提问来源于stack exchange,提问作者bpy
相关产品推荐
相关产品推荐

