Căutare AJAX pe paginile de postări după tip personalizat
22 aug. 2012, 22:58:43
Vizualizări: 14.9K
Voturi: 8
Am o problemă în crearea unei căutări AJAX pe paginile mele de postări individuale. Trebuie să limitez rezultatele căutării la tipurile de postări personalizate "fod_videos" și "post" și la categoria 12. Problema este că căutarea returnează toate postările sub acești filtri și nu ține cont de valoarea căutată. Cred că îmi scapă ceva evident dar nu reușesc să-mi dau seama. Iată configurația mea.
<div class="panel">
<h2>Căutare Videoclipuri</h2>
<div id="my-search">
<form role="search" method="get" id="searchform" action="http://myurl.com/" >
<input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Căutare" />
</form>
</div>
</div>
add_action('wp_ajax_wpa5000_search', 'wpa5000_search');
add_action('wp_ajax_nopriv_wpa5000_search', 'wpa5000_search');
function wpa5000_search(){
global $wp_query;
$search = $_POST['search_val'];
$args = array(
's' => $search,
'posts_per_page' => 10,
'cat' => 12,
'post_type' => array( 'post','fod_videos' )
);
$wp_query = new WP_Query( $args );
get_template_part( 'video-search-results' );
exit;
}
add_action( 'wp_enqueue_scripts', 'wpa56343_scripts', 100 );
function wpa56343_scripts() {
wp_enqueue_script(
'wpa56343_script',
get_template_directory_uri() . '/libs/search.js?ver=1.0',
array( 'jquery' ),
null,
false
);
wp_localize_script(
'wpa56343_script',
'WPaAjax',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' )
)
);
}
// search.php
$(document).ready(function($){
$('#searchsubmit').click(function(e){
var $panel = $(this).closest(".panel");
$panel.empty();
e.preventDefault();
var search_val=$("#s").val();
$.post(
WPaAjax.ajaxurl,
{
action : 'wpa5000_search',
search_val : search_val
},
function( response ) {
$panel.append( response );
}
);
});
});
//video-search-results.php
<?php
while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
//CONȚINUT
<?php endwhile; ?>

Pollux Khafra
888
Comentarii
Toate răspunsurile la întrebare
2
0
JavaScript
În loc de 'cat' => 12
și $wp_query
folosește 'category_name' => slug
și get_posts()
.
Iată un exemplu de bază despre cum funcționează:
PHP
add_action( 'wp_loaded', array ( 'T5_Ajax_Search', 'init' ) );
/**
* Face căutarea să funcționeze prin AJAX.
*/
class T5_Ajax_Search
{
/**
* Instanța principală. Poți crea instanțe suplimentare pentru teste unitare.
* @type object
*/
protected static $instance = NULL;
/**
* Numele acțiunii folosit de handler-ele de callback AJAX
* @type string
*/
protected $action = 't5_ajax_search';
/**
* Handler pentru încărcarea inițială.
*
* @wp-hook wp_loaded
* @return void
*/
public static function init()
{
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
/**
* Constructor. Înregistrează acțiunile.
*
* @wp-hook wp_loaded
* @return object
*/
public function __construct()
{
$callback = array ( $this, 'search' );
add_action( 'wp_ajax_' . $this->action, $callback );
add_action( 'wp_ajax_nopriv_' . $this->action, $callback );
add_action( 'wp_enqueue_scripts', array ( $this, 'register_script' ) );
}
/**
* Callback pentru căutarea AJAX.
*
* @wp-hook wp_ajax_t5_ajax_search
* @wp-hook wp_ajax_nopriv_t5_ajax_search
* @return void
*/
public function search()
{
$args = array ( 's' => $_POST['search_term'] );
$args = apply_filters( 't5_ajax_search_args', $args );
$posts = get_posts( $args );
if ( $posts )
{
$this->render_search_results( $posts );
}
else
{
print '<b>nimic găsit</b>';
}
exit;
}
/**
* Creează markup din $posts
*
* @param array $posts Array de obiecte post
* @return void
*/
protected function render_search_results( $posts )
{
print '<ul class="t5-ajax-search-results">';
foreach ( $posts as $post )
{
printf(
'<li><a href="%1$s">%2$s</a></li>',
get_permalink( $post->ID ),
esc_html( $post->post_title )
);
}
print '</ul>';
}
/**
* Înregistrează scriptul și variabilele locale.
*
* @wp-hook wp_enqueue_scripts
* @return void
*/
public function register_script()
{
wp_enqueue_script(
't5-ajax',
#plugins_url( __FILE__ ) . '/search.js',
plugins_url( 'search.js', __FILE__ ),
array ( 'jquery' ),
NULL,
TRUE
);
wp_localize_script(
't5-ajax',
'T5Ajax',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'action' => $this->action
)
);
}
}
JavaScript search.js
jQuery( function( $ ) {
// câmpul de căutare
var $s = $( '#s' );
// formularul de căutare
var $sForm = $s.closest( 'form' );
console.log( $sForm );
$sForm.on( 'submit', function( event) {
event.preventDefault();
$.post(
T5Ajax.ajaxurl,
{
action: T5Ajax.action,
search_term: $s.val()
},
function( response ) {
// doar adaugă rezultatul la formularul de căutare.
$sForm.append( response );
}
);
});
});
Restricționarea căutării
add_filter( 't5_ajax_search_args', 'restrict_t5_search' );
function restrict_t5_search( $args )
{
$args['post_type'] = array ( 'post', 'fod_videos' );
$args['category_name'] = 'category-slug';
return $args;
}
În loc de $this->render_search_results( $posts );
poți încărca un template din tema ta și folosi array-ul $posts
într-un rezultat mai sofisticat. :)

fuxia
107K
25 aug. 2012 02:49:44
Întrebări similare
2
răspunsuri
4
răspunsuri
2
răspunsuri