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 hidden
pole comment_approved
z wartością, 0
aby 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 :)