为什么我想做一个为期一周的搜索框来搜索有特定自定义字段的帖子。
我有一个post\\u类型-produse 带2个自定义字段
佛得角马罗culoare/alb
expndtw-1\\f2 \\emdash马里姆\\emdash 120x200、200x300
好的,我想做一个复选框,然后选择,在我选择了我想要的内容并按下搜索按钮后,我想检索我已经设置了自定义字段的帖子。
这是我在网上搜索的结果。。但这不起作用。。它将cpu加载到我的web主机上。。
<?php
$field = get_field_object(\'culoare\');
$values = explode (\',\', $_GET[\'culoare\']);
?>
<form>
<fieldset>
<legend>Cauta dupa culoare:</legend>
<?php if (!empty($field[\'choices\'])) : $i = 0; foreach( $field[\'choices\'] as $choice_value => $choice_label ): ?>
<?php $culoareIndex = strtolower($choice_value); $i ++; ?>
<input type="checkbox" name="culoare" value="<?=$choice_value?>" id="checkbox-1-<?=$i?>" class="regular-checkbox-<?=$culoareIndex?>"
<?php if( in_array($choice_value, $values) ): ?> checked="checked" <?php endif; ?> />
<label for="checkbox-1-<?=$i?>"></label>
<?php endforeach; endif; ?>
<input type="submit" value="Search" />
</fieldset>
</form>
功能。php
add_action(\'pre_get_posts\', \'my_pre_get_posts\');
function my_pre_get_posts( $query ) {
if( is_admin() ) { return; }
$meta_query = $query->get(\'meta_query\'); // get original meta query
// validate type
if( (empty($_GET[\'culoare\'])) )
{
return;
}
// get types as an array
// - use explode to get an array of values from type=a|b|c
$culori = explode(\'|\', $_GET[\'culoare\']);
// set compare for the meta_query
// - http://codex.wordpress.org/Class_Reference/WP_Query
$meta_query[\'relation\'] = \'OR\';
foreach( $culori as $culoare )
{
$meta_query[] = array(
\'key\' => \'culoare\',
\'value\' => \'"\' . $culoare . \'"\',
\'compare\' => \'LIKE\',
);
}
$query->set(\'meta_query\', $meta_query); // update the meta query args
return; // always return
}
请有人告诉我是怎么做的,并告诉我正确的方向,我对php不太在行,我希望这样做。
谢谢
SO网友:s_ha_dum
为该查询生成的SQL如下所示:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id)
WHERE 1=1
AND wp_posts.post_type = \'post\'
AND (wp_posts.post_status = \'publish\')
AND ((wp_postmeta.meta_key = \'culoare\'
AND CAST(wp_postmeta.meta_value AS CHAR) LIKE \'%\\"a\\"%\')
OR (mt1.meta_key = \'culoare\'
AND CAST(mt1.meta_value AS CHAR) LIKE \'%\\"b\\"%\')
OR (mt2.meta_key = \'culoare\'
AND CAST(mt2.meta_value AS CHAR) LIKE \'%\\"c\\"%\'))
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC LIMIT 0,10
有三件事你应该注意。首先,您的查询生成的
LIKE
条款--
\'%\\"c\\"%\'
. 在创建
meta_query
. 只需执行以下操作:
\'value\' => $culoare,
正如您所写的那样,查询将搜索表中的每一行,但不会得到任何结果。
其次LIKE
查询,尤其是使用通配符的查询%
s——不是很有效。效率低下的影响将变得更加明显$wpdb->postmeta
表变为,您尝试匹配的条件越多。
第三LIKE
使用OR
接头效率不高。查询必须查看表中的每一行才能得出结果。同样,效率低下的影响将变得更加明显$wpdb->postmeta
表变为,您尝试匹配的条件越多。
我怀疑这三个问题就是为什么“在我的web主机上加载cpu”,我想你的意思是服务器慢到爬行,超时或崩溃。
没有简单的解决方案。
尝试添加限制条件——发布日期、发布作者等限制搜索范围的内容你需要LIKE
操作人员一=
或IN
搜索可能会更快有没有什么方法可以缓存这些信息,而不是每次都进行搜索?如果有,你应该走那条路