Wordpress - single.php调用了两次

时间:2012-08-06 06:17:42

标签: wordpress-theming wordpress

我正在开发一个插件,为了一些快速和脏的开发,我添加了一个函数调用single.php,它调用我的插件中的一个函数,该函数存储有关db中当前帖子的数据。

我注意到,它总是被调用两次:一次是我要求的帖子,一次是另一篇帖子(没有出现在页面内容中)。

有没有人知道为什么会这样,如果是的话,是否需要行为以及如果不能解决这个问题?

这是一个类似于我的single.php的例子:

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
                   <?php do_action('msw_single_php', $wp_query);  ?>

与我的插件文件类似:

add_action('msw_single_php', 'msw_sp', 0, 1);
function msw_sp(WP_Query $query) {
    global $wpdb;
    $wpdb->insert($wpdb->prefix . 'msw_career_view_debug', array(
        'request_info'      => json_encode($query),
    ));
}

2 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,现在已经解决了。

对我来说,问题只发生在Firefox上,当调用single.php时。你不想要的帖子是相邻的帖子。

然后我搜索了很多,最后在这里找到了解决方案:

http://shinephp.com/single-php-called-twice-how-to-stop/

给出了另一个参考:

http://wordpress.org/support/topic/singlephp-called-for-current-and-next-post-with-pretty-permalinks

感谢以上链接。

我想在此简要介绍一下:

原因是Firefox预取功能。对于single.php,WP会自动放入两个&lt; link&gt;在&lt; header&gt;中,其中一个是 rel =“next”,它指向下一个帖子(相邻帖子)。

当Firefox看到这个时,它会预取&lt; link&gt;所指向的页面。为了加快速度,以防你在阅读完当前的帖子后进入下一篇文章。因此,该帖子将被调用,但您永远不会看到它显示。这也是为什么你看不到任何用于调试的消息,甚至没有回溯的原因。

BTW添加两个&lt; link&gt;的动作添加在“default-filters.php”中。对于WP 3.5.1,它符合#204行。

解决方案是:

编写一个执行:

的函数(例如“remove_adjacent_links”)
remove_action(‘wp_head’, ‘adjacent_posts_rel_link_wp_head’)

并将函数(remove_adjacent_links)挂钩到“init”。

这样,链接将从。

中删除

但是,如果你确实希望链接在那里,也许你必须保持这种方式并容忍Firefox的预取......这就是我正在做的,因为它对我的情况无关紧要。我没有尝试是否有办法离开那里并使用WP代码阻止Firefox预取。

答案 1 :(得分:1)

我建议你自己开始调试,你确实有WP_DEBUG吗? var_dump($query) msw_sp() var_dump(is_single())检查哪些帖子通过了,哪些帖子在页面上? 我还建议您var_dump($query->is_main_query())检查它是否是单页 {{1}}将告知它是页面构建查询还是额外查询。

第二篇文章是否在侧边栏的某处?

不是一个真正的答案,而是一种让你入门的方法。