web-dev-qa-db-ja.com

を介してWordpressでより多くの記事を取得する AJAX

投稿アーカイブやその他の検索結果リストの次のページを取得するための最良の方法は何ですか?

この質問はすでに何度も質問されていますが、答えは私にとって十分ではありません。これまでに、2つの方法を見つけました。

  1. 標準のURLへのAJAXリクエストの使用(example.com/category/mycat/page/2など)。これはJQueryの$.load関数を使って行われます。この関数は結果を取り除き、指定されたidを持つブロックの内容だけを残します。これは、クライアントにとって(不要なコンテンツが読み込まれて処理されるため)、サーバーにとって(そのような要求が不要なメニュー、ウィジェットなどを処理するため)非効率的だと思います。

  2. add_action関数を使用したカスタムAjaxハンドラー。このオプションの大きな問題は、ハンドラが普遍的ではないということです。これは通常のクエリの解析を回避し、代わりにカスタムのWP_Queryオブジェクトを作成します。明らかに、これは方法ではありません。

私は以下を検討しています:

  1. テンプレートにページをJSON形式で表示させるクエリ変数を登録し、次のようにリクエストを行います。example.com/category/mycat/page/2?showjson=true。テーマでこの変数を確認し、それに応じて出力を調整します。

  2. query_varsを取得し、wp_localize_scriptを使用してそれらをスクリプトに渡します。その後、これらの変数を使用してAJAX呼び出しを行い、適切に処理します。 (基本的に、これは上記のオプション2の強化版です。).

それなら、これを行う他の方法があるでしょうか。

追加:Wordpressのすべてをロードする必要はないので、カスタムハンドラを作成するとパフォーマンスが向上する可能性があります。

1
Beowulfenator

通常の要求とajax経由で要求されたときに、archive.phpファイルを変更して異なるコンテンツを提供することにしました。

if ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')) {
    $response = array();
    $response['posts'] = '';
    if (have_posts()) {
        ob_start();
        while (have_posts()) {
            the_post();
            get_template_part('content');
        }
        $response['posts'] .= ob_get_clean();
    } else {
        //no posts
        $response['posts'] .= 'nothing';
    }
    echo json_encode($response);
} else {    
    //normal template code here
}

その後は、JS経由でアイテムを取得するのは簡単です。

$.ajax ({
    type: "GET",
    url: more_ajax_url,
    data: {},
    dataType: 'json',
    success: function (result) {
        $('#archive_container').append(result.items);
    }
});

次のページへのリンクを渡すコードもいくつかありますが、それを実装するのは難しいことではありません。

この方法の利点は、リクエストがwordpressとそのすべてのフィルタおよびアクションによって完全に処理されることです。不要なデータがサーバーから渡されないため、$.loadよりはるかに優れています。

1
Beowulfenator