質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

$wp_queryが取得できない場合

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 879

yamasen

score 23

Ajaxを介して、変更された$wp_queryが取得できません。。

実現したいこと

現在、下記の// 条件Aによってメインループを変更し正しく動作する状況ですが、これをAjaxを介して取得したいです。

function myPreGetPosts( $query ) {
    // 条件A
}
add_action('pre_get_posts','myPreGetPosts');

試したこと

Ajaxのコードは下記JSとPHPになってます。
問題は、$the_queryに上の条件Aが入らず、普通の$wp_queryが入ってしまうことです。
(PHPにある// 条件Aを入れたい!の部分です。)

"use strict";
function Ajax(){        
(function($){
    // 必要な値を取得
    var selectedList = $('.ajax input:checked').val();
    if( selectedList == 'kiji' ){
        var ajax_area = $('#ajax_kiji');
    }
    if( selectedList == 'user' ){
        var ajax_area = $('#ajax_user');
    }
    // Ajax処理
    $.ajax({
        url: MY_AJAX.api,
        type: 'POST',
        data: {
            action: MY_AJAX.action,
            nonce: MY_AJAX.nonce,
            submitList: selectedList
        }
    })
    // scusess
    .done(function( response ) {        
        var $articleOuter = ajax_area;
        var $response = response;
        $articleOuter.html(''); 
        $articleOuter.html( $response );
    })
    // error
    .fail(function( response ) {
        alert('error');        
    }); 
})(jQuery);    
}
/* 必要な変数やnonceを最初から出しておく */
function my_enqueue_scripts() {
  $handle = 'my-script';      
  $jsFile = 'path/to/myscript.js';
  wp_register_script($handle, $jsFile, ['jquery']);
  $action= 'my-ajax-action';
  wp_localize_script($handle, 'MY_AJAX', [
    'api'    => admin_url( 'admin-ajax.php' ),
    'action' => $action,
    'nonce'  => wp_create_nonce( $action ),
  ]);
  wp_enqueue_script($handle);    
}

/* JSから受け取った値を使って表示内容を変える */
add_action( 'wp_ajax_my-ajax-action', 'my_ajax_event' );
add_action( 'wp_ajax_nopriv_my-ajax-action', 'my_ajax_event' );
function my_ajax_event() {

  $action = 'my-ajax-action';

  if( check_ajax_referer($action, 'nonce', false) ) {    

        // データ受け取り
        $submitList = esc_html( $_POST['submitList'] );

        // データ更新
        // 記事リストの場合
        if( $submitList == 'kiji' ){
            require_once( dirname(dirname(dirname(dirname(dirname( __FILE__ ))))) . '/wp-blog-header.php' );    
            add_action('pre_get_posts','myPreGetPosts');
            global $wp_query;
            $the_query = $wp_query; // 条件Aを入れたい!
            include locate_template( 'template-parts/loop-kiji.php' );
        }
        // userリストの場合    
        if( $submitList == 'user' ){
            include locate_template( 'template-parts/loop-user.php' );
        }

    }

  die();
}


いちおうrequire_oncewp-blog-header.phpを読んで、add_actionで条件Aを読んで、その後に$wp_queryを読んでいるつもりなんですけど、条件Aではなく普通の$wp_queryが入ってしまいます。

どうしたらAjaxを介して条件Aを使うことができるのでしょうか?

ちなみに// 条件Aを入れたい!$wp_queryではなくサブループを作ればきちんと動きます。

宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+2

wp_ajax_*で呼び出される場合、メインループは存在しないのでは。実行履歴を表示してみてください。

【WordPressのアクションフックの実行履歴を確認する - Qiita】
https://qiita.com/ichi_404/items/2c999847453116aab842#shutdownフックに関数を追加する

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/20 05:32

    loop-kiji.php の冒頭は
    <?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    となっており、このテンプレート内で$the_queryは定義していません。

    なのでその$the_queryに普通のメインループが入るのは

    Ajaxの
    $the_query = $wp_query; // 条件Aを入れたい!
    の部分によってとしか考えられなそうです。

    なので、メインループは存在しているように思うのですが、、どうなんでしょうね。

    キャンセル

  • 2019/01/20 05:35

    「メインループ」も「WP_Query」で作成されるんですか。

    となれば、
    $the_query = $wp_query; // 条件Aを入れたい!

    の部分を、
    $the_query = new WP_Query( $args );

    とすればいいわけですね。

    すると$argsは自分でメインループと同じ条件を書けばいいんでしょうか?

    あれ?でもそうしたらサブループになってしまうということではないのでしょうか?

    キャンセル

  • 2019/01/20 10:24

    とりあえず関数my_ajax_eventから下記を外に出してください。$the_query = $wp_query;で動いているなら既にpre_get_postsを通過していることになります。最初の回答の通り「実行履歴」を確認すればすぐにわかるはずなので、それを試してください。
    add_action('pre_get_posts','myPreGetPosts');

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る