提案された編集を有効にする方法


19

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

どうすれば実装できますか?


1
方法はわかりませんが、これは本当に問題があると思います。大量のスパムが届くと思います。
マーティントーマ

3
WebサイトにWordPressのインストールが必要であることを確信していますか?希望する機能は、MediaWikiのインストールによく似てます。両方のインストールの長所と短所を重み付けする必要があります。MediaWikiは優れた代替手段です。
マークディンゲナ

しばらく前に、私はこのアイデアに飛びつきました。使用可能なソリューションに最も近いのはこのプラグインでした:wordpress.org/support/plugin/post-forkingただし、非常に初期の段階です。プラグインは登録ユーザーに制限されています。
クリスティーンクーパー

このようなことを目指して取り組んできました。ウィキペディアスタイルの投稿の編集と、「履歴」ウィジェットの組み合わせ想定していました。
スティーブバーグ

回答:


11

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

数か月前に何か関連することをしなければならなかったように、コンテンツまたはタイトルに変更が加えられたかどうか、または著者が変更されたかどうかをチェックするための最も簡単で最も将来的な証明方法です(私は大丈夫です):

// 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、単一のポストループ中に、元のデータまたは新しいデータのいずれかを含むを返しました。このようにして、変更を確認する必要のない他のすべての投稿値を設定することに動きました。

編集を提案する

投稿コンテンツのコピー編集を(一時的に)保存できる場所を検索する際に留意しなければならない主な事実は、コンテンツがのdbエントリであること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
}

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

最後のメモ

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


1
コメントメタを使用して提案された編集内容を保存wp_text_diff()し、実際の比較を行うというアイデアに対して、この質問に報いを与えます。他の回答に対する賛成票。
FUXIA

8

私の考えはシンプルなものです。

  • Edit Suggestion投稿の下部に、カスタム値が定義されたテンプレートを持つリンクを作成できますpost content。この場合、デフォルト値のカスタム分類にリンクされたテキストボックス(エディターを使用する場合があります)を使用します。

  • への変更は、PHP inline-diffパッケージまたはText-Diff PEARパッケージなどの Diffアルゴリズムを使用して(ドラフトとして)送信および入力した後、または CSSの組み合わせで長すぎないテキストに対してこれに応じてPHP関数を使用した後contentに比較さoriginal post contentれます。CAPTCHA code

  • 次に、値を3つのカスタムメタボックス(その分類バックエンドの追加/編集ページ)に保存することにより、

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

    あとで使用するためPost IDupdate_option()機能で保存することもできます。

  • 編集されたバージョンを読み、管理者に受け入れられた後、その投稿は、functions.phpでコーディングした元の投稿に置き換えられます。


注:(A)「functions.phpでコーディングしたとおり -これに同意しないでください。これはプラグイン素材です。(B)「投稿コンテンツのデフォルト値を使用してカスタム分類にリンク」 -分類用語/分類には、コンテンツがどのような場合にも当てはまる可能性のある値が1つしかありません:説明。そして、投稿IDを保存する場所が必要になります。これはどこでしょうか?WPの税制の制限により、この場所はないため、期間IDのみを保存できます。次に、これは(制限付き)一方向システムのみです:投稿>期間データ。
カイザー

4

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

ajaxwp_update_post経由でWordPressビルドを使用すると、必要な改訂履歴が得られますが、編集の承認に必要な機能は得られません。

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

フロントエンドエディターを試して使用することはできますが、公開されている編集を制御することはできません。したがって、権限ベースの編集を許可するRevisionaryなどの別のプラグインで試してみて、それらが一緒に機能するかどうかわかりません。

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

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

これを行うと、サニタイズ、エンコーディング、スパム、メディア処理、カスタムフィールド、タイムスタンプ、メモリなど、さらに複雑な問題が発生します。 。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.