Acțiunea save_post pentru tipul de postare personalizat nu se declanșează
Îmi cer scuze dacă acest lucru a fost deja răspuns aici. Am căutat dar nu am găsit răspunsuri la întrebarea mea, așa că m-am gândit să postez propria întrebare.
Construiesc un plugin pentru un client care colectează feedback de la clienți despre un proiect recent finalizat.
Administratorul ar folosi sistemul pentru a trimite o "solicitare" către client cerându-i feedback-ul cu un link către un formular de pe site.
Am creat un tip de postare personalizat numit "customer_prompts" care are doar un câmp pentru titlu și câteva câmpuri personalizate care sunt stocate într-o tabelă personalizată din baza de date, nu în post meta.
Mai jos este codul meu pentru acțiunea save_post. Se pare că atunci când apăs pe publicare, nu se declanșează acțiunea save_post și salvează doar valoarea titlului în wp_posts.
add_action('save_post', 'save_prompt');
function save_prompt($post_id){
$post = get_post($post_id);
// Verifică dacă se face autosalvare
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
// Verifică tipul postării și permisiunile
if ( 'customer_prompt' == $_POST['post_type'] )
{
if ( !current_user_can( 'edit_page', $post_id ) )
return;
}
else
{
if ( !current_user_can( 'edit_post', $post_id ) )
return;
}
global $wpdb;
$prompt_id = com_create_guid();
$customer_feedback_name = $_POST['_sdg_customer_feedback_name'];
$customer_feedback_email = $_POST['_sdg_customer_feedback_email'];
$salesperson = $_POST['_sdg_salesperson'];
$values = array(
'id' => $prompt_id,
'sdg_customer_name' => $customer_feedback_name,
'sdg_customer_email' => $customer_feedback_email,
'sdg_salesperson' => $salesperson,
'sdg_post_id' => $post->id
);
$insert = $wpdb->insert($table_name, $values);
// Trimite email dacă inserarea a reușit
if($insert) {
mail($customer_feedback_email, 'hello', 'hello');
}
}
Orice ajutor ar fi foarte apreciat deoarece nu-mi pot da seama ce se întâmplă aici.
Mulțumesc, Jamie.

Acțiunea "save_post" este apelată doar atunci când schimbăm efectiv ceva în formularul paginii de articol. Dacă doar apăsăm butonul de actualizare, fără a schimba nimic, acțiunea "save_post" nu este apelată.
Acest lucru este important dacă edităm un tip personalizat de postare (custom post type) unde avem niște metadate personalizate (custom meta boxes). Dacă ne bazăm pe acțiunea "save_post" și schimbăm doar datele din metadatele personalizate, nu se va întâmpla nimic.
Soluția este să folosim hook-ul de acțiune "pre_post_update" în loc de "save_post".
http://wordpress.org/support/topic/save_post-not-working-getting-called#post-2335557

editare Ai încercat să plasezi print_r('hello world'); die();
după function save_prompt($post_id){
pentru a te asigura că funcția este într-adevăr preluată de action hook? /editare
Pot exista mai multe probleme la mijloc:
1: global wpdb
trebuie să fie la începutul funcției tale, înainte de toate condițiile if.
2: Variabilele tale $_POST
ar trebui să aibă condiții de genul if(isset($_POST['food'))
pentru a verifica dacă datele trimise sunt setate înainte de a ajunge în funcția ta, altfel pot cauza o eroare fatală, împiedicând introducerea datelor în baza de date.
3: Încearcă să adaugi global $post
la începutul funcției, apoi poți accesa variabilele postului ca obiect prin variabila $post
, de exemplu $post->post_type
.
4: Adaugă $wpdb->print_errors; die();
după $insert = $wpdb->insert($table_name, $values);
în cazul în care interogarea ta la baza de date este incorectă.
Sper că una dintre aceste soluții îți va rezolva problema.

Preluarea unei variabile globale în scopul funcției trebuie să se întâmple înainte de a fi utilizată, dar nu neapărat în partea de sus a unei funcții.

Cu toate acestea, pentru cele mai bune practici, am întâlnit mai multe cazuri în care variabilele globale au eșuat din cauza faptului că nu erau în partea de sus a funcției.

Am încercat să afișez ceva chiar în partea de sus a funcției, care a apărut chiar în partea de sus a paginii după ce am dat clic pe "Adaugă nou" în bara laterală, dar odată ce dai clic pe publică, acest lucru dispare ca și cum funcția nu este declanșată când se face clic pe publică.
Am încercat toate celelalte sugestii ale tale și tot nu funcționează. Cred că poate fi un caz în care funcția nu este declanșată deloc, dar nu pot înțelege de ce.

În primul rând, aș sugera să configurezi site-ul tău WordPress pentru a fi ușor de depanat http://codex.wordpress.org/Debugging_in_WordPress
În acest fel, este ușor să vezi ce se întâmplă ;)
Pentru action hook, cred că trebuie să-l conectezi astfel:
add_action('save_post', 'save_prompt', 10, 2);
function save_prompt( $post_id, $post ){
//fă orice este necesar
}
hook-ul save_post
transmite 2 argumente.

Asta mi s-a întâmplat și mie. S-a dovedit că aveam un șablon de pagină setat (o valoare post-meta pentru _wp_page_template
) la un șablon care nu mai exista, după ce am schimbat tema. Acest fragment de cod din wp-includes/post.php
:
if ( ! empty( $postarr['page_template'] ) ) {
$post->page_template = $postarr['page_template'];
$page_templates = wp_get_theme()->get_page_templates( $post );
if ( 'default' != $postarr['page_template'] && ! isset( $page_templates[ $postarr['page_template'] ] ) ) {
if ( $wp_error ) {
return new WP_Error( 'invalid_page_template', __( 'Invalid page template.' ) );
}
...
se oprește înainte de a declanșa save_post
.

Am avut exact aceeași problemă și am vrut să adaug la răspunsurile potențiale, pentru a ajuta pe cineva să economisească timp. A fost o problemă foarte simplă care mi-a luat zile întregi să o identific (sunt puțin mai chel acum - și mă simt puțin prost)...
S-a dovedit că un formular de metabox care era generat conținea un câmp "action" care suprascria câmpul "action" al formularului generat de WordPress - formularul era folosit doar pe un post personalizat și astfel acțiunea greșită era trimisă către WordPress la POST către 'wp-admin/post.php' și a fost prelucrată de handler-ul implicit (la sfârșitul instrucțiunii switch).
Un alt efect secundar a fost că la actualizare sau publicare, WordPress redirecționa către indexul built-in de postări, în loc să revină la postarea editată.
Soluția a fost să elimin elementul ascuns 'action' din formularul metabox.
Sper că acest lucru îi va ajuta pe cineva...
