Editarea postărilor din front-end folosind un formular
Am un tip de postare personalizat (custom post type) cu meta box-uri standard și câteva câmpuri personalizate. Cum aș putea edita o postare printr-un formular în interfața front-end?

Iată o soluție de bază pentru actualizarea unui articol/pagină. Am adăugat o demonstrație rapidă a câmpurilor meta personalizate. Acest exemplu este destul de simplu, dar vă va indica direcția corectă pentru editarea articolelor în partea frontală fără plugin-uri. Nu este foarte flexibil, dar puteți adăuga orice aveți nevoie.
Adăugați acest cod în bucla dvs.:
<form id="post" class="post-edit front-end-form" method="post" enctype="multipart/form-data">
<input type="hidden" name="post_id" value="<?php the_ID(); ?>" />
<?php wp_nonce_field( 'update_post_'. get_the_ID(), 'update_post_nonce' ); ?>
<p><label for="post_title">Titlu</label>
<input type="text" id="post_title" name="post_title" value="<?php echo $post->post_title; ?>" /></p>
<p><?php wp_editor( $post->post_content, 'postcontent' ); ?></p>
<p><label for="post_title">Test</label>
<?php $value = get_post_meta(get_the_ID(), 'edit_test', true); ?>
<input type="text" id="edit_test" name="edit_test" value="<?php echo $value; ?>" /></p>
<p><label for="post_title">Test 2</label>
<?php $value = get_post_meta(get_the_ID(), 'edit_test2', true); ?>
<input type="text" id="edit_test2" name="edit_test2" value="<?php echo $value; ?>" /></p>
<input type="submit" id="submit" value="Actualizează" />
</form>
Apoi adăugați acest cod în partea de sus a paginii pentru procesarea formularului:
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && ! empty($_POST['post_id']) && ! empty($_POST['post_title']) && isset($_POST['update_post_nonce']) && isset($_POST['postcontent']) )
{
$post_id = $_POST['post_id'];
$post_type = get_post_type($post_id);
$capability = ( 'page' == $post_type ) ? 'edit_page' : 'edit_post';
if ( current_user_can($capability, $post_id) && wp_verify_nonce( $_POST['update_post_nonce'], 'update_post_'. $post_id ) )
{
$post = array(
'ID' => esc_sql($post_id),
'post_content' => esc_sql($_POST['postcontent']),
'post_title' => esc_sql($_POST['post_title'])
);
wp_update_post($post);
if ( isset($_POST['edit_test']) ) update_post_meta($post_id, 'edit_test', esc_sql($_POST['edit_test']) );
if ( isset($_POST['edit_test2']) ) update_post_meta($post_id, 'edit_test2', esc_sql($_POST['edit_test2']) );
}
else
{
wp_die("Nu aveți permisiunea să faceți acest lucru");
}
}

Am adăugat esc_sql(). Mi-a trecut prin minte că ar trebui să escapăm datele trimise dintr-un formular public (semi-public) ca acesta.

