如何创建搜索框以按自定义字段进行搜索

时间:2014-03-30 作者:WebMania

为什么我想做一个为期一周的搜索框来搜索有特定自定义字段的帖子。

我有一个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不太在行,我希望这样做。

谢谢

1 个回复
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 搜索可能会更快

结束