web-dev-qa-db-fra.com

Thème Wordpress ajax have_posts ()

Mon but ici est de charger la blogroll dans mon thème via ajax. Mais tout ce que je peux obtenir comme réponse est 0 (si j'omets la ligne die (), sinon j'obtiens une réponse en blanc).

Voici mon code:

js ajax:

$.ajax({
    url:"http://domain.com/wp-admin/admin-ajax.php",
    type:'POST',
    data:'action=load_men_blog',
    //dataType:'html',
    //cache: false,
    success: function(html){
        $("#b_contentwrapper").empty();
        $("#b_contentwrapper").append(html);
    }
});

PHP (functions.php):

function implement_ajax() {
    while (have_posts()):
      echo "azerty";
    endwhile;
    die();
}
add_action('wp_ajax_load_men_blog', 'implement_ajax');
add_action('wp_ajax_nopriv_load_men_blog', 'implement_ajax');

Depuis que j'ai des messages dans ma base de données, je m'attends à ce que azerty soit renvoyé. Mais je reçois une réponse vide ou 0 si je commente la ligne die (). Si je place un écho en dehors de la boucle while, celui-ci se trouve dans la division attendue, ce qui signifie que le javascript fonctionne.

Tout le monde peut me diriger dans la bonne direction?

2
Yash

Le problème ici est que vous n'avez interrogé aucun message. Avant have_posts essayez d'ajouter quelque chose comme, query_posts( 'posts_per_page=5' );

1
Matthew Boynes

Bonjour et bienvenue sur WPSE. Puis-je suggérer une approche différente pour implémenter AJAX dans votre thème, il est un peu plus facile à utiliser également à mon avis.

Sur la base de cet article , la meilleure chose à faire est d'utiliser le fichier admin-ajax.php natif de WP pour exécuter la fonction. A partir du code que vous avez posté dans votre question, j'ai trouvé ceci: (J'ai ajouté un nonce et une variable 'success' pour un meilleur contrôle, vous pouvez voir comment il est défini dans functions.php, aussi, s'il vous plaît. faire modifier selon vos besoins, ceci est un exemple)

some-js-file.js:

$.post( yourajax.ajaxurl, {

    nonce: yourajax.nonce,
    action: 'load_men_blog'

}, function( response ) {

    if( response.success === true ) {

        $( "#b_contentwrapper" ).empty().append( response.html );

    } else {

        alert( "There was an error with your request" );

    }

}

functions.php:

add_action( 'wp_ajax_nopriv_load_men_blog', 'load_men_blog' );
add_action( 'wp_ajax_load_men_blog', 'load_men_blog' );
add_action( 'wp_enqueue_scripts', 'load_some_scripts' );

function load_some_scripts() {

    wp_enqueue_script( 'jquery' );
    wp_enqueue_script( 'json2' );

    wp_register_script( 'some-js-file', get_bloginfo( 'template_url' ) . '/some-js-file.js', array( 'jquery', 'json2' ) );
    wp_enqueue_script( 'some-js-file' );
    wp_localize_script( 'some-js-file', 'yourajax', array(
        'ajaxurl' => admin_url( 'admin-ajax.php' ),
        'nonce' => wp_create_nonce( 'some-js-file-nonce' )
    ));

}

function load_men_blog() {

    $nonce = $_POST['nonce'];
    if ( !wp_verify_nonce( $nonce, 'some-js-file-nonce' ) )
        die ( __( 'Busted!' ) );

    $posts = get_posts( 'fields=ids' ); // Just gets post IDs, can be removed, added to save time
    $return_str = '';
    if( count( $posts ) > 0 ) {

        $success = true;
        foreach( $posts as $a_post ) // For each post in the DB..
            $return_str .= "azerty"; // ..add 'azerty' to the string to return

    } else {
        $success = false;
    }

    $response = json_encode( array( 'success' => $success, 'html' => $return_str ) );

    header( "content-type: application/json" );
    echo $response;
    exit;

}
1
Jared