问题描述
我有一个 IFTTT recipe,在某些场合为我创建职位,但由于某些奇怪的原因,它会创建三个,有时四个相同内容的帖子。
我想添加一个 add_action 钩子/回调来验证什么将是一个新的帖子,如果已经存在,取消该帖子,或将其移动到垃圾桶或类似的东西。
我找到了 xmlrpc_prepare_post,但我不认为我可以从那里取消它。除非我可以更新一些属性并将其设置为垃圾桶?
更新。
我尝试了以下,它只有进入 xmlrpc_call,但从来没有在 xmlrpc_wp_insert_post_meta 中。我甚至添加了一个 hard-coded add_filter 调用 (不仅仅是在 newPost 的情况下),我的日志永远不会显示这样的日志消息。
以下是代码:
function hueman_xmlrpc_call( $method )
{
error_log("XMLRPC | hueman_xmlrpc_call Method = $method n" , 3, '/home/.../debug.log');
if( 'wp.newPost' === $method || 'metaWeblog.newPost' === $method )
{
error_log("XMLRPC | hueman_xmlrpc_call method = " . $method . " n" , 3, '/home/.../debug.log');
add_filter( 'xmlrpc_wp_insert_post_data', 'hueman_xmlrpc_wp_insert_post_data' );
}
}
add_action('xmlrpc_call', 'hueman_xmlrpc_call', 1 );
add_filter( 'xmlrpc_wp_insert_post_data', 'hueman_xmlrpc_wp_insert_post_data' );
function hueman_xmlrpc_wp_insert_post_data( $post_data )
{
error_log("XMLRPC | hueman_xmlrpc_wp_insert_post_data n" , 3, '/home/.../debug.log');
// Check if the post title exists:
$tmp = get_page_by_title(
$post_data['post_title'],
OBJECT,
$post_data['post_type']
);
if( is_object ( $tmp ) )
{
// Go from 'insert' to 'update' mode within wp_insert_post():
//$post_data['ID'] = $tmp->ID;
$post_data['post_status'] = 'trash';
error_log("XMLRPC | hueman_xmlrpc_wp_insert_post_data I TRASHED IT! n" , 3, '/home/.../debug.log');
}
return $post_data;
}
在日志中,我有这样的日志语句:
XMLRPC | hueman_xmlrpc_call Method = mt.supportedMethods
XMLRPC | hueman_xmlrpc_call Method = metaWeblog.getRecentPosts
XMLRPC | hueman_xmlrpc_call Method = mt.supportedMethods
XMLRPC | hueman_xmlrpc_call Method = metaWeblog.getRecentPosts
XMLRPC | hueman_xmlrpc_call Method = mt.supportedMethods
XMLRPC | hueman_xmlrpc_call Method = metaWeblog.getRecentPosts
XMLRPC | hueman_xmlrpc_call Method = metaWeblog.getCategories
XMLRPC | hueman_xmlrpc_call Method = metaWeblog.newPost
XMLRPC | hueman_xmlrpc_call method = metaWeblog.newPost
然后,我看到创建文章时添加的其他过滤器。我知道我可能 end-up 固定文章在那里,但我确信这个 XMLRPC 过滤器/操作应该工作。
从日志中,我看到它进入 ifPostPost 并添加过滤器’xmlrpc_wp_insert_post_data’,但它从不执行 hueman_xmlrpc_wp_insert_post_data 函数… 🙁
最佳解决方案
看起来 xmlrpc_prepare_post 过滤器仅适用于 wp_xmlrpc_server 类的 wp_getPost 和 wp_getRevision 方法的输出。
如果这段代码行会很好:
do_action( 'xmlrpc_call', 'wp.newPost' );
将替换为额外的输入参数,例如:
do_action( 'xmlrpc_call', 'wp.newPost', ..., $content_struct );
但是根据这个 ticket 不会发生。
所以我们需要找到另一种方法。
可能的解决方法:
以下是使用 xmlrpc_call 和 xmlrpc_wp_insert_post_data 滤波器的一些未经测试的想法。
在使用 wp_insert_posts()插入之前修改输入数据:
/**
* Prevent duplicate posts when doing wp.newPost via XML-RPC
*
* @see http://wordpress.stackexchange.com/a/157261/26350
*/
add_action( 'xmlrpc_call', 'wpse_xmlrpc_call' );
function wpse_xmlrpc_call( $method )
{
if( 'wp.newPost' === $method )
add_filter( 'xmlrpc_wp_insert_post_data', 'wpse_xmlrpc_wp_insert_post_data' );
}
function wpse_xmlrpc_wp_insert_post_data( $post_data )
{
// Check if the post title exists:
$tmp = get_page_by_title(
$post_data['post_title'],
OBJECT,
$post_data['post_type']
);
// Go from 'insert' to 'update' mode within wp_insert_post():
if( is_object ( $tmp ) )
$post_data['ID'] = $tmp->ID;
return $post_data;
}
在 wp.newPost 调用期间,我们尝试找到具有相同标题的现有帖子。如果我们找到一个,我们将 ID 添加到 $post_data 数组,因此它将被更新。
请注意,我们也可以修改 post_status:
$post_data['post_status'] = 'trash';
所以所有额外的插入物被导向垃圾。
您还可以通过 xmlrpc_methods 过滤器尝试使用 create your own 插入方法。
我希望你可以根据你的需要修改这个,假设这将工作;-)
更新:我已经测试了这个想法,它的工作原理,我可以垃圾重复的帖子或直接更新。
感谢 @DavidPeterson 从 WPSE 编辑器中编辑代码时注意到我愚蠢的 PHP 语法错误;-)
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。