Configuré un campo de búsqueda donde un usuario busca bienes y servicios usando el autocompletado de jquery.
Funciona muy bien al obtener las publicaciones de mi base de datos de wordpress, pero está extrayendo cada publicación de la tabla wp_posts.
Entonces, está extrayendo publicaciones de otros tipos de publicaciones, no solo la que quiero, que es bienes y servicios.
function my_search() {
global $post;
ob_start();
$term = strtolower( $_GET['term'] );
$suggestions = array();
$args = array(
'post_type' => 'goods_services',
'posts_per_page' => '-1'
);
$query = new WP_Query( 's=" . $term, $args );
if ( $query->have_posts() ) {
while( $query->have_posts() ) {
$query->the_post();
$suggestion = array();
$suggestion["label'] = get_the_title();
$suggestion['category'] = get_field('service_class');
$suggestions[] = $suggestion;
}
$response = ob_get_clean();
wp_reset_postdata();
$response = json_encode( $suggestions );
echo $response;
exit();
}
}
add_action( 'wp_ajax_my_search', 'my_search' );
add_action( 'wp_ajax_nopriv_my_search', 'my_search' );
Ese es mi código en mi functions.php para llamar a mi consulta de búsqueda de formulario.
Este es el código de autocompletado de mi formulario de búsqueda. Tiene un montón de cosas de renderización personalizadas agregadas, pero la fuente está obteniendo ese fragmento de functions.php.
(function( $ ) {
$(function() {
var url = MyAutocomplete.url + "?action=my_search";
function split( val ) {
return val.split( /,s*/ );
}
function extractLast( term ) {
return split( term ).pop();
}
function log( message ) {
var dataClass = message.split(':');
$( "<li class="selected-results_item">" ).attr( "data-id", message ).attr("data-class", dataClass[0]).text( message ).prependTo( ".selected-results" );
}
// Wrap Search Results Groups
function wrapSearchCategory() {
var categories = {};
$('.search-results > ul > li').each(function(){
categories[$(this).data('class')] = "";
});
for (category in categories) {
$('.search-results > ul > li').filter('[data-class="'+ category +'"]').wrapAll('<div class="results-group ready" data-class="'+ category +'"></div');
}
}
// Wrap Results Groups
function wrapResultsCategory() {
var resultsItem = $('.selected-results_item').data('class');
if ($('.selected-results div[data-class="'+resultsItem+'"]').length) {
$('.selected-results_item[data-class="'+resultsItem+'"]').appendTo('.selected-results > .results-group[data-class="'+resultsItem+'"]');
}
else {
var categories = {};
$('.selected-results > .selected-results_item').each(function(){
categories[$(this).data('class')] = "";
});
for (category in categories) {
$('.selected-results > .selected-results_item').filter('[data-class="'+ category +'"]').wrapAll('<div class="results-group" data-class="'+ category +'"></div');
}
}
// Add category title to groups
$(".selected-results > .results-group").each(function() {
if ($(this).children('.results-category').length){
return false;
}
else {
$(this).prepend('<li class="results-category" data-class="'+ category +'">'+ category +'<span class="show-more"></span></li>');
}
});
// Add category title to groups
$(".selected-results > .results-group").each(function() {
if ($(this).children('.results-category').length){
return false;
}
else {
$(this).prepend('<li class="results-category" data-class="'+ category +'">'+ category +'<span class="show-more"></span></li>');
}
});
}
// Show class category
$.widget( "custom.catcomplete", $.ui.autocomplete, {
_create: function() {
this._super();
this.widget().menu( "option", "items", "> :not(.results-category)" );
},
_renderMenu: function( ul, items ) {
var that = this,
currentCategory = "";
$.each( items, function( index, item ) {
var li;
if ( item.category != currentCategory ) {
ul.append( "<li class="results-category" data-class=""+ item.category +"">" + item.category + "<span class="show-more"></span></li>" );
currentCategory = item.category;
}
li = that._renderItemData( ul, item );
if ( item.category ) {
li.attr( "data-item", item.category + ": " + item.label );
}
});
},
_renderItem: function( ul, item ) {
return $( "<li>" )
.attr( "data-class", item.category )
.attr( "data-value", item.value )
.append( $( "<a>" ).text( item.label ) )
.appendTo( ul );
}
});
$("#autocomplete")
// don't navigate away from the field on tab when selecting an item
.on( "keydown", function( event ) {
if ( event.keyCode === $.ui.keyCode.TAB &&
$( this ).autocomplete( "instance" ).menu.active ) {
event.preventDefault();
}
})
.catcomplete({
source: url,
appendTo: ".search-results",
search: function() {
// custom minLength
var term = extractLast( this.value );
if ( term.length < 2 ) {
return false;
}
setTimeout(function() {
wrapSearchCategory();
}, 1000);
},
focus: function() {
// prevent value inserted on focus
return false;
},
select: function( event, ui ) {
log(ui.item.category + ': ' + ui.item.value);
setTimeout(function() {
wrapResultsCategory();
update();
}, 150);
return false;
},
close: function (event, ui) {
if (!$("ul.ui-autocomplete").is(":visible")) {
$("ul.ui-autocomplete").show();
}
}
});
});
})( jQuery );
no entiendo porque mi $query
no está tirando de los argumentos de post_type. Es casi ignorarlo por completo.
.