Làm cách nào để kích hoạt các chỉnh sửa được đề xuất?


19

Tôi thích ý tưởng cho phép bất kỳ người dùng trang web nào của tôi đề xuất các chỉnh sửa cho một trang. Giống như hệ thống chỉnh sửa trên Stack Exchange nhưng khác ở chỗ mọi người sẽ có thể chỉnh sửa, không chỉ người dùng đã đăng ký. Tất cả các chỉnh sửa sẽ trải qua một quá trình phê duyệt.

Làm thế nào tôi có thể thực hiện điều đó?


1
Tôi không biết làm thế nào để làm điều đó, nhưng tôi nghĩ rằng điều này có thể thực sự có vấn đề. Tôi nghĩ rằng bạn sẽ nhận được rất nhiều thư rác.
Martin Thoma

3
Bạn có tích cực rằng bạn yêu cầu cài đặt WordPress cho trang web của bạn? Các chức năng bạn mong muốn nghe rất giống như cài đặt MediaWiki . Bạn nên cân nhắc những ưu và nhược điểm của cả hai cài đặt. MediaWiki là một lựa chọn tốt.
Marc Đinhena

Tôi đã nảy ra xung quanh với ý tưởng này một thời gian trở lại. Giải pháp gần nhất có sẵn là plugin này: wordpress.org/support/plugin/post-forking Tuy nhiên, đây là giai đoạn rất sớm. Các plugin được giới hạn cho người dùng đã đăng ký.
Christine Cooper

Chúng tôi đã làm việc hướng tới một cái gì đó như thế này. Chúng tôi đã hình dung việc chỉnh sửa theo phong cách Wikipedia cho các bài đăng, cùng với tiện ích "Lịch sử": github.com/publishpress/Revisionary/issues/13 Chúng tôi chưa hoàn thành, nhưng gần như tất cả các cấu trúc đã sẵn sàng.
steveburge

Câu trả lời:


11

Khác biệt nội dung bài viết, tiêu đề và tác giả

Như đã phải làm một cái gì đó liên quan một vài tháng trước, đây là cách chứng minh dễ nhất và tương lai nhất (mà tôi có thể ổn) để kiểm tra xem có thay đổi nào đối với nội dung hoặc tiêu đề hay không nếu tác giả thay đổi:

// Update Title
'' !== wp_text_diff(
    $el['post_title'],
    $GLOBALS['post']->post_title
)
    AND $GLOBALS['post']->post_title = $el['post_title'];
// Update Content
'' !== wp_text_diff(
    $el['post_content'],
    $GLOBALS['post']->post_content
)
    AND $GLOBALS['post']->post_content = $el['post_content'];
// Update author
$GLOBALS['post']->post_author !== $el['post_author']
    AND $GLOBALS['post']->post_author = $el['post_author'];

Để giải thích ngắn gọn kịch bản của tôi: Tôi đã tìm nạp các bài đăng từ một vị trí từ xa thông qua API từ xa. Sau đó, tôi đã trả lại global $post, trong một vòng lặp bài đăng, chứa dữ liệu gốc hoặc dữ liệu mới. Bằng cách này, tôi đã di chuyển xung quanh cài đặt tất cả các giá trị bài đăng khác mà tôi không cần kiểm tra thay đổi.

Đề xuất chỉnh sửa

Thực tế chính người ta phải ghi nhớ khi tìm kiếm một nơi mà bản sao chỉnh sửa nội dung bài đăng có thể được lưu (tạm thời) là nội dung là một mục nhập db longtext. Vì vậy, nơi mà một người muốn lưu chỉnh sửa được đề xuất phải đáp ứng yêu cầu đó. Bình luận làm điều đó.

Sau đó, có một thực tế tuyệt vời là họ cung cấp API để đặt chúng một cách độc đáo vào một vòng lặp, do đó, nó tích hợp trơn tru, có khả năng tùy biến cao và có thể nhanh chóng được thiết lập. Cuối cùng nhưng không kém phần lớn các chủ đề đã đi kèm với các bình luận được tích hợp để dễ dàng cõng trên hệ thống và nối vào gần như mọi chủ đề có sẵn.

