你得到所有的条件,因为你要求所有的条件,事实上
$tradeList = get_terms(\'trade\');
只需获取所有术语,忽略传递到文件的“term”查询字符串。
如果要获取所有术语“filterd”,必须在查询中使用字符串,例如:
include_once( \'../../../wp-load.php\' ); // adjust the path, of course
// or dirname( dirname( dirname( __FILE__ ) ) ) . \'/wp-load.php\';
$term = filter_input( INPUT_GET, \'term\', FILTER_SANITIZE_STRING );
if ( empty( $term ) ) exit();
$trades = get_terms( \'trade\', array( \'name__like\' => $term, \'fields\' => \'names\' ) );
if ( ! empty( $trades ) && is_array( $trades ) ) {
echo json_encode( $trades );
}
也就是说,请注意,通过使用OP中的设置,每次用户在输入字段中键入一个字符时,都会有一个对服务器的ajax请求,因此如果用户在做出选择之前键入4个字母,您将有4个额外的http请求,这样代码很容易成为服务器杀手。
所以,如果你想使用这种方法,至少使用更高的minLength
论点
另一种方法是获取所有术语,将其输出为javascript数组,并让脚本进行过滤,例如:
$(document).ready(function() {
var trades = <?php
$trades = get_terms( \'trade\', array( \'fields\' => \'names\' ) );
echo \'["\' . implode( \'","\', $trades ) . \'"]\';
?>;
$(".main-search-field").autocomplete({
source: trades,
minLength: 1
});
});
这样做没有额外的http请求,也不需要任何
autocomplete.php
除非你有数千个交易条款,否则这种方法可能更好。
注:在第一种方法中,大致包括wp-load.php
这是一种不好的做法,我知道你这样做是为了“不增加服务器的开销”,但坏消息是服务器的开销并没有以这种方式减少很多:你将加载所有WordPress环境、所有插件和主题。此外,请注意,这会使您的代码不适合共享。如果代码仅适用于您,并且您确实希望使用此方法,请搜索SHORTINIT
常量及其用法(开始here) 和加载wp-load.php
硬编码位置路径(就像我做的那样),因为$_SERVER[\'DOCUMENT_ROOT\']
价格不合理,可能不是预期值,具体取决于服务器的配置方式。
我建议的第二种方法可以避免wp-load.php
这个问题,也使您的服务器避免了大量请求,但javascript中的PHP代码回荡真的很糟糕,我在这个答案中只是为了简单起见才使用它。您应该将javascript代码放在一个单独的js文件中,并使用wp_localize_script
.