Wie aktiviere ich vorgeschlagene Änderungen?


19

Mir gefällt die Idee, jedem Benutzer meiner Website die Möglichkeit zu geben, Änderungen an einer Seite vorzuschlagen. Ähnlich wie das Bearbeitungssystem von Stack Exchange, aber anders, dass jeder in der Lage sein sollte, nicht nur registrierte Benutzer zu bearbeiten. Alle Änderungen würden einen Genehmigungsprozess durchlaufen.

Wie könnte ich das umsetzen?


1
Ich weiß nicht, wie es geht, aber ich denke, das könnte wirklich problematisch sein. Ich denke, Sie werden viel Spam bekommen.
Martin Thoma

3
Sind Sie sicher, dass Sie eine WordPress-Installation für Ihre Website benötigen? Die Funktionalität, die Sie wünschen, klingt nach einer MediaWiki- Installation. Sie sollten die Vor- und Nachteile beider Installationen abwägen. MediaWiki ist eine gute Alternative.
Marc Dingena

Ich habe mich vor einiger Zeit mit dieser Idee beschäftigt. Die nächstgelegene Lösung war dieses Plugin: wordpress.org/support/plugin/post-forking Es befindet sich jedoch in einem sehr frühen Stadium. Das Plugin ist auf registrierte Benutzer beschränkt.
Christine Cooper

Wir haben auf so etwas hingearbeitet. Wir hatten uns die Bearbeitung von Posts im Wikipedia-Stil sowie ein "History" -Widget vorgestellt: github.com/publishpress/Revisionary/issues/13 Wir sind noch nicht ganz da, aber fast die gesamte Struktur ist vorhanden.
Steveburge

Antworten:


11

Vergleichen Sie Inhalt, Titel und Autor des Beitrags

Hier ist die einfachste und zukunftssicherste Möglichkeit (die ich in Ordnung bringen kann), um zu überprüfen, ob am Inhalt oder Titel eine Änderung vorgenommen wurde oder ob sich der Autor geändert hat:

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

Um mein Szenario kurz zu erklären: Ich habe Beiträge von einem entfernten Standort über eine entfernte API abgerufen. Dann gab ich die global $postwährend einer einzelnen Post-Schleife zurück, die entweder die ursprünglichen Daten oder die neuen Daten enthielt. Auf diese Weise habe ich alle anderen Post-Werte festgelegt, die ich nicht auf Änderungen überprüfen musste.

Die Bearbeitung vorschlagen

Die wichtigste Tatsache, die man beachten muss, wenn man einen Ort sucht, an dem eine Kopie des Beitragsinhalts (vorübergehend) gespeichert werden kann, ist, dass der Inhalt ein db-Eintrag von ist longtext. Der Ort, an dem die vorgeschlagene Bearbeitung gespeichert werden soll, sollte diese Anforderung erfüllen. Kommentare machen das.

Hinzu kommt die nette Tatsache, dass sie eine API bieten, mit der sie sich nahtlos in eine Schleife einfügen lassen. Sie lässt sich problemlos integrieren, ist in hohem Maße anpassbar und kann schnell eingerichtet werden. Last but not least sind in den meisten Designs bereits Kommentare integriert, sodass Sie das System problemlos als Huckepack verwenden und in nahezu jedes verfügbare Design einbinden können.

Ich würde vorschlagen, das Kommentarformular nur (entweder) zu erweitern oder zu ändern. Verwenden Sie entweder die folgenden Felder oder fügen Sie zusätzliche Felder hinzu, an die ein Rückruf angehängt ist 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
}

Deshalb habe ich ein hiddenFeld für comment_approvedmit dem Wert "" hinzugefügt 0, um es in die Warteschlange zu stellen. Ich bin mir nicht sicher, ob dies funktioniert oder ob es sich bei diesem (Kern-) Wert tatsächlich um Kommentar-Metadaten handelt, die add_comment_meta()beim Speichern mithilfe von hinzugefügt werden müssen . Wenn nicht, könnten Sie etwas in den folgenden Codezeilen verwenden

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

Anzeigen der Kommentare auf der Admin-Seite

Hier würde ich mit einer einfachen Klassenerweiterung und einer benutzerdefinierten Administrationsseite gehen:

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
}

Weitere Informationen finden Sie auf WPEngineer .

Änderungen werden genehmigt

Sie können dann benutzerdefinierte Aktionen hinzufügen und die vorgeschlagenen Änderungen mit dem ersten angezeigten Code verarbeiten, um zu überprüfen, ob eine Änderung vorliegt, und dann einfach den Beitrag aktualisieren. Der Kommentar selbst enthält einen Wert mit einem Schlüssel von comment_post_ID, sodass die Identifizierung der ID des bearbeiteten Beitrags einfach ist.

Schlussbemerkung