Tôi đề nghị chỉ mở rộng hoặc thay đổi hình thức bình luận. Sử dụng hoặc sau đây hoặc thêm các trường bổ sung với một cuộc gọi lại được nối vào comment_form_default_fields.

<?php
// Add it for logged in users and guests:
add_action( 'comment_form_logged_in_after', 'wpse_proposed_edit_textarea' );
add_action( 'comment_form_after_fields', 'wpse_proposed_edit_textarea' );
function wpse_proposed_edit_textarea()
{
    ?>
    <p class="comment-form-title">
        <label for="wpse_propsed_edit">
            <?php _e( 'Propose Edit', 'your_textdomain' ); ?>
        </label>
        <textarea name="wpse_propsed_edit" id="wpse_propsed_edit">
            <?php the_content(); ?>
        </textarea>
    </p>
    <input type="hidden" name="comment_approved" id="comment_approved" value="0" />
    <?php
}

Vì vậy, tôi đã thêm một hiddentrường comment_approvedvới giá trị 0để đặt nó trong hàng đợi. Không chắc chắn nếu điều này sẽ hoạt động hoặc nếu giá trị (cốt lõi) này thực sự là nhận xét dữ liệu meta và cần được thêm bằng cách sử dụng add_comment_meta()trong khi lưu. Nếu không, bạn có thể sử dụng một cái gì đó dọc theo các dòng mã sau đây

add_filter( 'pre_comment_approved' , 'wpse_pre_suggest_edit', 100, 2 );
function wpse_pre_suggest_edit( $approved , $commentdata )
{
    // You might need to inspect $commentdata 
    // to determine approval, disapproval, or spam status
    if ( ! empty( $commentdata['wpse_propsed_edit'] ) )
    {
        # Now add a filter to the comment post action, so we save a meta entry
        add_action( 'comment_post', 'wpse_set_proposed_edit' );
        return 0;
    }

    return 1;
}

// This function makes it easier for us to identify the comments by their meta value
function wpse_set_proposed_edit( $comment_id );
{
    // Only run once
    remove_filter( current_filter(), __FUNCTION__ );

    add_comment_meta( $comment_id, 'proposed_edit', true, true );
}

Hiển thị các ý kiến ​​về phía quản trị viên

Ở đây tôi sẽ đi với một phần mở rộng lớp đơn giản và một trang quản trị tùy chỉnh:

function wpse_add_proposed_edits_admin_page()
{
    add_menu_page(
        'Proposed Edits',
        'Suggested Edits',
        'activate_plugins',
        'proposed_edits',
        'wpse_proposed_edits_page_cb'
    );
}
add_action( 'admin_menu', 'wpse_add_proposed_edits_admin_page' );

function wpse_proposed_edits_page_cb()
{
    $proposed_edits_table = new WP_Proposed_Edits_Table();
    $proposed_edits_table->prepare_items(); 
    $proposed_edits_table->display(); 
}

class WP_Proposed_Edits_Table extends WP_List_Table
{
    // Override List table default logic in here
}

Thông tin thêm có thể được tìm thấy trên WPEngineer .

Phê duyệt chỉnh sửa

Sau đó, bạn có thể thêm các hành động tùy chỉnh và xử lý các chỉnh sửa được đề xuất bằng mã đầu tiên tôi đã hiển thị để kiểm tra xem có thay đổi hay không và sau đó chỉ cần cập nhật bài đăng. Nhận xét tự nó giữ một giá trị với một khóa comment_post_ID, vì vậy việc xác định ID bài đăng đã chỉnh sửa là đơn giản.

Lưu ý cuối cùng

Tôi cũng muốn xem plugin cuối cùng. Vui lòng liên kết nó ở đây :)


1
Tôi đưa tiền thưởng cho câu hỏi này cho ý tưởng sử dụng meta nhận xét để lưu trữ chỉnh sửa được đề xuất và wp_text_diff()để so sánh thực tế. Upvote cho các câu trả lời khác.
fuxia

8

