我想做的是在我的“主页”上显示最新的帖子(我的主题是“single.php”)。
这是复杂的,因为我有一些插件(特别是脚本n样式),它们挂接wp\\u head和wp\\u enqueue\\u脚本。在这些钩子中,他们检查is\\u singular(),查看是否应该将我的每篇文章javascript注入页面。然后,他们检查全局$post变量的属性,以确定要注入哪些脚本。如果需要的话,我希望在主页上正确注入每篇文章的javascript。
作为参考,该插件的源代码是here 我所关心的正确运行的特定函数被调用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重定向,但似乎加载“死”主页只是为了重定向到另一个页面会浪费很多时间/精力。如果这是唯一的办法,那就这样吧,但看起来我应该能做得更好。
我尝试创建一个比脚本n样式更早挂钩的插件,并修改$wp\\u查询,但这似乎不能正常工作。很可能我做错了:
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\\u header、template\\u redirect等),但似乎没有任何帮助。我没有看到javascript块被添加到
<head>
标签(这可能是一个有效的解决方案,而我或插件只是做错了)
也有可能有一种非常简单的方法可以让我的主页成为一个单独的页面,显示我的最新帖子,而我只是太新了,无法理解它。
有没有办法创建一个只显示最新帖子的主页,同时$post
变量有效,并且is_singular() == true
足够早满足我的插件依赖性?
最合适的回答,由SO网友:agent86 整理而成
Chip\'s answer 帮助我修复错误,但需要更多的调整才能完全解决。
通过静态首页front-page.php
将调用模板(根据hierarchy) 具有$wp_query
用页面ID填充,该ID与您选择在阅读选项中显示为“静态页面”的页面相对应。
Chip建议在get_header()
呼叫,这有助于更改显示的帖子。他也是正确的,因为解析到的设置$wp_query
到front-page.php
模板is_singular()
呼叫将返回TRUE
.
然而,这并不能解决$post
. 一旦get_header()
被称为,大多数主题将推进action chain 从…起template_redirect
过去的wp_enqueue_scripts
. 任何介于两者之间的挂钩都将被调用,现在要实现$wp_query
或$post
用于挂接该区域中某个事件的插件。
因此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);
给我的
front-page.php
在呼叫之前
get_header()
. 这将覆盖从静态页面生成的查询值,并将其替换为仅返回最新帖子的查询值。
可能也可以使用插件来实现这一点,只要您足够早地挂钩。