Folosesc Advanced Custom Fields pentru o mulțime de editări de postări în front-end cu meta box-uri. ACF vă permite să construiți o varietate de câmpuri avansate pentru meta box-uri și le adaugă automat în panoul de editare din back-end.
Dar există și o funcție pentru front-end.
Această metodă este complet gratuită. Singurul mod în care costă ceva este dacă doriți să folosiți oricare dintre add-on-urile lor pentru tipuri de câmpuri mai complexe, precum repeater, flexible sau gallery. Toate funcționează excelent aici.
Primul dezavantaj este că nu include titlul și descrierea postării... dar acest lucru poate fi rezolvat destul de ușor prin adăugarea acestui cod în functions.php:
/**
* Deregistrează stilurile admin în front-end când se folosesc formulare ACF
*
* ACF asigură că stilurile admin sunt încărcate când își încarcă head-ul, acest lucru cauzează aproape întotdeauna probleme cu formularele din front-end și nu este necesar pentru scopul nostru
*/
add_action( 'wp_print_styles', 'custom_acf_deregister_styles', 100 );
function custom_acf_deregister_styles()
{
if (! is_admin() )
{
wp_deregister_style( 'wp-admin' );
}
}
/**
* Salvează câmpul ACF ca post_content / post_title pentru postări în front-end
*/
add_action( 'acf/save_post', 'custom_acf_save_post' );
function custom_acf_save_post( $post_id )
{
if (! is_admin() && 'acf' != get_post_type( $post_id ) ) // Nu rula dacă se adaugă/actualizează câmpuri/grupuri de câmpuri în wp-admin
{
$post_title = get_post_meta( $post_id, 'form_post_title', true );
$post_content = get_post_meta( $post_id, 'form_post_content', true );
$post = get_post($post_id);
if ( ($post_title && $post_title != $post->post_title) || ($post_content && $post_content != $post->post_content) )
{
$post_data = array(
'ID' => $post_id,
);
if ( $post_content ) $post_data['post_content'] = $post_content;
if ( $post_title ) $post_data['post_title'] = $post_title;
remove_action( 'acf/save_post', 'custom_acf_save_post' );
wp_update_post( $post_data );
add_action( 'acf/save_post', 'custom_acf_save_post' );
}
}
}
/**
* Încarcă post_title existent
*/
add_filter( 'acf/load_value/name=form_post_title', 'custom_acf_load_value_form_post_title', 10, 3 );
function custom_acf_load_value_form_post_title( $value, $post_id, $field )
{
$value = get_the_title($post_id);
return $value;
}
/**
* Încarcă post_content existent
*/
add_filter( 'acf/load_value/name=form_post_content', 'custom_acf_load_value_form_post_content', 10, 3 );
function custom_acf_load_value_form_post_content( $value, $post_id, $field )
{
$post = get_post($post_id);
$value = $post->post_content;
return $value;
}
/**
* Instalare Add-ons (Aceasta adaugă două grupuri de câmpuri pe care le puteți folosi pentru a edita titlul și conținutul)
*
* Următorul cod va include toate cele 4 add-on-uri premium în tema dvs.
* Vă rugăm să nu încercați să includeți un fișier care nu există. Acest lucru va produce o eroare.
*
* Toate câmpurile trebuie incluse în timpul acțiunii 'acf/register_fields'.
* Alte tipuri de Add-on-uri (precum pagina de opțiuni) pot fi incluse în afara acestei acțiuni.
*
* Următorul cod presupune că aveți un folder 'add-ons' în tema dvs.
*
* IMPORTANT
* Add-on-urile pot fi incluse într-o temă premium conform termenilor și condițiilor.
* Cu toate acestea, ele NU trebuie incluse într-un plugin premium/gratuit.
* Pentru mai multe informații, citiți http://www.advancedcustomfields.com/terms-conditions/
*/
// Câmpuri
add_action('acf/register_fields', 'my_register_fields');
/**
* Înregistrare Grupuri de Câmpuri
*
* Funcția register_field_group acceptă 1 array care conține datele relevante pentru a înregistra un grup de câmpuri
* Puteți edita array-ul după cum considerați. Cu toate acestea, acest lucru poate rezulta în erori dacă array-ul nu este compatibil cu ACF
*/
if(function_exists("register_field_group"))
{
register_field_group(array (
'id' => 'acf_form-post-title',
'title' => 'Formular Titlu Postare',
'fields' => array (
array (
'key' => 'field_25',
'label' => 'Titlu',
'name' => 'form_post_title',
'type' => 'text',
'default_value' => '',
'formatting' => 'html',
),
),
'location' => array (
array (
array (
'param' => 'post_type',
'operator' => '==',
'value' => 'course',
'order_no' => 0,
'group_no' => 0,
),
),
),
'options' => array (
'position' => 'normal',
'layout' => 'no_box',
'hide_on_screen' => array (
),
),
'menu_order' => -2,
));
register_field_group(array (
'id' => 'acf_form-post-content',
'title' => 'Formular Conținut Postare',
'fields' => array (
array (
'key' => 'field_13',
'label' => 'Conținut',
'name' => 'form_post_content',
'type' => 'wysiwyg',
'default_value' => '',
'toolbar' => 'full',
'media_upload' => 'yes',
),
),
'location' => array (
array (
array (
'param' => 'post_type',
'operator' => '==',
'value' => 'course',
'order_no' => 0,
'group_no' => 0,
),
),
),
'options' => array (
'position' => 'normal',
'layout' => 'no_box',
'hide_on_screen' => array (
),
),
'menu_order' => -1,
));
}
Aceasta va adăuga tot codul necesar pentru a suporta un câmp de titlu și conținut care poate fi adăugat la formularele din front-end astfel:
// Adăugați asta înainte de get_header()
// Acest lucru încarcă stiluri/scripturi, dar și procesează formularul, deci destul de important
acf_form_head();
get_header();
// Unde 51 este id-ul grupului de câmpuri ACF al meta box-urilor pe care vreau să le adaug
acf_form( array(
'field_groups' => array('acf_form-post-title', 'acf_form-post-content', 51)
) );
Folosesc această metodă pe majoritatea site-urilor la care lucrez în ultima vreme. Tind să folosesc Gravity Forms pentru a crea o postare de bază și apoi controlez totul cu ACF în front-end și back-end. Cel mai bun lucru este că gestionați totul dintr-un singur loc pentru ambele. Merită menționat, totuși, că ACF poate fi folosit și pentru a crea o postare. Nu l-am folosit încă, dar voi încerca la următorul proiect, astfel încât să pot crea cu acces complet la meta.
Personal, ACF este singurul plugin fără de care nu pot trăi, cu Gravity Forms pe locul doi.