Ich würde gerne auch das letzte Plugin sehen. Bitte hier verlinken :)


1
Ich gebe dieser Frage die Prämie für die Idee, Kommentar-Metas zum Speichern der vorgeschlagenen Bearbeitung und wp_text_diff()für den tatsächlichen Vergleich zu verwenden. Upvotes für die anderen Antworten.
fuxia

8

Meine Idee ist etwas Einfaches.

  • Sie können einen Edit SuggestionLink am Ende von Posts mit einer benutzerdefinierten Vorlage erstellen. Verwenden Sie dazu ein Textfeld (möglicherweise mit einem Editor), das mit einer benutzerdefinierten Taxonomie mit dem Standardwert von verknüpft ist post content.

  • Alle Änderungen contentwerden im Vergleich zu original post contentnach (als Entwurf) einreichen und Eingabe CAPTCHA codemit Diff - Algorithmen wie PHP Inline-Diff - Paket oder Text-Diff PEAR - Paket oder alternativ mit einer PHP - Funktion nach diesem für nicht allzu lange Texte mit Kombination von CSS.

  • Speichern Sie dann die angezeigten Werte in 3 benutzerdefinierten Meta-Feldern (in dieser Taxonomie-Back-End-Seite zum Hinzufügen / Bearbeiten)

    1. Ursprünglicher Inhalt
    2. Bearbeitete Version
    3. Benutzername und seine E-Mail

    und Post IDvielleicht mit einer update_option()Funktion für die spätere Verwendung speichern .

  • Nach dem Lesen der bearbeiteten Version und der Annahme durch den Administrator wird dieser Beitrag durch den ursprünglichen ersetzt, den Sie in functions.php codiert haben.


Einige Anmerkungen: (A) "wie Sie in functions.php codiert haben" - stimmen Sie nicht mit dieser überein. Dies ist Plugin-Material. (B) "Verknüpft mit einer benutzerdefinierten Taxonomie mit dem Standardwert für Post-Inhalt" - Ein Taxonomiebegriff / Taxon hat nur einen möglichen Wert, für den der Inhalt in jedem Fall passen würde: Die Beschreibung. Und dann brauchst du einen Platz zum Speichern der Post-ID. Wo würde das sein? Da dies aufgrund der Grenzen des WP-Steuersystems nicht möglich ist, können Sie nur die Term-ID speichern. Dann ist dies nur ein (eingeschränktes) Einwegsystem: Posten> Termdaten.
Kaiser

4

Nun, das ist ziemlich kompliziert. Das Schreiben einer richtigen Antwort würde beträchtliche Zeit in Anspruch nehmen. Das ist also keine richtige Antwort, nur ein paar Gedanken.

Wenn Sie das wp_update_postüber Ajax eingebaute WordPress verwenden, erhalten Sie zwar den erforderlichen Versionsverlauf, jedoch nicht die erforderlichen Funktionen, um Änderungen zu genehmigen.

Das Erstellen von Entwürfen aus Bearbeitungen ist standardmäßig nicht möglich, wurde jedoch hier erörtert. Gibt es eine Möglichkeit, eine Überarbeitung einer veröffentlichten Seite oder eines Posts zu erstellen? Welche Problemumgehungen haben Sie verwendet?

Sie können versuchen, den Front-End-Editor zu verwenden , haben aber keine Kontrolle über die Veröffentlichung von Änderungen. Versuchen Sie also, ihn mit einem anderen Plugin wie Revisionary zu kombinieren, das auf Berechtigungen basierende Änderungen zulässt. Ich habe keine Ahnung, ob sie zusammenarbeiten werden.

Wenn dies nicht der Fall ist, müssen Sie ein Plugin hacken, das auf den obigen 2 Plugins basiert, oder etwas von Grund auf neu schreiben.

Mein Ansatz wäre, eine Schaltfläche zu haben, die zu einer anderen Seite führt, die den Inhalt / die Daten der Posts mit JSON ausgibt. Dies ist einfacher, wenn Sie Ajax- und WYSIWYG-Editoren verwenden. Die Schaltfläche Speichern würde als Entwurf anstatt als Veröffentlichung veröffentlicht, und auf diese Weise hätten Sie die Kontrolle über die Bearbeitungen (siehe oben WPSE-Diskussion, wie dies erreicht werden kann, es ist ziemlich entmutigend).

Es gibt zusätzliche Komplikationen, wie z. B. Bereinigung, Codierung, Spam, Medienverarbeitung, benutzerdefinierte Felder, Zeitstempel, Speicher usw. Die gute Nachricht ist, dass WordPress bereits ein Revisionssystem besitzt, in das Sie einbinden können, und dass es mehrere Editoren problemlos verarbeiten kann .

ps. Dies ist eine gute Idee für ein Plugin.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.