问题描述

我有一个 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_getPostwp_getRevision 方法的输出。

如果这段代码行会很好:

do_action( 'xmlrpc_call', 'wp.newPost' );

将替换为额外的输入参数,例如:

do_action( 'xmlrpc_call', 'wp.newPost', ..., $content_struct );

但是根据这个 ticket 不会发生。

所以我们需要找到另一种方法。

可能的解决方法:

以下是使用 xmlrpc_callxmlrpc_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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。