我如何在主页上只显示最新的帖子,同时保持适当的插件挂钩?

时间:2012-11-27 作者:agent86

我想做的是在我的“主页”上显示最新的帖子(我的主题是“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 足够早满足我的插件依赖性?

3 个回复
最合适的回答,由SO网友:agent86 整理而成

Chip\'s answer 帮助我修复错误,但需要更多的调整才能完全解决。

通过静态首页front-page.php 将调用模板(根据hierarchy) 具有$wp_query 用页面ID填充,该ID与您选择在阅读选项中显示为“静态页面”的页面相对应。

Chip建议在get_header() 呼叫,这有助于更改显示的帖子。他也是正确的,因为解析到的设置$wp_queryfront-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(). 这将覆盖从静态页面生成的查询值,并将其替换为仅返回最新帖子的查询值。

可能也可以使用插件来实现这一点,只要您足够早地挂钩。

SO网友:Chip Bennett

我不确定插件挂钩会以任何方式影响您问题的解决方案。这个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作为站点首页,插件脚本排队应不受影响。

SO网友:WraithKenny

您正试图在主页上显示一段JavaScript,其中只显示一篇文章。

最简单的方法是将JS片段包含在everywhere(全局设置)中,然后在JavaScipt中检查您是否在主页上:if ( $(\'body\').hasClass(\'home\') ) { /* do_stuff() */ }

这将简化代码的维护。

(很抱歉,我直到现在才看到这个。)

结束

相关推荐

Travel Blog Plugins

今年晚些时候,我将使用Wordpress创建一个关于我旅行的博客。我希望该博客具有以下功能我的帖子将被地理定位一张包含帖子位置的地图,可以单击地图上的各个点到达帖子</我正在寻找最好/最合适的插件。谢谢,艾尔。