2

WordpressでWebサイトをデザインしています。このサイトは、すべてのページがホームページに印刷され、メニューがアンカーまでスクロールするパララックス サイトの 1 つです。

そうは言っても、メインメニューにあるすべてのページを引き出すために wp_query を使用しています。さらに、wp_query の使用も必要とするコンテンツで使用するショートコードがあります。

私が抱えている問題は、ショートコード (埋め込まれた wp_query) がポストデータを台無しにしていることです。wp_query を使用する場合、通常は wp_reset_postdata を使用したいことはわかっていますが、この特定の状況では機能しません。この関数呼び出しは、現在実行中の wp_query ではなく、ホームページの postdata を復元するためです (不明な場合は申し訳ありません)。 .

postdata のスナップショットを取り、ショートコードの後に​​復元する方法はありますか? 次のようなものを探しています:

function my_shortcode() {
    save_postdata(); //saves the current postdata
    $query = new WP_Query();
    while( $query->have_posts() )   {
        $query->the_post();
        echo get_the_title();
    }
    my_wp_reset_postdata(); //restores the postdata to where it was before the loop
}
4

3 に答える 3

1

これが私がなんとかそれを機能させる方法でした.Nikolaの質問は、私が彼のアイデアに基づいて作業したためです。

function _save_query( $var = '_wp_query' ) {
    global $post;
    $GLOBALS[ $var ] = $post;
}

function _wp_reset_query( $var = '_wp_query' ) {
    global $post;
    $post = $GLOBALS[ $var ];
    setup_postdata( $post );
}

ここにあるループの仕組みのドキュメントを見ました。私の基準を満たしていたので、ニコラの回答と同じ種類のセットアップを使用することにしましたが、the_post の実装を使用して postdata を復元しました。setup_postdata 関数を使用しているため (これはやり過ぎだと思います)、これはおそらくあまり効率的ではありませんが、私の問題は確実に解決されました。

したがって、 wp_query を埋め込むと、次のことができます。

_save_query();
$products = new WP_Query( $args );
if( $products->have_posts() ) {
    $ob .= '<ul class="group-posts">';
    while ( $products->have_posts() ) {
        $products->the_post();
        $ob .= '<li>'.get_the_title().'</li>';
    }
    _wp_reset_query();
    $ob .= '</ul>';
}

補足質問/注: 回答を正解としてマークするためのエチケットは何ですか? ニコラが答えにたどり着くのを手伝ってくれたときに、自分の答えを正しいものとして受け入れるのは気分が悪いでしょうか?

于 2012-12-12T18:58:51.473 に答える
1

のソースを見ると、別のグローバル変数からグローバル変数をwp_reset_query()復元するだけであることがわかります ( -これは の初期設定と一緒に設定されるため、元のクエリが保持されます)。$wp_query$wp_the_query$wp_query

できることは、単に$wp_query別のグローバル変数に割り当ててから、後で復元することです。次に例を示します。

function _save_query( $var = '_wp_query' ) {
    $GLOBALS[ $var ] = $GLOBALS['wp_query'];
}

function _wp_reset_query( $var = '_wp_query' ) {
    $GLOBALS['wp_query'] = $GLOBALS[ $var ];
    wp_reset_postdata();
}

したがって_save_query()、クエリを上書きする前に呼び出すだけです(カスタム変数名を渡すことができます-この方法で複数のWP_Queryオブジェクトを保存できます:))。

クエリ データを復元したい場合は、 を呼び出し_wp_reset_query()ます。この場合も、この正確なクエリ オブジェクトを復元するために、変数名として文字列を渡すことができます。

于 2012-12-12T18:22:37.653 に答える
0

my_wp_reset_postdata存在しない。を使用する必要がありますwp_reset_postdata()。ただし、複数のwp_queriesをチェーンして古いクエリに戻す必要がある状況では、最初のクエリを変数に格納し、新しいWP_queryを設定してから、リセットして古いクエリに戻すことができます。

$ wp_queryは、現在のループを格納します。だからあなたは次のようなものに行くことができます:

    $temp = $wp_query;
    $wp_query= null;
    $wp_query = new WP_Query($args);
    ...

    // then later 
    $wp_query = $temp;
    // And back on tracks !
于 2012-12-12T18:16:08.430 に答える