2

我正在开发一个插件,并且为了进行一些快速而肮脏的开发,我添加了一个对 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),
    ));
}
4

2 回答 2

10

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

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

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

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

这给出了另一个参考:

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

感谢上面的链接。

我想在这里做一个简短的介绍:

原因是 Firefox 预取功能。对于 single.php,WP 会自动在 <header> 中放入两个 <link>,其中一个是rel="next",它指向下一篇文章(相邻文章)。

当 Firefox 看到这一点时,它会预取 <link> 指向的页面,以加快速度,以防您在阅读当前帖子后转到下一个帖子。因此,该帖子将被调用,但您永远不会看到它显示。这也是为什么您看不到为调试而转储的任何消息的原因,甚至看不到回溯。

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

于 2013-05-17T02:45:38.583 回答
1

我建议你开始自己调试,你有WP_DEBUG吗?
var_dump($query)检查哪些帖子通过了 msw_sp(),它们在页面上的什么位置?
我还建议您var_dump(is_single())检查它是否是单页。
var_dump($query->is_main_query())将判断它是页面构建查询还是额外查询。

第二个帖子是在侧边栏中的某个地方吗?

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

于 2012-08-06T07:37:13.153 回答