問題描述

我有一個 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。