web-dev-qa-db-ja.com

Wordpressのテーマajax have_posts()

ここでの私の目標は、Ajaxを介してブログロールを私のテーマにロードすることです。しかし、応答として取得できるものはすべて0です(die()行を省略すると、空白の応答が返されます)。

これが私のコードです:

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

私は自分のデータベースに投稿を持っているので、私は失礼が返されることを期待しています。それでも私は空白の応答を受け取るか、die()行をコメントした場合は0を返します。 whileループの外側にエコーを配置すると、予想されるdivにエコーが表示されます。これは、JavaScriptが機能していることを意味します。

誰が私を正しい方向に向けることができますか?

2
Yash

ここでの問題は、投稿を何も照会していないということです。 have_postsの前に何かを追加してみてください、query_posts( 'posts_per_page=5' );

1
Matthew Boynes

こんにちは、そしてWPSEへようこそ。私はあなたのテーマにAJAXを実装するための別のアプローチを提案するかもしれません、それは私の意見でも同様に使うのが少し簡単です。

この記事 に基づいて、あなたができる最善のことは関数を実行するためにWPのネイティブadmin-ajax.phpファイルを使うことです。あなたがあなたの質問に投稿したコードから、私はこれを思い付きました:(私はより良いコントロールのためにnonceと 'success'変数を追加しました、それがfunctions.phpでどのように定義されるかを見ることができます、どうぞあなたのニーズに合わせて修正してください。これは例です)

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