我正在开发一个插件,为了一些快速和脏的开发,我添加了一个函数调用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),
));
}
答案 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}}将告知它是页面构建查询还是额外查询。
第二篇文章是否在侧边栏的某处?
不是一个真正的答案,而是一种让你入门的方法。