Jak włączyć sugerowane zmiany?

19

Podoba mi się pomysł, aby umożliwić każdemu użytkownikowi mojej witryny sugerowanie zmian na stronie. Podobnie jak system edycji na Stack Exchange, ale różni się tym, że każdy powinien móc edytować, nie tylko zarejestrowani użytkownicy. Wszystkie zmiany przechodzą proces zatwierdzania.

Jak mogę to zaimplementować?

Patrick Klug
źródło
1
Nie wiem, jak to zrobić, ale myślę, że może to być naprawdę problematyczne. Myślę, że dostaniesz dużo spamu.
Martin Thoma
3
Czy na pewno potrzebujesz instalacji WordPress na swojej stronie? Funkcjonalność, której potrzebujesz, przypomina trochę instalację MediaWiki . Powinieneś rozważyć zalety i wady obu instalacji. MediaWiki to dobra alternatywa.
Marc Dingena,
Podskakiwałem z tym pomysłem jakiś czas temu. Najbliższym dostępnym rozwiązaniem była wtyczka: wordpress.org/support/plugin/post-forking Jest ona jednak na bardzo wczesnym etapie. Wtyczka jest zastrzeżona dla zarejestrowanych użytkowników.
Christine Cooper
Pracowaliśmy nad czymś takim. Przewidywaliśmy edycję postów w stylu Wikipedii, wraz z widżetem „Historia”: github.com/publishpress/Revisionary/issues/13 Nie jesteśmy jeszcze tam, ale prawie cała struktura jest na miejscu.
steveburge

Odpowiedzi:

11

Zróżnicuj treść postu, tytuł i autora

Ponieważ musiałem zrobić coś powiązanego kilka miesięcy temu, oto najłatwiejszy i najbardziej przyszłościowy sposób (który mógłbym w porządku), aby sprawdzić, czy nastąpiła zmiana w treści lub tytule lub czy autor się zmienił:

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

Aby krótko wyjaśnić mój scenariusz: pobierałem posty ze zdalnej lokalizacji za pośrednictwem zdalnego interfejsu API. Następnie zwróciłem global $post, podczas pojedynczej pętli wysyłkowej, albo oryginalne dane, albo nowe dane. W ten sposób poruszałem się, ustawiając wszystkie pozostałe wartości wpisów, których nie musiałem sprawdzać pod kątem zmian.

Proponowanie zmiany

Najważniejszym faktem, o którym należy pamiętać podczas wyszukiwania miejsca, w którym można (tymczasowo) zapisać kopię edycji treści postu, jest to, że treść jest wpisem db longtext. Zatem miejsce, w którym chce się zapisać sugerowaną edycję, powinno spełniać ten wymóg. Komentarze tak robią.

Jest też miły fakt, że oferują one interfejs API, który ładnie umieszcza je w pętli, dzięki czemu integruje się płynnie, jest wysoce konfigurowalny i można go szybko skonfigurować. I wreszcie, większość motywów ma już zintegrowane komentarze, więc łatwo jest nałożyć na system piggyback i podłączyć się do prawie dowolnego dostępnego motywu.

Proponuję po prostu (albo) rozszerzyć lub zmienić formularz komentarza. Użyj poniższych lub dodaj dodatkowe pola z połączeniem zwrotnym 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
}

Dodałem więc hiddenpole comment_approvedz wartością, 0aby ustawić je w kolejce. Nie jestem pewien, czy to zadziała, czy też ta (podstawowa) wartość faktycznie komentuje metadane i musi zostać dodana przy użyciu add_comment_meta()podczas zapisywania. Jeśli nie, możesz użyć czegoś zgodnie z następującymi wierszami kodu

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

Wyświetlanie komentarzy po stronie administratora

Oto proste rozszerzenie klasy i niestandardowa strona administratora:

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
}

Więcej informacji można znaleźć na WPEngineer .

Zatwierdzanie zmian

Następnie możesz dodać niestandardowe akcje i przetworzyć proponowane zmiany przy użyciu pierwszego kodu, który pokazałem, aby sprawdzić, czy nastąpiła zmiana, a następnie po prostu zaktualizować wpis. Sam komentarz zawiera wartość z kluczem comment_post_ID, więc identyfikacja edytowanego identyfikatora postów jest prosta.

