按自定义帖子类型在帖子页面上进行AJAX搜索

时间:2012-08-22 作者:Pollux Khafra

我在我的单个帖子页面上创建ajax搜索时遇到了一个问题。我需要将搜索结果限制为自定义帖子类型“fod\\U视频”和“帖子”以及类别12。我的问题是,搜索将返回这些过滤器下的所有帖子,而不使用搜索值。我想我遗漏了一些明显的东西,但我无法找出答案。这是我的设置。

<div class="panel">
  <h2>Search Videos</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="Search" />
   </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\' )
    )
 );
}
//搜索。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 );
        }
    );
 });
});
//视频搜索结果。php

<?php
 while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
   //STUFF
<?php endwhile; ?>

2 个回复
最合适的回答,由SO网友:fuxia 整理而成

而不是\'cat\' => 12$wp_query 使用\'category_name\' => slugget_posts().

以下是其工作原理的基本示例:

PHP

add_action( \'wp_loaded\', array ( \'T5_Ajax_Search\', \'init\' ) );

/**
 * Ajaxify the search form.
 */
class T5_Ajax_Search
{
    /**
     * The main instance. You can create further instances for unit tests.
     * @type object
     */
    protected static $instance = NULL;

    /**
     * Action name used by AJAX callback handlers
     * @type string
     */
    protected $action = \'t5_ajax_search\';

    /**
     * Handler for initial load.
     *
     * @wp-hook wp_loaded
     * @return void
     */
    public static function init()
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    /**
     * Constructor. Registers the actions.
     *
     *  @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 for AJAX search.
     *
     * @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>nothing found</b>\';
        }
        exit;
    }

    /**
     * Create markup from $posts
     *
     * @param array $posts Array of post objects
     * @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>\';
    }

    /**
     * Register script and local variables.
     *
     * @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
            )
        );
    }
}

JavaScriptsearch.js

jQuery( function( $ ) {
    // search filed
    var $s = $( \'#s\' );
    // the search form
    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 ) {
                // just append the result to the search form.
                $sForm.append( response );
            }
        );
    });
});

限制搜索

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;
}

而不是我的$this->render_search_results( $posts ); 您还可以从主题中加载模板,并使用$posts 更复杂的结果中的数组。:)

SO网友:user142428

我使用了原始代码,但是使用了自定义的post类型(没有类别)。使用您的帖子类型在表单中添加隐藏输入,如下所示:

<input type="hidden" name="post_type" value="fod_videos" />

结束

相关推荐

使用AJAX的自定义登录不能与IE一起使用

我使用wp\\u登录功能在wordpress中自定义登录。每当用户输入其凭据时,就会使用ajax调用另一个页面。在该页面中,我检查用户凭据,并使用wp\\u登录功能登录用户。然后发送确认信息,当前页面将捕获该信息并显示用户已成功登录。该代码在Chrome和Firefox中可用,但在IE中不起作用。这是AJAX文件中的代码。当前页面收到一个响应,表示用户已登录,但当我刷新时,它仍显示用户未登录(挣扎了几天,请帮帮我$creds = array(); $creds[\'user_login\'] =