web-dev-qa-db-ja.com

適切なプラグインフックを維持しながら、ホームページに最新の投稿のみを表示する方法を教えてください。

私がやろうとしているのは私の "ホームページ"に最新の投稿(la私のテーマの "single.php")を表示することです。

これは、wp_headとwp_enqueue_scriptsをフックしている特定のプラグイン(特にScripts n Styles)があるという事実によって複雑になります。これらのフックでは、投稿ごとのJavaScriptをページに挿入するかどうかをis_singular()でチェックしています。次に、グローバル$ post変数の属性を調べて、どのスクリプトを挿入するかを決定します。必要に応じて、投稿ごとのJavaScriptをホームページに正しく挿入します。

参考までに、問題となっているプラ​​グインのソースコードは ここ で、実行に関係している特定の関数はscripts_in_head()です。

static function scripts_in_head() {
    // Global
    $options = get_option( 'SnS_options' );
    if ( ! empty( $options ) && ! empty( $options[ 'scripts_in_head' ] ) ) {
        ?><script type="text/javascript" id="sns_global_scripts_in_head"><?php
        echo $options[ 'scripts_in_head' ];
        ?></script><?php
    }

    if ( ! is_singular() ) return;
    // Individual
    global $post;
    $SnS = get_post_meta( $post->ID, '_SnS', true );
    $scripts = isset( $SnS['scripts'] ) ? $SnS[ 'scripts' ]: array();
    if ( ! empty( $scripts ) && ! empty( $scripts[ 'scripts_in_head' ] ) ) {
        ?><script type="text/javascript" id="sns_scripts_in_head"><?php
        echo $scripts[ 'scripts_in_head' ];
        ?></script><?php
    }
}

私はWordpressの開発にかなり慣れていないので、ここで私の人生を過度に困難にしている骨頭の間違いをおそらくここで犯しました。これは私が壁に向かって頭を叩いた様々な雑多な方法です:

私が理解していることから、テンプレートはこれらのフックがすべて実行されるまで実行されないため、home.phpテンプレートを変更することはできません。したがって、この時点でクエリを変更したり、新しいクエリを作成したりしても意味がありません。

HTTPヘッダーのリダイレクトを使用することもできますが、最新の投稿が変更されるたびに手動でリダイレクトを更新しなくても機能することはわかりません。

私はhome.phpをjavascriptリダイレクトを持つように変更することができます、しかしそれはそれがただ別のページにリダイレクトされるために "死んだ"ホームページをロードするのに多くの時間/努力が無駄になるようです。これが唯一の方法なのであれば、それでも構いませんが、私はもっとうまくできるはずです。

Scripts n Stylesよりも早くフックし、$ wp_queryを変更するプラグインを作成しようとしましたが、これは正しく機能しないようです。おそらく、私はそれを間違ってやっています:

function make_single_from_home()
    global $wp_query;
    if ( $wp_query->is_home() ) {
        $last = wp_get_recent_posts( '1');
        $last_id = $last['0']['ID'];
        $wp_query->set( 'p', $last_id )
        $wp_query->set( 'post_count', 1);
        $wp_query->set( 'is_home', false);
        $wp_query->set( 'is_single', true);
    }
}

Scripts n Stylesのフック(send_header、template_redirectなど)の前に、これをいくつかのイベントに添付してみましたが、役に立ちません。 JavaScriptブロックが<head>タグに追加されているのがわかりません。 (これが有効な解決策であり、私またはプラグインが間違っている可能性があります)

私のホームページを私の最新の投稿を表示する単一ページにするための本当に簡単な方法がある可能性もあります、そして私はそれを理解するにはあまりにも新しいです。

$post変数を有効にしながらis_singular() == trueを私のプラグインの依存関係に十分に早くしながら、最新の投稿のみを表示するホームページを作成する方法はありますか?

1
agent86

Chipの答え はエラーの修正に役立ちましたが、それを完全に解決するにはもう少し調整が必要でした。

静的フロントページでは、front-page.phpテンプレートが( 階層構造 に従って)呼び出され、$wp_queryにはあなたがあなたのページに対応するページIDが入ります閲覧オプションの「静的ページ」として表示することを選択しました。

Chipはget_header()呼び出しの後に新しいクエリを作成するよう提案しました。これは表示される投稿を変更するのに役立ちます。彼はまた、$wp_queryからfront-page.phpテンプレートにパースされた設定のおかげで、is_singular()呼び出しがTRUEを返すことを修正しました。

しかし、これは$postの値の問題を解決しません。 get_header()が呼び出されるとすぐに、ほとんどのテーマはtemplate_redirectからwp_enqueue_scriptsを越えて アクションチェーン を進めます。その間にあるフックは呼び出されるでしょう、そしてその領域のイベントの1つをフックするプラグインのために$wp_queryまたは$postの値をもたらすには遅すぎます。

そのため、 "static page"エントリのwp_head情報を使用して$postアクションが呼び出されていました。私はそれが起こりたくないので、get_header()を呼び出す前にこれらの値をどうにかして修正しなければなりません。

これを行うにはおそらく複数の方法がありますが、私のために働いたのは追加することでした:

global $wp_query;

$last = wp_get_recent_posts(array('numberposts'=>'1','post_status'=>'publish' ));
$last_id = $last['0']['ID'];

$wp_query = new WP_Query('p='.$last_id);

get_header()の呼び出しの前に私のfront-page.phpに。これにより、静的ページから生成されたクエリ値が上書きされ、最新の投稿のみを返すクエリ値に置き換えられます。

あなたが十分に早くフックする限り、おそらくこれもプラグインを使って行うことが可能です。

0
agent86

プラグインフックがどのようにしてあなたの問題の解決に影響を与えるのか私はよくわかりません。 home.phpテンプレートファイルはtemplate_redirectアクションにインクルードされます。これはwp_headのかなり前に起動します。

とは言っても、あなたがやりたいように聞こえるのは、

  1. ブログ投稿インデックスの最初のページに'posts_per_page' = 1がある
  2. ブログ投稿インデックスの後続のページに'posts_per_page' = 10がある

最も簡単な方法は、おそらくサイトのフロントページとして静的ページを使用し、次に最新の投稿を取得するためにfront-page.phpでカスタムクエリを使用することです。

front-page.php

get_header();

$latest_post_args = array(
    'post_per_page' = 1;
);

$latest_post = new WP_Query( $latest_post_args );

if ( $latest_post->have_posts() ) : while ( $latest_post->have-posts() ) : $latest_post->the_post();

    // Loop markup goes here

endwhile; endif;

wp_reset_postdata();

get_footer();

is_singular()はサイトのフロントページとして静的ページに対してtrueを返すので、あなたのプラグインスクリプトのエンキューは影響を受けないはずです。

1
Chip Bennett

ホームページにJavaScriptのスニペットを表示しようとしています。これは単一の投稿です。

最も簡単な方法は、どこにでもJSのスニペット(グローバル設定)を含めて、ホームページにいるかどうかをJavaSciptでチェックインすることです。if ( $('body').hasClass('home') ) { /* do_stuff() */ }

これによりコードのメンテナンスが簡単になります。

(申し訳ありませんが、これまで見たことがありませんでした。)

0
WraithKenny