我工作的一个插件,对于一些快速和肮脏的发展我加入了一个函数调用的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),
));
}
我遇到同样的问题,现在它的解决。
对我来说,问题只发生在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自动将2 <链路>在<标题>,和它们中的一个是相对=“下一个”,它指向下一个柱(相邻的柱)。
当Firefox看到这个,它会预取的页面指向的<链接>,以便在情况下,加快你去下一个职位读取当前一个后。 因而该职位将被调用,但你永远不会看到它显示出来。 这也是为什么你不能看到你转储调试的任何消息,甚至没有回溯。
顺便说一句,其将两个<链路>的动作是在“缺省filters.php”加入。 对于WP 3.5.1它在线路#204。
解决方法是:
写的函数(例如,“remove_adjacent_links”),它执行:
remove_action(‘wp_head’, ‘adjacent_posts_rel_link_wp_head’)
和钩函数(remove_adjacent_links)为“初始化”。
这样,链接将被删除。
但是,如果你想的链接,在那里,也许你会不得不离开这种方式和容忍Firefox的预取...这是我在做什么,因为它没有我的情况无关紧要。 我没有尝试是否有办法离开那里,并使用WP代码从预取阻止Firefox浏览器。
我建议你开始调试自己,你必须WP_DEBUG
吗?
var_dump($query)
在msw_sp()
检查哪些职位获得通过,并在他们的网页上?
我也建议你var_dump(is_single())
以检查它是否是一个单一的页面。
var_dump($query->is_main_query())
会告诉我们,如果它是网页建筑物查询或额外的查询。
是第二个职位某处一个工具?
不是一个真正的答案,但有办法让你开始。