wake-up-neo.net

Vorlagenprobleme beim Abrufen von Ajax-Suchergebnissen

Ich versuche, Suchergebnisse mit Ajax in ein Div zu bringen. Ich erhalte die Fehlermeldung undefined function have_posts(), wenn auf die Suchvorlage zugegriffen wird. Es gab auch ein Problem mit get_header(), das in der search-results.php enthalten war, aber ich habe es behoben. Hier ist, wie ich es eingerichtet habe.

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

Und hier ist die Vorlage search-results.php. Ich frage mich, ob ich die Suchergebnisse möglicherweise nicht an die Vorlage weitergebe.

<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

Wenn Sie eine Vorlagendatei direkt auf diese Weise laden, wird die WordPress-Umgebung nicht geladen, sodass keine WordPress-Funktionen verfügbar sind.

Sie haben zwei Möglichkeiten: Laden Sie entweder die Suchseite in das Front-End und filtern Sie das Ergebnis wie folgt:

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

Oder erstellen Sie eine Suchfunktion mit der von WordPress bereitgestellten AJAX Funktionalität, siehe AJAX in Plugins .

EDIT

Hier ist ein Beispiel, wie ich zusätzliche Posts über AJAX lade, die Sie anpassen können, um eine Suchfunktion zu erstellen, wenn Sie dies wünschen.

Zunächst stelle ich in functions.php mein Javascript in eine Warteschlange und lokalisiere das Skript, um die AJAX URL zu übergeben, die meine Anforderungen verarbeitet. WordPress AJAX verwendet admin-ajax.php, um alle AJAX Anforderungen zu verarbeiten, Front- oder Back-End:

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

In scripts.js, meinem Javascript, das meine AJAX -Aktion aufruft und eine postoffset var übergibt, damit ich das an die Abfrage übergeben kann. Beachten Sie auch die Verwendung von WPaAjax.ajaxurl, um die URL zu übergeben, die diese Anforderung verarbeitet:

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

});

In functions.php ist die Funktion, die meine AJAX -Anforderung verarbeitet, der Aktion zugeordnet, die ich im obigen Javascript übergeben habe. Eine abgespeckte Version von WordPress wird gebootet, so dass ich auf die meisten WordPress-Funktionen zugreifen kann:

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