Ostatnia uwaga

Chciałbym również zobaczyć ostateczną wtyczkę. Proszę link tutaj :)

kajzer
źródło
1
Daję nagrodę za to pytanie za pomysł użycia meta komentarza do przechowywania sugerowanej edycji i wp_text_diff()faktycznego porównania. Głosowanie za innymi odpowiedziami.
fuxia
8

Mój pomysł jest prosty.

  • Możesz utworzyć Edit Suggestionlink na dole postów, który ma niestandardowo zdefiniowany szablon, w tym użyj pola tekstowego (być może z edytorem), które jest połączone z niestandardową taksonomią z domyślną wartością post content.

  • Wszelkie zmiany contentzostaną porównane z original post contentpo przesłaniu (jako wersja robocza) i wprowadzeniu CAPTCHA codealgorytmów Diff, takich jak pakiet inline-diff PHP lub pakiet PEAR Text-Diff lub alternatywnie użycie funkcji PHP zgodnie z tym dla niezbyt długich tekstów z kombinacją CSS.

  • Następnie, zapisując wartości w 3 niestandardowych Meta Boxach (na tej stronie dodawania / edycji zaplecza systematyki), które się wyświetlają

    1. Oryginalna treść
    2. Wersja zredagowana
    3. Pseudonim użytkownika i jego adres e-mail

    i oszczędzanie Post IDmoże dzięki update_option()funkcji do późniejszego wykorzystania.

  • Po przeczytaniu zredagowanej wersji i akceptacji przez administratora post ten zostanie zastąpiony oryginalnym w miarę kodowania w pliku functions.php.

revo
źródło
Kilka uwag: (A) „jak zakodowałeś w functions.php” - nie zgadzaj się z tym. To jest materiał wtyczki. (B) „powiązany z niestandardową taksonomią z domyślną wartością treści postu” - termin taksonomia / takson ma tylko jedną możliwą wartość, w której treść pasowałaby w każdym przypadku: opis. A potem potrzebujesz miejsca do przechowywania identyfikatora postu. Gdzie by to było? Ponieważ nie ma na to miejsca ze względu na ograniczenia systemu podatkowego WPs, można zapisać tylko identyfikator ID. Zatem jest to (ograniczony) tylko system jednokierunkowy: Wyślij> Dane terminu.
kaiser
4

Cóż, jest to dość skomplikowane, napisanie poprawnej odpowiedzi zajęłoby sporo czasu. To nie jest prawdziwa odpowiedź, tylko kilka myśli ...

Korzystanie z WordPress wbudowanego wp_update_postprzez ajax zapewniłoby potrzebną historię zmian, ale nie umożliwiłoby zatwierdzania zmian.

Tworzenie wersji roboczych z edycji nie jest domyślnie możliwe, ale zostało omówione tutaj. Czy jest jakiś sposób na sporządzenie wersji opublikowanej strony lub postu? Jakie obejścia zastosowałeś?

Możesz spróbować użyć Front-end Editor, ale nie będziesz mieć kontroli nad publikowanymi edycjami, więc spróbuj połączyć je z inną wtyczką, taką jak Revisionary, która pozwala na edycje oparte na uprawnieniach, nie mam pojęcia, czy będą ze sobą współpracować.

Jeśli nie, będziesz musiał zhakować wtyczkę na podstawie 2 powyższych wtyczek lub napisać coś od zera.

Moje podejście polegałoby na tym, aby mieć przycisk, który przechodzi do innej strony, która wysyła zawartość / dane postu za pomocą JSON , co jest łatwiejsze w pracy, gdy używa się edytorów Ajax i WYSIWYG. Przycisk Zapisz publikowałby jako wersję roboczą zamiast publikować, dzięki czemu miałbyś kontrolę nad zmianami (patrz powyżej dyskusja WPSE na temat tego, jak to zrobić, to raczej zniechęcające).

Są przy tym dodatkowe komplikacje, takie jak odkażanie, kodowanie, spam, obsługa multimediów, pola niestandardowe, znaczniki czasu, pamięć itp. Dobrą wiadomością jest to, że wordpress ma już system poprawek, do którego można się podłączyć i przyzwoitą zdolność obsługi wielu edytorów .

ps. To dobry pomysł na wtyczkę.

Wyck
źródło