直接查询wpdb并跳过由WP的核心“wp_update_post”提供的操作是个好主意吗?

时间:2018-12-17 作者:coolpasta

我需要一次查询很多帖子。在这里,很多事情和性能都非常重要——事情进展缓慢会给我带来很多糟糕的评论,但稍微减少一下WP的开销可能会给我带来更快的结果,这需要权衡。

长话短说,这是我的最后一段代码,它运行得很快,而且我的意思是,它确实运行得很快,内存占用也很小,但没有开销,这意味着,在调用时没有通常会触发的操作wp_update_post:

$posts_to_hide = new \\WP_Query([
    \'post_type\' => \'post\',
    \'fields\' => \'ids\',
    \'posts_per_page\' => \'-1\',
]);

global $wpdb;

while ( $next_posts = array_splice( $posts_to_hide->posts, 0, 10 ) ) {
    foreach( $next_posts as $index => $id ) {
        $wpdb->query( "UPDATE $wpdb->posts SET post_status=\'draft\' WHERE ID=$id");
    }
}
如果我正在更新帖子的状态,您通常会:

foreach( $next_posts as $index => $id ) {
    wp_update_post( [\'ID\' => $id, \'post_status\' => \'draft\' ] );
}
但这一变化幅度应该会变慢。

事实是,我的环境(即使它将部署到数千个站点)非常特殊,并且受到高度控制-这些帖子是我创建的,这些帖子不需要外部力量来“美化”它们,但如果发生了,那完全没关系,所以他们准备好了在不破坏体验的情况下进行攻击。

**除了我的插件放入的帖子,我永远不会查询任何其他帖子(我的WP\\u查询更复杂,它只返回我的插件创建的帖子)。时期这些帖子,考虑到我的插件的范围,不需要其他插件所做的修改/改进,例如,SEO插件可能会更改我的标题/结构,但这并不是必需的,如果发生这种情况,那么在我的插件将这些帖子插入系统后,上面的这个函数将立即运行,因此,没有竞争条件——帖子被导入,这将运行,没有两条路可以绕过它。此外,这些帖子是“模拟帖子”,客户对此非常理解。

因此,根据我的情况,我可以跳过WP提供的所有挂钩吗?

我特别要说的是,错过了wp_insert_post 所使用的wp_update_post. 任何与之挂钩的插件/功能都不会看到我的帖子被更新。

1 个回复
SO网友:Johansson

使用直接修改数据库的想法$wpdb 不是你应该担心的,而是wp_update_post() 这是你应该考虑的。此函数在内部使用$wpdb 更新帖子,如果你知道自己在做什么,那么就去做。

但是

许多插件可以挂接到一旦使用此功能就会触发的操作中。

例如,一旦帖子的状态更改为draft,缓存插件决定是否清除存档的缓存,draft不应再显示在存档中。

因此,如果您确定没有任何东西连接到该函数中,也没有任何东西会连接到该函数中(这很奇怪),那么您可以使用SQL来实现这一点。

还可以考虑其他因素,例如在对数据库结构进行罕见更改的情况下(好吧,我们刚刚用Gutenberg很快地替换了WYSIWYG编辑器,所以这也可能发生)。在这种情况下,内置函数将自动更新,而您的代码不会也很可能会导致问题。

相关推荐

如何同时使用wpdb导出和导入?

当我使用WP-CLI 我对wp db export和wp db import命令有一些问题。我的桌面上有一个本地站点,我想迁移到我的笔记本电脑上,这样我就可以使用它了。因此,我在桌面上,导航到适当的目录并键入wp db export. 成功创建文件:ccv3-2018-07-12-4e523fb.sql这是我不明白的部分。我将它在桌面上创建的SQL文件复制粘贴到本地网站所在的笔记本电脑目录。I类型wp db import ccv3-2018-07-12-4e523fb.sql --authors=skip