問題描述

我喜歡讓我的網站的任何使用者建議對頁面進行修改的想法。很像 Stack Exchange 上的編輯系統,但不同之處在於任何人都應該能夠編輯,而不僅僅是註冊使用者。所有編輯都將透過審批流程。

我該如何實現?

最佳解決方案

比較帖子內容,標題和作者

如同一個月前做過的事情一樣,這裡是最簡單和最未來的證明方式 (我可以罰款),以檢查內容或標題是否有變化,或者作者更改:

// 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'];

簡要解釋我的情況:我透過遠端 API 從遠端位置獲取帖子。然後,我在單個後期迴圈中返回 global $post,其中包含原始資料或新資料。這樣我就移動了設定所有其他不需要檢查更改的帖子值。

提出編輯

搜尋帖子內容的 copy-edit 可以 (暫時) 儲存的地方的主要事實是,內容是 longtext 的資料庫條目。所以想要儲存建議的編輯的地方應該符合這個要求。評論這樣做

那麼有一個很好的事實,他們提供了一個 API 來將它們放在一個迴圈中,所以它整合順利,高度可定製,可以快速設定。最後但並非最不重要的主題已經整合了評論,因此很容易搭載系統並掛接幾乎任何可用的主題。

我建議只要 (或者) 擴充套件或更改評論表單。使用以下任意一項或新增附加欄位與回撥掛鉤到 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
}

所以我新增了一個值為 0 的 comment_approved 的隱藏欄位,將其設定在佇列中。不知道這是否工作,或者這個 (核心) 值實際上是註釋後設資料,並且需要在儲存期間使用 add_comment_meta() 來新增。如果沒有,您可以使用以下程式碼行

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

在管理員端顯示評論

這裡我可以使用一個簡單的類副檔名和自定義的管理頁面:

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
}

更多資訊 can be found on WPEngineer

批准編輯

然後,您可以新增自定義操作,並使用我顯示的第一個程式碼處理建議的編輯,以檢查是否有更改,然後僅更新該帖子。評論本身擁有一個帶有 comment_post_ID 的鍵的值,因此識別編輯的帖子 ID 是直接的。

最後說明

我也想看看最終的外掛。請連結到這裡:)

次佳解決方案

我的想法很簡單。

  • 您可以在具有自定義模板的帖子的底部建立一個 Edit Suggestion 連結,其中使用與預設值 post content 相關聯的自定義分類法的文字框 (可能包含編輯器) 。

  • content 的任何更改與 original post content 進行比較,作為草案提交 (original post content),並使用 PHP inline-diff 包或 Text-Diff PEAR 包中的 Diff 演演算法輸入 CAPTCHA code,或者使用不具有 CSS 組合的 too-long 文字的 PHP 函式。

  • 然後透過在 3 個自定義元框 (在分類法 back-end 新增/編輯頁面) 中儲存值

    1. 原創內容

    2. 編輯版本

    3. 使用者暱稱和他的電子郵件

    並且可以使用 update_option()功能節省 Post ID 以供將來使用。

  • 閱讀編輯版本和管理員接受後,該職位將被替換為原始的一個,如在 functions.php 中編碼。

第三種解決方案

這很複雜,一個適當的答案需要相當長的時間來寫。所以這不是一個真正的答案只是一些想法..

透過 ajax 在 wp_update_post 中使用 WordPress 構建將為您提供所需的修訂歷史記錄,而不是批准編輯所需的功能。

預設情況下,編輯建立草稿是不可能的,但這裡已經討論過了,Is there any way to draft a revision of a published page or post? What workarounds have you used?

您可以嘗試使用 Front-end Editor,但是您無法控制正在釋出的編輯內容,因此請嘗試使用另一個外掛 (如 Revisionary) 進行混搭,該外掛允許基於許可權的編輯,我不知道他們是否會一起工作。

如果不這樣做,你將不得不基於上述 2 個外掛來插入一個外掛,或者從頭開始寫一些東西。

我的劃痕方法是將一個按鈕轉到另一個使用 JSON 輸出帖子內容/資料的頁面,這在使用 Ajax 和 WYSIWYG 編輯器時更容易使用。儲存按鈕將作為草稿釋出,而不是釋出,並且您可以控制編輯 (參見上文 WPSE 討論如何完成此操作,相當艱鉅) 。

在執行此操作時還會出現額外的複雜性,例如清潔,編碼,垃圾郵件,媒體處理,自定義欄位,時間戳,記憶體等。好訊息是,wordpress 已經具有可插入的修訂系統和處理多個編輯器的體面能力。

PS 。這是外掛的好主意。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。