web-dev-qa-db-ja.com

get_postsとpre_get_posts

だからテンプレートで私は複数の注目の投稿とスライダーと2つのデフォルトループを持っています。

私はget_postsをデフォルトのループを除くすべてのものに使っています(明らかに)。

今私が抱えている問題は、メインループからget_postsの投稿を除外することです。私はquery_postsのやり方をすることができたかもしれません、しかしパフォーマンスへの影響は悪いです、そして、私はそれが生成される前でさえメインループに取り組みたいです。

だから私はfunctions.phpでpre_get_postsを使うつもりです。

Pre_get_postsの中で、メインループを修正し、get_postsデータを除外します。

私は問題を見てきました:

  1. 私はテンプレートの中でget_postsを使う必要があるので、それらをglobal :(として保持する変数を宣言する必要があります。そうでなければ私のテンプレートの中ではアクセスできません。

  2. pre_get_posts内のget_postsでメモリの問題が発生する


function RoomsGazette_homepage_content( $query ) {

    //$tweets         = getTweets( 4, $titan->getOption( 'tweets_from_user' ) );

    $header_sliders = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 1, 'posts_per_page' => 5, ) );

    //$footer_sliders = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 2, 'posts_per_page' => 5, ) );

    //$featured       = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 3, 'posts_per_page' => 2, ) );

    $exclude_ids    = array();

    foreach ( $header_sliders as $tmp ) {
        array_Push( $exclude_ids, $tmp->ID );
    }

    foreach ( $footer_sliders as $tmp ) {
        array_Push( $exclude_ids, $tmp->ID );
    }

    foreach ( $featured as $tmp ) {
        array_Push( $exclude_ids, $tmp->ID );
    }

    if ( $query->is_home() && $query->is_main_query() )
    {
        $query->set( 'post__not_in', $exclude_ids );
    }

}
add_action( 'pre_get_posts', 'RoomsGazette_homepage_content' );
2
user8842

まず、あなたは無限ループを呼び出しています。それはメモリの枯渇を引き起こします。それを避けるために、関数の冒頭に次のコードを追加してください。

// avoid infinite loop
remove_action( 'pre_get_posts', __FUNCTION__ ); 

それはあなたがそれを何度も何度も何度もpre_get_postsにそれをフックしていないことを確実にし、あなたのget_posts()呼び出しを何度も何度も再起動します。

次に、WP_Query、そしてget_posts - fieldsパラメーター を使用します。値としてidsを選択すると、IDのみを取得することでメモリー/ワークロードが削減されます。

4
Nicolai