Làm cách nào để xác thực việc tạo và hủy bài viết XML-RPC khi cần?


7

Tôi có một công thức IFTTT tạo ra các bài đăng cho tôi trong một số trường hợp, nhưng vì một số lý do kỳ lạ, nó tạo ra ba, đôi khi bốn bài đăng có cùng nội dung.

Tôi muốn thêm một add_actionhook / callback để xác thực bài đăng mới và nếu nó đã tồn tại, hãy hủy bài đăng hoặc chuyển nó vào thùng rác hoặc một cái gì đó tương tự.

Tôi đã tìm thấy xmlrpc_prepare_postnhưng tôi không nghĩ rằng tôi có thể hủy bỏ nó từ đó. Trừ khi tôi có thể cập nhật một số thuộc tính và đặt nó vào thùng rác?

Cập nhật.

Tôi đã thử những điều sau đây và nó chỉ được đưa vào xmlrpc_call, nhưng chưa bao giờ bên trong xmlrpc_wp_insert_post_meta. Tôi thậm chí đã thêm một cuộc gọi add_filter được mã hóa cứng (không chỉ trong trường hợp nếu newPost) và nhật ký của tôi không bao giờ hiển thị thông báo ghi nhật ký như vậy.

Đây là mã:

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;  
}

Trong nhật ký, tôi có loại báo cáo nhật ký này:

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 

Sau đó, tôi thấy các bộ lọc khác mà tôi đã thêm khi một bài viết được tạo. Tôi biết có lẽ cuối cùng tôi sẽ sửa các bài viết ở đó nhưng tôi chắc chắn rằng các bộ lọc / hành động XMLRPC này sẽ hoạt động.

Từ nhật ký, tôi thấy nó đi vào bên trong if newPost và thêm bộ lọc 'xmlrpc_wp_insert_post_data' nhưng nó không bao giờ thực thi hàm hueman_xmlrpc_wp_insert_post_data ... :(


4
Một câu hỏi rất hay (và thú vị). Bạn có thể vui lòng gửi một bản chỉnh sửa và giải thích cách IFTTT hoạt động cùng với WP, cách bạn thiết lập nó và cách bạn trỏ đến giao diện XML-RPLC không? Xin hãy dài dòng nhất có thể vì điều này có khả năng trở thành một câu hỏi rất hoành tráng. Cảm ơn.
kaiser

Nó thực sự rất đơn giản. Tôi đã sử dụng IFTTT với công thức RSSpress Wordpress. Đã cắm nguồn cấp dữ liệu RSS của tác giả từ trang bên ngoài. Trong Wordpress, tôi đã đăng nhập người dùng Wordpress thường xuyên của mình. đây là kênh: ifttt.com/wordpress và công thức: ifttt.com/recipes/19382-rss-feed-to-wordpress-blog
Vallieres

Câu trả lời:


7

Có vẻ như xmlrpc_prepare_postbộ lọc chỉ được áp dụng cho đầu ra của wp_getPostwp_getRevisioncác phương thức của wp_xmlrpc_serverlớp.

Sẽ thật tuyệt nếu dòng mã này:

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

sẽ được thay thế bằng các đối số đầu vào bổ sung, ví dụ:

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

nhưng điều đó sẽ không xảy ra theo này .

Vì vậy, chúng ta cần phải tìm một cách khác xung quanh này.

Cách giải quyết có thể:

Dưới đây là một số ý tưởng chưa được kiểm tra bằng cách sử dụng xmlrpc_callvà các xmlrpc_wp_insert_post_databộ lọc.

Sửa đổi dữ liệu đầu vào trước khi nó được chèn bằng 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;  
}

Ở đây chúng tôi cố gắng tìm một bài đăng hiện có cùng tiêu đề, trong wp.newPostcác cuộc gọi. Nếu chúng ta tìm thấy một, chúng ta thêm nó IDvào $post_datamảng, vì vậy nó sẽ được cập nhật thay thế.

Lưu ý rằng chúng ta cũng có thể đã sửa đổi post_statusthay thế bằng:

    $post_data['post_status'] = 'trash'; 

vì vậy tất cả các phần chèn thêm được hướng vào thùng rác .

Bạn cũng có thể thử tạo phương thức chèn của riêng mình thông qua xmlrpc_methodsbộ lọc.

Tôi hy vọng bạn có thể sửa đổi điều này theo nhu cầu của bạn, giả sử điều này sẽ hoạt động ;-)

Cập nhật : Bây giờ tôi đã thử nghiệm ý tưởng này và nó hoạt động, tôi có thể bỏ rác các bài đăng trùng lặp hoặc cập nhật trực tiếp.

Cảm ơn @DavidPeterson vì đã nhận thấy các lỗi cú pháp PHP ngớ ngẩn của tôi từ khi tôi chỉnh sửa mã trong trình soạn thảo WPSE ;-)


Điều này thật đúng với gì mà tôi đã tìm kiếm! Tôi đã thực hiện giải pháp của bạn, hy vọng nó sẽ hoạt động đúng và đặt tất cả các bản sao vào thùng rác. Tôi sẽ biết lần sau XMLRPC được kích hoạt!
Vallieres

Xin chào, nó không hoạt động như dự định. Xem bên dưới những gì tôi đã làm. :(
Vallieres

Xin chào @vallieres, cảm ơn bạn đã báo cáo lại. Hy vọng tôi có thể tìm thấy vấn đề.
bạch dương

Cảm ơn @birgire, đây thực sự là khu vực không tìm thấy tài liệu và / hoặc ví dụ. Bạn có thể nghĩ rằng tôi không phải là người duy nhất muốn lọc các bài viết XMLRPC ...
Vallieres

bạn có thể làm cho nó hoạt động? Về phần tôi, nó dường như không hoạt động gì cả :(
Vallieres

1

Trong tệp wp-gồm / class-wp-xmlrpc-server.php

Bên trong hàm mw_newPost () sau các dòng này:

$post_title = isset( $content_struct['title'] ) ? $content_struct['title'] : null;
$post_content = isset( $content_struct['description'] ) ? $content_struct['description'] : null;

Thêm vào:

global $wpdb;
$some_post = $wpdb->get_row("
    SELECT ID
    FROM {$wpdb->posts}
    WHERE post_title = '{$post_title}'
");

Và tạo một tuyên bố:

if (!empty($some_post->ID) and $some_post->ID > 0) {
    return 0;
} else {
    // the rest of the code that already exists in the function
    /*
    $post_status = $publish ? 'publish' : 'draft';
    ...
    return strval($post_ID);
    */
}

1
Xin chào, giải pháp khéo léo nhưng điều đó sẽ dễ dàng bị ghi đè bởi bất kỳ bản cập nhật Wordpress nào sau khi thay đổi. Bất kỳ cách nào để làm cho nó hoạt động từ một plugin hoặc hàm.php?
Vallieres

1
@Vallieres, Vâng, bạn nói đúng, sau đó tôi đã vô hiệu hóa các bản cập nhật WordPress. Tôi muốn tạo một plugin sớm.
Brynner Ferreira
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.