web-dev-qa-db-ja.com

推奨編集を有効にする方法

私は自分のウェブサイトのどのユーザもページの編集を提案できるようにするという考えが好きです。 Stack Exchangeの編集システムによく似ていますが、登録ユーザーだけでなく、誰でも編集できるようにする必要があるという点で異なります。すべての編集は承認プロセスを経ます。

それをどのように実装できますか?

19
Patrick Klug

投稿内容、タイトル、作者を比較する

数か月前に何か関連したことをしなければならなかったので、これは内容またはタイトルに変更があったかどうか、あるいは作者が変更したかどうかをチェックする最も簡単で将来の証明方法です

// 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を介して遠隔地から投稿を取得していました。その後、元のデータまたは新しいデータのいずれかを含む、1回のポストループ中にglobal $postを返しました。このようにして、変更をチェックする必要がない他のすべてのpost値を設定しました。

編集を提案する

投稿コンテンツのコピー編集が(一時的に)保存される可能性がある場所を検索するときに気を付けなければならない主な事実は、そのコンテンツがlongtextのdbエントリであるということです。したがって、提案された編集を保存したい場所はその要件を満たす必要があります。コメントしてください。

それから、彼らがそれらをうまくループに入れるために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
}

そのため、キューに設定するためにcomment_approvedの値を持つ0hiddenフィールドを追加しました。これが機能するかどうか、またはこの(コア)値が実際にはコメントメタデータであり、保存中に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
}

より多くの情報 はWPEngineerで見つけることができます

編集を承認する

その後、カスタムアクションを追加し、私が示した最初のコードを使用して提案された編集を処理し、変更があるかどうかを確認してから投稿を更新することができます。コメント自体はcomment_post_IDのキーを持つ値を保持しているので、編集された投稿IDを識別するのは簡単です。

最後のメモ

最後のプラグインも見たいのですが。ここにリンクしてください:)

11
kaiser

私の考えは単純なものです。

  • カスタム定義のテンプレートを含む投稿の最後にEdit Suggestionリンクを作成できます。その場合は、デフォルト値のpost contentを持つカスタム分類法にリンクされたテキストボックスを使用します(おそらくエディタ付き)。

  • contentへのどんな変更も(Draftとして)提出し、 PHP inline-diff package または Textのような)Diffアルゴリズムでoriginal post contentを入力した後でCAPTCHA codeと比較されます。 -Diff PEAR Package または または this に従ってPHP関数を使用しないでください - CSSの組み合わせによる長いテキスト.

  • 次に、表示されている3つのカスタムメタボックス(分類法のバックエンドの追加/編集ページ)に値を保存します。

    1. 元のコンテンツ
    2. 編集版
    3. ユーザーのニックネームと彼のEメール

    そして後で使用するためにPost IDupdate_option()関数で保存することもできます。

  • 編集されたバージョンを読み、adminが承認した後、そのポストはfunctions.phpでコーディングしたとおりに元のものと置き換えられます。

8
revo

まあ、これはかなり複雑です。適切な答えを書くにはかなりの時間がかかります。したがって、これはいくつかの考えだけでは本当の答えではありません。

WordPress build in wp_update_post viaajaxを使用すると、必要な改訂履歴が得られますが、編集の承認に必要な機能は得られません。

編集から下書きを作成することはデフォルトでは不可能ですが、ここで説明しました 公開されたページまたは投稿のリビジョンを下書きする方法はありますか?どのような回避策を使用しましたか?

Front-end Editor を試して使用できますが、公開されている編集を制御することはできません。そのため、許可を許可する Revisionary などの別のプラグインで試してみてください。ベースの編集、それらが一緒に動作するかどうかはわかりません。

そうでない場合は、上記の2つのプラグインに基づいてプラグインをハッキングするか、ゼロから何かを記述する必要があります。

私のスクラッチアプローチは、JSONを使用して投稿コンテンツ/データを出力する別のページに移動するボタンを使用することです。 AjaxおよびWYSIWYGエディターを使用する場合。保存ボタンは、公開ではなくドラフトとして投稿し、その方法で編集を制御できます(これを達成する方法に関する上記のWPSEの議論を参照してください、それはかなり困難です)。

これを行うと、サニタイズ、エンコード、スパム、メディア処理、カスタムフィールド、タイムスタンプ、メモリなど、さらに複雑な問題が発生します。幸いなことに、wordpressにはプラグイン可能なリビジョンシステムが既にあり、複数のエディターを処理するまともな能力。

追伸これはプラグインにとって良い考えです。

4
Wyck