私がやろうとしているのは私の "ホームページ"に最新の投稿(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
を私のプラグインの依存関係に十分に早くしながら、最新の投稿のみを表示するホームページを作成する方法はありますか?
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
に。これにより、静的ページから生成されたクエリ値が上書きされ、最新の投稿のみを返すクエリ値に置き換えられます。
あなたが十分に早くフックする限り、おそらくこれもプラグインを使って行うことが可能です。
プラグインフックがどのようにしてあなたの問題の解決に影響を与えるのか私はよくわかりません。 home.php
テンプレートファイルはtemplate_redirect
アクションにインクルードされます。これはwp_head
のかなり前に起動します。
とは言っても、あなたがやりたいように聞こえるのは、
'posts_per_page' = 1
がある'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を返すので、あなたのプラグインスクリプトのエンキューは影響を受けないはずです。
ホームページにJavaScriptのスニペットを表示しようとしています。これは単一の投稿です。
最も簡単な方法は、どこにでもJSのスニペット(グローバル設定)を含めて、ホームページにいるかどうかをJavaSciptでチェックインすることです。if ( $('body').hasClass('home') ) { /* do_stuff() */ }
これによりコードのメンテナンスが簡単になります。
(申し訳ありませんが、これまで見たことがありませんでした。)