web-dev-qa-db-ja.com

php ajaxの問題 - 変な301の回答!

こんにちは、私は本当にあなたの助けを必要としています。なぜそれが起こるのか私にはわかりません。

私はjquery $ ajaxメソッドでワードプレスのページをロードしようとしています。ただし、このページを読み込もうとすると、ブラウザが常にクラッシュしています。

私は、入力フィールド内に入力するときにワードプレスのページを要求する一種のajax検索を作成しました。これが私のコードです。

jqXHR_Old = $.ajax({
       url: "searchmap", // searchmap means mydomain.com/searchmap
       dataType: "html",
       success: function (data) { ...

奇妙なことです:私はurl: "searchmap.html"のような静的なページにURLを変更するときにすべてがうまく動作します。動的に生成されたWordpressテンプレートの "searchmap"を選択するとすぐに、ajaxレスポンスは "301 Moved Permanetly"メッセージをスローします。

これは私がブラウザで呼び出したときにうまく動作する私のテンプレートです...

<div>
    <h3>Pages</h3>
        <ul>
            <?php wp_list_pages('title_li=&depth=0&exclude='); ?>
        </ul>
    <h3>Posts</h3>
        <?php $first = 0;?>
        <ul>
        <?php
        $myposts = get_posts('numberposts=-1&offset=$first');
        foreach($myposts as $post) :
        ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endforeach; ?>
        </ul>
    <h3>Categories</h3>
        <ul>
            <?php wp_list_categories('title_li=&orderby=name'); ?>
        </ul>
</div>

このページを$ .ajax()でロードすると、FirebugまたはFiddlerが "301 Moved Permanently"エラーで応答する理由は何ですか?

もう一度入力すると、それぞれのajaxリクエストを中止しても、私のブラウザはクラッシュし続けます。そのため、複数のAjax要求が発生することはありません。

$ .ajaxはmydomain.com/searchmapを要求し、mydomain.com/searchmapはすべてのページ、投稿、および猫についてサーバーを要求します。

何か案は?私は完全に無知です!

1
mathiregister

私はあなたの呼び出しがどこかで301応答でwp_redirectを実行するページを推測しています。本当にあなたのために答えを持っていませんが、多分あなたは以下を試すことができます。 Ajaxは呼び出し元のページの種類がわからないため、リダイレクトを引き起こす奇妙なquery_varsがロードされている可能性があります。

  • あなたがページをロードするためにパーマリンクを使っています、あなたは非パーマリンクURLを使ってみることができますか?
  • プラグインフォルダでwp_redirectをテキスト検索して、問題がないかどうかを確認します。

Ajax呼び出しアクション.

    var response;
jQuery.post(
    // see tip #1 for how we declare global javascript variables
    MyAjax.ajaxurl,
    {
        // here we declare the parameters to send along with the request
        // this means the following action hooks will be fired:
        // wp_ajax_nopriv_myajax-submit and wp_ajax_myajax-submit
        action : 'searchmap',

        // other parameters can be added along with "action"
        postID : MyAjax.postID,
        count : '16'
    },
    function( response ) {
        jQuery("#div-searchmap").html(response);
        jQuery("#div-searchmap").show();
    }

);

あなたがwp_ajaxを使いたいならば、あなたはもう少し追加する必要があるでしょう。

    // declare the URL to the file that handles the AJAX request (wp-admin/admin-ajax.php)
    wp_localize_script( 'my-ajax-request', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
    // this hook is fired if the current viewer is not logged in
    if (isset($_GET['action'])) {
    do_action( 'wp_ajax_nopriv_' . $_GET['action'] );
    }
    // if logged in:
    if (isset($_POST['action'])) {
    do_action( 'wp_ajax_' . $_POST['action'] );
    }
        if(is_admin()) {
        add_action( 'wp_ajax_searchmap', 'my_searchmap_function' );
        } else {
        add_action( 'wp_ajax_nopriv_searchmap', 'my_searchmap_function' );
}

私のajaxスクリプトにPOST変数を使用しているので、adminで実行されるので、jqueryスクリプトをGETで作成する場合は、adminの外部でnorpriv関数を呼び出す必要があります。 (今これを考え出しただけで)

あちこちでスクリプトを修正しなければならないかもしれません、それはただ手に負えない例です。

関数はあなたが必要とするデータを返さなければなりません。例えば:

function my_searchmap_function() {
// Start output buffer
ob_start();
?>
div>
    <h3>Pages</h3>
        <ul>
            <?php wp_list_pages('title_li=&depth=0&exclude='); ?>
        </ul>
    <h3>Posts</h3>
        <?php $first = 0;?>
        <ul>
        <?php
        $myposts = get_posts('numberposts=-1&offset=$first');
        foreach($myposts as $post) :
        ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endforeach; ?>
        </ul>
    <h3>Categories</h3>
        <ul>
            <?php wp_list_categories('title_li=&orderby=name'); ?>
        </ul>
</div>  
<?php 

    $output = ob_get_contents();

    // Stop output buffer
    ob_end_clean();
    $response = json_encode($output);

    // response output
    header( "Content-Type: application/json" );
    echo $response;

    // IMPORTANT: don't forget to "exit"
    exit;
}
3
Patriek