Mulțumesc pentru SUGESTIE, dar căutam o soluție fără niciun plugin

Se poate face. Este doar un subiect foarte complicat. Am ceva numit "Catapost" care îți permite să adaugi metabox-uri la postări și apoi să creezi formulare frontend pentru editarea titlului/conținutului postării împreună cu metabox-urile. Este CA un plugin, dar este inclus în tema, astfel încât poate fi distribuit împreună cu temele. Este acesta genul de lucru pe care îl cauți?

Ei bine. O soluție flexibilă este complexă... Dacă vrei doar să editezi o postare simplă... Asta ar putea să nu fie atât de dificil.

Am adăugat o soluție foarte simplă într-un alt răspuns care arată cum să o faci fără plugin. Nu este foarte flexibilă, dar funcționează bine pentru o utilizare unică.

Dacă dorești să editezi un articol existent, încearcă plugin-ul meu Editor Front-end.
Dacă vrei să creezi articole noi, încearcă unul dintre următoarele:

Mulțumesc Scribu. Pluginul tău este fantastic, dar nu se potrivește nevoilor mele. Încerc să editez un articol existent cu un formular. Am pus o întrebare similară despre editarea profilului unui utilizator cu un formular în interfața frontală și am primit acest răspuns: http://wordpress.stackexchange.com/questions/9775/how-to-edit-a-user-profile-on-the-front-end A funcționat perfect pentru mine. Dacă există o soluție similară pentru editarea articolelor, aș fi foarte recunoscător.

@nickfancis.me folosește comentariile pentru astfel de lucruri - pentru asta sunt făcute!

Cea mai ușoară cale ar fi să folosești ceva precum Ninja Forms cu următoarea extensie plătită:
http://wpninjas.com/downloads/front-end-posting/
De asemenea, poți să codezi asta singur. În esență, vei crea un formular și apoi vei folosi wp_insert_post()
pentru a crea un articol complet.
Un exemplu de formular:
<form action="" id="primaryPostForm" method="POST">
<fieldset>
<label for="postTitle"><?php _e('Titlul Articolului:', 'framework') ?></label>
<input type="text" name="postTitle" id="postTitle" class="required" />
</fieldset>
<fieldset>
<label for="postContent"><?php _e('Conținutul Articolului:', 'framework') ?></label>
<textarea name="postContent" id="postContent" rows="8" cols="30" class="required"></textarea>
</fieldset>
<fieldset>
<input type="hidden" name="submitted" id="submitted" value="true" />
<button type="submit"><?php _e('Adaugă Articol', 'framework') ?></button>
</fieldset>
</form>
și apoi la trimitere, vei procesa datele cam așa:
if ( isset( $_POST['submitted'] ) && isset( $_POST['post_nonce_field'] ) && wp_verify_nonce( $_POST['post_nonce_field'], 'post_nonce' ) ) {
if ( trim( $_POST['postTitle'] ) === '' ) {
$postTitleError = 'Te rog introdu un titlu.';
$hasError = true;
}
$post_information = array(
'post_title' => wp_strip_all_tags( $_POST['postTitle'] ),
'post_content' => $_POST['postContent'],
'post_type' => 'post',
'post_status' => 'pending'
);
wp_insert_post( $post_information );
}
Codul complet și tutorialul sunt de la: http://wp.tutsplus.com/tutorials/creative-coding/posting-via-the-front-end-inserting/
