在不破坏比较修订工具的情况下通过phpMyAdmin编辑帖子的正确方法

时间:2019-09-04 作者:sound wave

在我网站上的数百篇帖子中,一个特定的字符串需要被另一个字符串替换,但这个替换只能在发布的帖子上执行,而不能在修订版上执行。

我找到的插件(search&replace、better search replace等)没有此功能,因此必须使用phpMyAdmin完成这项工作。这可以通过此查询完成

UPDATE `wp_posts` SET `post_content` = REPLACE(`post_content`, \'tobereplaced\', \'replacement\')
WHERE post_type=\'post\' AND post_status=\'publish\'
问题是,这样做不会编辑最新版本,因此在wordpress“比较修订”工具中,不会显示已编辑的帖子(包含替换内容)。

这意味着,如果一篇文章通过phpMyAdmin按顺序编辑,比如5次,那么前4次编辑将“丢失”,因为不会为它们创建修订。

例如

我创建了一篇标题为abc 其内容只是1, 修订框(在wordpress上)为空,然后使用wordpress编辑器替换1 具有2, “修订”框现在显示两个修订:最近的一个包含2 另一个包含12 具有3, 修订框现在显示三个修订:前两个加上另一个包含3

enter image description here

enter image description here

<然后使用phpMyAdmin查询替换3 具有4, 没有新的修订,然后仍然使用phpMyAdmin查询I replace4 具有5, 没有新的修订,然后使用wordpress编辑器替换5 具有6, 修订框现在显示四个修订:前三个加上另一个包含6

enter image description hereenter image description here

因此,由于没有为创建修订45, 该帖子的编辑历史记录有一个漏洞。

为了解决这个问题,我想在使用phpMyAdmin时,不仅应该编辑已发布的帖子,还应该编辑最新的修订。在数据库中,有一个值仅由发布的帖子和最新版本共享,它是post_modified 日期

是否可以编写只更新已发布帖子和最新修订的查询?这有用还是有更好的解决方法?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

之所以存在漏洞,是因为修订历史记录不是SQL更改的历史记录。每个修订版本在数据库中表示为一个post类型revision. 要显示您的更改,请添加revision 需要张贴。

要做到这一点,您需要通过PHP而不是SQL更新帖子。您可以通过接口RESTAPI调用wp_update_post, 但对于批量处理,我建议使用WP CLI。类似于以下内容:

CONTENT=$(wp post get 123 --field=content)
.. adjust CONTENT to do your search replace ( maybe with sed or awk? )
wp post update 123 --post_content="$CONTENT"
https://developer.wordpress.org/cli/commands/post/update/https://developer.wordpress.org/cli/commands/post/get/

然后,只需获取每个帖子,并运行上面的循环就可以了。这将确保所有挂钩和过滤器都被触发。它没有SQL查询那么快,但可以正常工作。

您可能还希望使用search-replace命令而不是原始SQL来直接交换数据库中的字符串,因为它可以在options和post-meta中正确处理序列化的PHP

相关推荐

从unctions.php获取变量的值并进行调试

我试图检查函数中获得的变量。php用于调试目的。我通过执行shortcode来获取当前登录的用户,定义了一个变量$current\\u user。然后我使用if语句来验证是否有当前登录的用户,在这种情况下,应该应用函数前面定义的CSS样式。它当前不起作用,因此我正在尝试研究$current\\u用户变量,但我尝试过的所有变体都不起作用,包括error\\u log。功能。php(片段):add_shortcode(\'show_css_code_conditionally\', \'show_css_co