web-dev-qa-db-fra.com

Problèmes de modèle lors de l'obtention des résultats de la recherche ajax

J'essaie de mettre les résultats de recherche dans une div avec ajax. Le problème est que je reçois des erreurs disant undefined function have_posts() lors de l’accès au modèle de recherche. Il a également été mis en cause avec get_header() qui était dans le search-results.php mais je l'ai enlevé. Voici comment je l'ai configuré.

  <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 id="results"></div>
  <script type="text/javascript">
    $(document).ready(function(){
    $("#searchsubmit").click(function(e){
     e.preventDefault();
     var search_val=$("#s").val(); 
     $.post('http://mysite.com/wp-content/themes/beta/search-results.php',{search_string:search_val},function(data){
        if(data.length>0){
            $("#results").html(data);
        }
     });
    });   
   });
  </script>

Et voici le modèle search-results.php. Je me demande si je ne transmets peut-être pas les résultats de la recherche au modèle.

<ul>
 <?php if (have_posts()) : while (have_posts()) : the_post();  ?>
  <li><a title="Permalink to this post" href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a></li>

 <?php endwhile; endif; ?>
 <?php if (!have_posts()) { echo('<li>No results to show.</li>'); } ?>
</ul>
6
Pollux Khafra

Lorsque vous chargez un fichier de modèle directement de cette manière, vous ne chargez pas l'environnement WordPress. Aucune fonction WordPress n'est donc disponible.

Vous avez le choix entre charger la page de recherche sur le frontal et filtrer le résultat, comme suit:

$('#results').load('http://mysite.com/?s=searchterm ul#target');

Ou créez une fonction de recherche à l'aide de la fonctionnalité AJAX fournie par WordPress, voir AJAX dans Plugins .

EDIT

Voici un exemple de la façon dont je charge des publications supplémentaires via AJAX que vous pouvez adapter pour créer une fonction de recherche si vous le souhaitez.

Premièrement, dans functions.php, je mets en file d'attente mon javascript et localise le script pour transmettre l'URL AJAX qui traitera mes demandes. WordPress AJAX utilise admin-ajax.php pour traiter toutes les demandes AJAX, frontales ou principales:

add_action( 'wp_enqueue_scripts', 'wpa56343_scripts', 100 );

function wpa56343_scripts() {
    wp_enqueue_script(
        'wpa56343_script',
        get_template_directory_uri() . '/js/scripts.js?ver=1.0',
        array( 'jquery' ),
        null,
        false
    );
    wp_localize_script(
        'wpa56343_script',
        'WPaAjax',
        array(
            'ajaxurl' => admin_url( 'admin-ajax.php' )
        )
    );
}

Dans scripts.js, mon javascript qui appelle mon action AJAX et transmet une variable postoffset afin que je puisse le transmettre à la requête. Notez également l'utilisation de WPaAjax.ajaxurl pour transmettre l'URL qui traitera cette demande:

jQuery(document).ready(function($){

    $('#blog-more').click(function(e){ // <- added
        e.preventDefault(); // <- added to prevent normal form submission
        var postoffset = $('.post').length;
        $.post(
            WPaAjax.ajaxurl,
            {
                action : 'wpa56343_more',
                postoffset : postoffset
            },
            function( response ) {
                $('#container').append( response );
            }
        );
    });

});

Dans functions.php, la fonction qui traite ma demande AJAX est associée à l'action que j'ai transmise dans le javascript ci-dessus. Une version allégée de WordPress est amorcée afin que je puisse accéder à la plupart des fonctions WordPress:

add_action('wp_ajax_wpa56343_more', 'wpa56343_more');
add_action('wp_ajax_nopriv_wpa56343_more', 'wpa56343_more');

function wpa56343_more(){
    global $wp_query;

    $offset = $_POST['postoffset'];
    $args = array(
        'offset' => $offset,
        'posts_per_page' => 10
    );
    $wp_query = new WP_Query( $args );

    get_template_part( 'post-template' );

    exit;
}
12
Milo