Ajax 包含来自高级自定义字段的数据的搜索功能
Ajax search functionality that includes data from Advanced Custom Fields
我正在尝试在 Wordpress 中创建一个搜索功能,该功能使用 AJAX 来显示 post 和自定义 post 类型。到目前为止,我已经设法让几乎所有的东西都按我想要的方式工作,但是搜索使用高级自定义字段输出的内容不会显示在 AJAX 结果中。
例如;我知道在我的一个 post 中提到了 "Skittles",但是当我搜索 "Skittles" 时,在 AJAX 结果中什么也找不到。但是,如果我按回车键并最终出现在单独的搜索结果页面,则会找到包含单词 "Skittles" 的 post,但这不是我想要的行为。
下面的代码使自定义字段可搜索。结果显示在 Wordpress 自己的搜索结果页面上。
/**
* Finds custom fields meta data in search results
* http://adambalee.com
*/
function cf_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
return $join;
}
add_filter('posts_join', 'cf_search_join' );
function cf_search_where( $where ) {
global $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE ) OR (".$wpdb->postmeta.".meta_value LIKE )", $where );
}
return $where;
}
add_filter( 'posts_where', 'cf_search_where' );
function cf_search_distinct( $where ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );
但我不希望人们最终进入 Wordpress 自己的搜索结果页面。
这是我用于 AJAX 搜索的代码:
/**
* Adding ajax search functionality to the theme
* @return
*/
function dhemy_ajax_search() { // creating a search query
$args = array(
'post_type' => array('case', 'post'),
'post_status' => 'publish',
'order' => 'DESC',
'orderby' => 'date',
's' => $_POST['term'],
'posts_per_page' => 9999
);
$query = new WP_Query($args);
if($query->have_posts()) { // display results
while ($query->have_posts()) { $query->the_post(); ?>
<?php if(get_post_type() == 'case' ) { ?>
<?php // code output for the cpt called 'case' ?>
<?php } else { ?>
<?php // code output for regular posts ?>
<?php } ?>
<?php }
} else { ?>
<?php // code output for when there are no hits ?>
<?php } exit;
}
add_action('wp_ajax_nopriv_dhemy_ajax_search', 'dhemy_ajax_search');
add_action('wp_ajax_dhemy_ajax_search', 'dhemy_ajax_search');
连同 javascript:
$('#bigsearch').keyup(function(event) {
var searchTerm = $(this).val(); // get search term
if(!searchTerm.trim()) {
$('.search_overlay .flow .wrap .post_row').html('');
return;
}
else if(searchTerm.length > 0) { // send request when the lenght is greater than 0 letters
$.ajax({
url: BASE+'/wp-admin/admin-ajax.php',
type: "post",
data: {
'action':'dhemy_ajax_search',
'term':searchTerm
},
success: function(result) {
$('.search_overlay .flow .wrap .post_row').fadeIn().html(result);
}
});
}
});
是否可以在 WP_query
的 $args
中包含来自自定义字段的数据?或者是否可以将第一个功能与实际的搜索功能结合起来?
问题出在 Adam Balée 的代码中。他的代码完成了这项工作,但前提是它是 is_search
而不是我的情况。我所做的是从函数中删除 if ( is_search() ) {}
语句并且它起作用了。所以,最终的代码是:
/**
* Finds custom fields meta data in search results
* http://adambalee.com
*/
function cf_search_join( $join ) {
global $wpdb;
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
return $join;
}
add_filter('posts_join', 'cf_search_join' );
function cf_search_where( $where ) {
global $wpdb;
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE ) OR (".$wpdb->postmeta.".meta_value LIKE )", $where );
return $where;
}
add_filter( 'posts_where', 'cf_search_where' );
function cf_search_distinct( $where ) {
global $wpdb;
return "DISTINCT";
return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );
非常感谢 Mattias Haal 帮助我实现了这一点。
我正在尝试在 Wordpress 中创建一个搜索功能,该功能使用 AJAX 来显示 post 和自定义 post 类型。到目前为止,我已经设法让几乎所有的东西都按我想要的方式工作,但是搜索使用高级自定义字段输出的内容不会显示在 AJAX 结果中。
例如;我知道在我的一个 post 中提到了 "Skittles",但是当我搜索 "Skittles" 时,在 AJAX 结果中什么也找不到。但是,如果我按回车键并最终出现在单独的搜索结果页面,则会找到包含单词 "Skittles" 的 post,但这不是我想要的行为。
下面的代码使自定义字段可搜索。结果显示在 Wordpress 自己的搜索结果页面上。
/**
* Finds custom fields meta data in search results
* http://adambalee.com
*/
function cf_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
return $join;
}
add_filter('posts_join', 'cf_search_join' );
function cf_search_where( $where ) {
global $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE ) OR (".$wpdb->postmeta.".meta_value LIKE )", $where );
}
return $where;
}
add_filter( 'posts_where', 'cf_search_where' );
function cf_search_distinct( $where ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );
但我不希望人们最终进入 Wordpress 自己的搜索结果页面。
这是我用于 AJAX 搜索的代码:
/**
* Adding ajax search functionality to the theme
* @return
*/
function dhemy_ajax_search() { // creating a search query
$args = array(
'post_type' => array('case', 'post'),
'post_status' => 'publish',
'order' => 'DESC',
'orderby' => 'date',
's' => $_POST['term'],
'posts_per_page' => 9999
);
$query = new WP_Query($args);
if($query->have_posts()) { // display results
while ($query->have_posts()) { $query->the_post(); ?>
<?php if(get_post_type() == 'case' ) { ?>
<?php // code output for the cpt called 'case' ?>
<?php } else { ?>
<?php // code output for regular posts ?>
<?php } ?>
<?php }
} else { ?>
<?php // code output for when there are no hits ?>
<?php } exit;
}
add_action('wp_ajax_nopriv_dhemy_ajax_search', 'dhemy_ajax_search');
add_action('wp_ajax_dhemy_ajax_search', 'dhemy_ajax_search');
连同 javascript:
$('#bigsearch').keyup(function(event) {
var searchTerm = $(this).val(); // get search term
if(!searchTerm.trim()) {
$('.search_overlay .flow .wrap .post_row').html('');
return;
}
else if(searchTerm.length > 0) { // send request when the lenght is greater than 0 letters
$.ajax({
url: BASE+'/wp-admin/admin-ajax.php',
type: "post",
data: {
'action':'dhemy_ajax_search',
'term':searchTerm
},
success: function(result) {
$('.search_overlay .flow .wrap .post_row').fadeIn().html(result);
}
});
}
});
是否可以在 WP_query
的 $args
中包含来自自定义字段的数据?或者是否可以将第一个功能与实际的搜索功能结合起来?
问题出在 Adam Balée 的代码中。他的代码完成了这项工作,但前提是它是 is_search
而不是我的情况。我所做的是从函数中删除 if ( is_search() ) {}
语句并且它起作用了。所以,最终的代码是:
/**
* Finds custom fields meta data in search results
* http://adambalee.com
*/
function cf_search_join( $join ) {
global $wpdb;
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
return $join;
}
add_filter('posts_join', 'cf_search_join' );
function cf_search_where( $where ) {
global $wpdb;
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE ) OR (".$wpdb->postmeta.".meta_value LIKE )", $where );
return $where;
}
add_filter( 'posts_where', 'cf_search_where' );
function cf_search_distinct( $where ) {
global $wpdb;
return "DISTINCT";
return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );
非常感谢 Mattias Haal 帮助我实现了这一点。