我在mysql数据库中有一个带有键“app\\u I\\u have”的元字段和值,如:a:3:{i:0;s:14:"mobile studio";i:1;s:12:"own studio";i:2;s:9:"makeup artist";}
现在,我想通过pre\\u get\\u posts挂钩查询帖子,如下所示:
add_action( \'pre_get_posts\', \'rt_tax_archive\' );
function rt_tax_archive($query) {
if (is_admin()) {
return; /* If we\'re in the admin panel - drop out */
}
global $wp_query;
//For searching
if ($query->is_main_query() && isset($_GET[\'ls\'])) {
$rt_field_id_i_have = $_GET[\'listing_i_have\'];
//Filter posts by what they have
if (isset($rt_field_id_i_have) &&
!empty($rt_field_id_i_have[0])) {
$meta_query[] = array(
\'key\'=>\'app_i_have\',
\'value\'=>$rt_field_id_i_have[0],
\'compare\'=>\'LIKE\',
);
}
$query->set(\'meta_query\', $meta_query);
}
}
这是可行的,但当我想筛选具有“own studio”等功能的人时
\'compare\'=>\'LIKE\'
还向人们展示了一个“移动工作室”。我猜是因为“工作室”这个词在里面。
在这种情况下,如何正确过滤帖子?谢谢
SO网友:jaswrks
如果查询字符串包含,如您所说:
listing_i_have=own%20studio
它不起作用,因为$rt_field_id_i_have[0]
等于字符串中的第一个字符(它不是数组),它是字符串。这个0
index position 是这封信吗o
, 这与很多事情都相匹配。
您可以像这样添加适当的元查询。
<?php
function rt_tax_archive($query) {
if (is_admin()) {
return;
} elseif ( ! $query->is_main_query() ) {
return;
} elseif ( ! isset( $_GET[\'ls\'] ) ) {
return;
} elseif ( empty( $_GET[\'listing_i_have\'] ) ) {
return;
} elseif ( ! is_string( $_GET[\'listing_i_have\'] ) ) {
return;
}
$rt_field_id_i_have = wp_unslash( $_GET[\'listing_i_have\'] );
$rt_field_id_i_have = sanitize_text_field( $rt_field_id_i_have );
$query->set(\'meta_query\', array(
\'key\' => \'app_i_have\',
\'value\' => $rt_field_id_i_have,
\'compare\'=> \'LIKE\',
));
}
add_action( \'pre_get_posts\', \'rt_tax_archive\' );
值得注意的是
LIKE
, WordPress
automatically wraps 内部的值
%[value]%
, 因此,您不需要自己包含类似的通配符。你没有这么做,只是想让我为子孙后代提及这一点。