我已经花了几个小时试图找出到底发生了什么,并且我假设我遇到了Worpress核心的错误。在发布错误报告之前,我认为在此处进行描述是个好主意。我可能只是想念一些简单的东西。
摘要::我正在使用基于XML-RPC的this plugin将帖子从一个站点发送到另一个站点。这两个站点是相同的,它们在同一台计算机上运行,具有相同的PHP和Wordpress版本,并且具有相同的主题。它工作了大约一年左右就很好了。
问题:最近,我遇到了一些自定义字段无法同步的问题。我有使用ACF插件注册的自定义字段。奇怪的是,一个字段(contact_details
,这是一个可重复的字段)已成功同步,但是另一个字段(description
,只是一个文本字段)不会在另一个网站上显示。甚至当我查看wp_postmeta表时也没有。
首先,我希望旧插件无法正常工作,但是当我在另一端使用xmlrpc_call挂钩时,我可以看到那里的所有数据都很好。因此我开始怀疑它们何时消失。经过长时间的研究,我终于找到了用于过滤元字段列表的行。
可能的错误:我在/wp-includes/class-wp-xmlrpc-server.php
的第394行发现了一个问题。 XML-RPC服务器检查当前用户是否具有创建元字段的能力。事实是,用于向该网站进行身份验证的用户是管理员,所以我认为没有任何不允许该用户执行的操作。
我继续调查,发现实际上没有称为add_post_meta
,edit_post_meta
或delete_post_meta
的功能。因此,我想说它在上一年已过时,但是没有人在XML-RPC服务器中修复它,因为几乎没有人使用它。
我不完全确定这是一个错误。原因是仅对某些自定义字段进行了过滤。在调查过程中,我注意到Yoast SEO开发人员将他们使用的元字段列入了白名单。您可以在第395行的/inc/wpseo-non-ajax-functions.php
中找到列入白名单的程序。但是我没有提到这一点。他们为什么要那样做?即使用户具有所有可能的功能,Wordpress还是阻止XML-RPC创建元字段是某种安全功能吗?
适用于任何可能遇到类似问题的人。我使用的修复程序是一个片段,该片段为每个有能力编辑帖子的用户添加了add_post_meta
和edit_post_meta
。在下面找到它。
add_filter( 'user_has_cap', 'allow_meta_options_to_be_added', 0, 3 );
function allow_meta_options_to_be_added($allcaps, $cap, $args) {
if ( in_array( $args[0], array( 'edit_post_meta', 'add_post_meta' ), true ) ) {
if ( current_user_can( 'edit_post', $args[2] ) ) {
$allcaps[ $args[0] ] = true;
}
}
return $allcaps;
}