Php jQuery自动完成(devbridge)Ajax服务器端服务URL搜索文件
我正在使用带有ajax选项的DevBridge jQuery自动完成插件(使用serviceURL而不是查找)。我有一个php文件,可以查询db(WordPress FYI),并获得所有结果。因此,当用户在“我的自动完成”字段中键入时,将显示所有结果,并突出显示他们的查询。显然,我的服务器端脚本应该处理搜索并仅返回基于用户即时输入的过滤结果。我只是不知道该怎么做 我在网上找到了大量的帖子,说明这是应该如何工作的,但找不到任何serviceURL文件的工作示例,该文件根据用户键入的内容返回过滤结果 这是我到目前为止的代码 我的jQueryPhp jQuery自动完成(devbridge)Ajax服务器端服务URL搜索文件,php,jquery,ajax,autocomplete,Php,Jquery,Ajax,Autocomplete,我正在使用带有ajax选项的DevBridge jQuery自动完成插件(使用serviceURL而不是查找)。我有一个php文件,可以查询db(WordPress FYI),并获得所有结果。因此,当用户在“我的自动完成”字段中键入时,将显示所有结果,并突出显示他们的查询。显然,我的服务器端脚本应该处理搜索并仅返回基于用户即时输入的过滤结果。我只是不知道该怎么做 我在网上找到了大量的帖子,说明这是应该如何工作的,但找不到任何serviceURL文件的工作示例,该文件根据用户键入的内容返回过滤结果
$('#product_sku_autocomplete').autocomplete({
serviceUrl: '/blah/blah/ajax-product-sku.php',
minChars: 1,
onSelect: function (suggestion) {
alert('You selected: ' + suggestion.value + ', ' + suggestion.data);
}
});
我的ajax-product-sku.php文件的内容。这将获取所有“产品”中自定义字段(sku)的所有元值
if ( ! defined('ABSPATH') ) {
require_once( '../../../../wp-load.php' );
}
global $wpdb;
$term = $_GET['query'];
$query = $wpdb->get_col( $wpdb->prepare( "
SELECT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = %s
AND p.post_status = %s
AND p.post_type = %s
", 'sku', 'publish', 'products' ) );
$reply = array();
$reply['query'] = $term;
$reply['suggestions'] = array();
foreach ($query as $sku) {
$reply['suggestions'][] = array(
"value" => $sku,
"data" => $sku
);
}
echo json_encode($reply);
如果我直接访问ajax-product-sku.php,结果会是
{"query":null,"suggestions":[{"value":"52N242","data":"52N242"},{"value":"52F230","data":"52F230"},{"value":"52F235","data":"52F235"}]}
因此,我得到了结果的完整列表(据我所知,格式正确),自动完成字段会检索这些结果,但当您在自动完成字段中键入时,它会显示所有结果,而不仅仅是与用户键入的结果相匹配的结果
我怀疑我需要在db$query语句中的某个地方添加$term var,但不确定如何添加。非常感谢您的帮助。我想我已经得到了。非常简单的解决方案,但我的sql切块明显不足。需要向sql语句中添加类似的条件。下面是修改后的ajax-product-sku.php文件内容 如果有人从编码或性能的角度有更有效的方法来处理这个问题,我欢迎大家了解 ajax-product-sku.php
if ( ! defined('ABSPATH') ) {
require_once( '../../../../wp-load.php' );
}
global $wpdb;
$term = $_GET['query']; // this is the var that autocomplete sends as users type.
//$term = '1';
$query = $wpdb->get_col( $wpdb->prepare( "
SELECT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = %s
AND p.post_status = %s
AND p.post_type = %s
AND pm.meta_value LIKE '%{$term}%'
", 'sku', 'publish', 'products' ) );
$reply = array();
$reply['query'] = $term;
$reply['suggestions'] = array();
foreach ($query as $sku) {
$reply['suggestions'][] = array(
"value" => $sku,
"data" => $sku
);
}
echo json_encode($reply);
我想我明白了。非常简单的解决方案,但我的sql切块明显不足。需要向sql语句中添加类似的条件。下面是修改后的ajax-product-sku.php文件内容 如果有人从编码或性能的角度有更有效的方法来处理这个问题,我欢迎大家了解 ajax-product-sku.php
if ( ! defined('ABSPATH') ) {
require_once( '../../../../wp-load.php' );
}
global $wpdb;
$term = $_GET['query']; // this is the var that autocomplete sends as users type.
//$term = '1';
$query = $wpdb->get_col( $wpdb->prepare( "
SELECT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = %s
AND p.post_status = %s
AND p.post_type = %s
AND pm.meta_value LIKE '%{$term}%'
", 'sku', 'publish', 'products' ) );
$reply = array();
$reply['query'] = $term;
$reply['suggestions'] = array();
foreach ($query as $sku) {
$reply['suggestions'][] = array(
"value" => $sku,
"data" => $sku
);
}
echo json_encode($reply);