2012-08-06 46 views
1

我正在为一个插件和一些快速和肮脏的开发工作我已经添加了一个函数调用single.php调用我的插件中的函数,它存储有关当前职位的数据在数据库。Wordpress - single.php调用两次

虽然我已经注意到,它总是被调用两次:一次用于我正在请求的帖子,一次用于另一帖子(它不会显示在页面的内容中)。

有没有人知道这是为什么,如果是这样,它是否是所需的行为,如果不是,我可以修复它?

下面是一个例子类似我的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), 
    )); 
} 

回答

1

我建议你开始调试自己,你必须对WP_DEBUG
var_dump($query) in msw_sp()检查哪些帖子通过了,他们在页面上的位置?
我也建议你var_dump(is_single())检查它是否是一个单一的页面。
var_dump($query->is_main_query())会告诉您是否是页面构建查询或额外的查询。

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

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

+0

我有WP_DEBUG和var_dumping $查询只显示一个,但如果我有查询转储到数据库它显示两个。我没有尝试is_single或is_main_query,但在另一个环境中进行测试表明,这在所有环境中都不是问题。 – 2012-08-06 21:34:39

6

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

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

然后我搜索了很多,终于找到了解决办法在这里:

​​

这给另一个引用:

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

由于上述链接。

我想提出一个简短的位置:

原因是Firefox的预取功能。对于single.php,WP自动将两个<链接>放入<标头>,其中一个是rel =“next”,它指向下一篇文章(相邻文章)。

当Firefox看到这个时,它会预读<链接指向的页面>,以便在阅读当前文章后转到下一篇文章时加快速度。因此,该帖子将被调用,但你永远不会看到它显示。这也是为什么你看不到任何你为了调试而转储的消息,甚至没有回溯。

顺便说一句,添加两个<链接>的动作被添加到“default-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预取。

+0

非常感谢。 +10,如果我可以。 – Greeso 2013-12-13 04:26:02

+0

那么,FF让wordpress执行一些可能需要的东西?哇。这对我来说是一个-1000的FF ......感谢伙计 – Edd 2015-11-28 19:33:10

+0

进入问题的地方,我检查post验证器对象(使用会话验证测试)。这是问题谢谢! – user3607584 2016-05-03 14:23:35