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