Ý tưởng của tôi là một cái gì đó đơn giản.

  • Bạn có thể tạo một Edit Suggestionliên kết ở cuối các bài đăng có mẫu được xác định tùy chỉnh, trong đó sử dụng hộp văn bản (có thể với trình chỉnh sửa) được liên kết với phân loại tùy chỉnh với giá trị mặc định là post content.

  • Mọi thay đổi contentsẽ được so sánh với original post contentsau khi gửi (dưới dạng Bản nháp) và Nhập CAPTCHA codebằng thuật toán Diff như gói PHP-diff hoặc Gói Text-Diff PEAR hoặc sử dụng một hàm PHP theo cách này cho các văn bản không quá dài với sự kết hợp của CSS.

  • Sau đó, bằng cách lưu các giá trị trong 3 Hộp Meta tùy chỉnh (trong trang thêm / chỉnh sửa back-end phân loại đó) hiển thị

    1. Nội dung gốc
    2. Phiên bản đã chỉnh sửa
    3. Tên người dùng và Email của anh ấy

    và tiết kiệm Post IDcó thể với một update_option()chức năng để sử dụng sau.

  • Sau khi đọc phiên bản chỉnh sửa và được quản trị viên chấp nhận, bài đăng đó sẽ được thay thế phiên bản gốc như bạn đã mã hóa trong hàm.php.


Một số lưu ý: (A) "như bạn đã mã hóa trong hàm.php" - không đồng ý với điều này. Đây là tài liệu plugin. (B) "được liên kết với phân loại tùy chỉnh với giá trị mặc định của nội dung bài đăng" - Thuật ngữ phân loại / đơn vị phân loại chỉ có một giá trị có thể có trong đó nội dung sẽ phù hợp trong mọi trường hợp: Mô tả. Và sau đó bạn sẽ cần một nơi để lưu ID bài. Nơi này sẽ ở đâu? Vì không có chỗ cho điều này do giới hạn của hệ thống thuế WP, bạn chỉ có thể lưu ID hạn. Sau đó, đây chỉ là hệ thống một chiều (có giới hạn): Đăng> Dữ liệu kỳ hạn.
kaiser

4

Điều này khá phức tạp, một câu trả lời thích hợp sẽ mất thời gian đáng kể để viết. Vì vậy, đây không phải là một câu trả lời thực sự chỉ là một số suy nghĩ ..

Sử dụng WordPress tích hợp wp_update_postthông qua ajax sẽ cung cấp cho bạn lịch sử sửa đổi cần thiết nhưng không có khả năng cần thiết để phê duyệt các chỉnh sửa.

Việc tạo các bản nháp từ các chỉnh sửa theo mặc định là không thể nhưng đã được thảo luận ở đây, Có cách nào để soạn thảo bản sửa đổi của một trang hoặc bài đăng đã xuất bản không? Cách giải quyết bạn đã sử dụng?

Bạn có thể thử và sử dụng Front-end Editor nhưng bạn sẽ không kiểm soát các chỉnh sửa được xuất bản, vì vậy hãy thử và kết hợp nó với một plugin khác như Revisionary cho phép chỉnh sửa dựa trên quyền, tôi không biết chúng có hoạt động cùng nhau không.

Nếu họ không, bạn sẽ phải hack một plugin dựa trên 2 plugin trên hoặc viết một cái gì đó từ đầu.

Cách tiếp cận đầu tiên của tôi sẽ là có một nút đi đến một trang khác xuất nội dung bài đăng / dữ liệu bằng JSON , dễ dàng làm việc hơn khi sử dụng các trình soạn thảo Ajax và WYSIWYG. Nút lưu sẽ đăng dưới dạng bản nháp thay vì xuất bản và theo cách đó bạn sẽ có quyền kiểm soát các chỉnh sửa (xem phần thảo luận của WPSE ở trên về cách thực hiện việc này, điều đó khá khó khăn).

Có nhiều sự phức tạp khi thực hiện việc này như vệ sinh, mã hóa, spam, xử lý phương tiện, trường tùy chỉnh, dấu thời gian, bộ nhớ, v.v. .

ps. Đây là một ý tưởng tốt cho một plugin.

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.