meta_value 保存为序列化 key/value 时如何使用 WordPress 元查询
How to use WordPress metaquery when meta_value is saved as serialized key/value
我正在从事 WordPress 项目,这需要我操作现有插件的 WP_Query
在前端,我有 3 个下拉列表,其中 2 个我使用 tax_query 自定义并使用插件的 filter ,我不知道如何使用 meta_query 进行自定义(查看屏幕截图)
<?php
add_filter( 'learndash_ld_course_list_query_args', 'filter__learndash_ld_course_list_query_args', 10, 2 );
function filter__learndash_ld_course_list_query_args( $filter, $atts ) {
if ( ! isset( $filter['tax_query'] ) ) {
$filter['tax_query'] = array();
}
if ( ! isset( $filter['meta_query'] ) ) {
$filter['meta_query'] = array();
}
if ( isset( $_GET['catid'] ) && ! empty( $_GET['catid'] ) ) {
$filter['tax_query'][] = array(
'taxonomy' => 'ld_course_category',
'field' => 'term_id',
'terms' => intval( $_GET['catid'] ),
);
}
if ( isset( $_GET['taxid'] ) && ! empty( $_GET['taxid'] ) ) {
$filter['tax_query'][] = array(
'taxonomy' => $atts['course_taxonomy'],
'field' => 'term_id',
'terms' => intval( $_GET['taxid'] ),
);
}
if ( isset( $_GET['priceid'] ) && ! empty( $_GET['priceid'] ) ) {
$filter['meta_query'][] = array(
'key' => '_sfwd-courses',
'value' => '',
'compare' => 'LIKE',
);
}
if ( count( $filter['tax_query'] ) > 1 ) {
$filter['tax_query']['relation'] = 'AND';
}
//echo "<pre>"; print_r($filter);
return $filter;
}
但我卡在了 meta_query 中,因为它将数据存储在 serialize 数组中(查看屏幕截图)
这里应该写什么来比较'value' => '',
??
你将不得不在值 周围使用 LIKE 运算符 和 %…% (实际上,对于 WP_Query 你不需要自己插入,将运算符设置为 LIKE
,WP 将自动将 %…%
放在值本身周围),以找到部分匹配。至于要匹配什么 - 只是 %free%
或 %"free"%
可能不是一个好主意,因为如果序列化数组中的任何其他属性可能包含 [=14=,那么你会得到误报] 还有。
所以您可能也应该在此处包含密钥 - 但是您还必须包含中间部分,这意味着 s:4
部分也需要动态化。需要的数字可以很容易地由 strlen($_GET['priceid'])
确定
我正在从事 WordPress 项目,这需要我操作现有插件的 WP_Query
在前端,我有 3 个下拉列表,其中 2 个我使用 tax_query 自定义并使用插件的 filter ,我不知道如何使用 meta_query 进行自定义(查看屏幕截图)
<?php
add_filter( 'learndash_ld_course_list_query_args', 'filter__learndash_ld_course_list_query_args', 10, 2 );
function filter__learndash_ld_course_list_query_args( $filter, $atts ) {
if ( ! isset( $filter['tax_query'] ) ) {
$filter['tax_query'] = array();
}
if ( ! isset( $filter['meta_query'] ) ) {
$filter['meta_query'] = array();
}
if ( isset( $_GET['catid'] ) && ! empty( $_GET['catid'] ) ) {
$filter['tax_query'][] = array(
'taxonomy' => 'ld_course_category',
'field' => 'term_id',
'terms' => intval( $_GET['catid'] ),
);
}
if ( isset( $_GET['taxid'] ) && ! empty( $_GET['taxid'] ) ) {
$filter['tax_query'][] = array(
'taxonomy' => $atts['course_taxonomy'],
'field' => 'term_id',
'terms' => intval( $_GET['taxid'] ),
);
}
if ( isset( $_GET['priceid'] ) && ! empty( $_GET['priceid'] ) ) {
$filter['meta_query'][] = array(
'key' => '_sfwd-courses',
'value' => '',
'compare' => 'LIKE',
);
}
if ( count( $filter['tax_query'] ) > 1 ) {
$filter['tax_query']['relation'] = 'AND';
}
//echo "<pre>"; print_r($filter);
return $filter;
}
但我卡在了 meta_query 中,因为它将数据存储在 serialize 数组中(查看屏幕截图)
这里应该写什么来比较'value' => '',
??
你将不得不在值 周围使用 LIKE 运算符 和 %…% (实际上,对于 WP_Query 你不需要自己插入,将运算符设置为 LIKE
,WP 将自动将 %…%
放在值本身周围),以找到部分匹配。至于要匹配什么 - 只是 %free%
或 %"free"%
可能不是一个好主意,因为如果序列化数组中的任何其他属性可能包含 [=14=,那么你会得到误报] 还有。
所以您可能也应该在此处包含密钥 - 但是您还必须包含中间部分,这意味着 s:4
部分也需要动态化。需要的数字可以很容易地由 strlen($_GET['priceid'])