Ce face wp_insert_post
wp_insert_post() primește un tablou cu datele articolului (post_title, post_content, post_status, post_type…) și îl salvează în baza de date. Dacă tabloul are un ID diferit de zero, actualizează articolul respectiv. Starea implicită este draft, tipul implicit post, iar autorul implicit este utilizatorul curent.
wp_update_post() pornește de la articolul existent și schimbă doar câmpurile pe care le dai, așa că e mai sigură pentru modificări (de exemplu doar post_status). Câmpurile personalizate se pot salva direct cu meta_input (din WordPress 4.4), iar termenii cu tax_input.
Cu $wp_error = true primești un obiect WP_Error la eșec, în loc de 0. Parametrul $fire_after_hooks există din WordPress 5.6. Ambele funcții declanșează save_post: dacă le chemi chiar dintr-un callback save_post, scoate întâi callback-ul, altfel apare o buclă infinită.
Parametri
| Parametru | Descriere |
|---|---|
$postarr |
Datele articolului: post_title, post_content, post_status (implicit 'draft'), post_type (implicit 'post'), post_author, post_category, meta_input, tax_input, ID. |
$wp_error |
Dacă întoarce WP_Error la eșec. Implicit false (întoarce 0). |
$fire_after_hooks |
Dacă rulează hook-urile de după salvare (wp_after_insert_post). Implicit true. |
Ce returnează
ID-ul articolului creat sau actualizat; la eșec 0 sau un WP_Error (cu $wp_error = true).
Exemple
Exemplul 1: Creezi un articol publicat, cu câmp personalizat
--user=ana setează utilizatorul curent în WP-CLI, deci Ana devine autoarea; meta_input salvează prețul odată cu articolul.
wp eval --user=ana '$id = wp_insert_post( array( "post_title" => "Ofertă de toamnă", "post_content" => "Plăcintă cu dovleac la 15 lei.", "post_status" => "publish", "meta_input" => array( "pret" => 15 ) ), true ); echo is_wp_error( $id ) ? $id->get_error_message() : "Articol creat: $id";'
Ieșire în terminal
Articol creat: 128
Exemplul 2: Schimbi doar starea unui articol
wp_update_post() păstrează titlul și conținutul; trimiți doar ID și câmpul de schimbat.
wp eval 'echo wp_update_post( array( "ID" => 128, "post_status" => "draft" ) );'
Ieșire în terminal
128
Exemplul 3: Actualizare din save_post fără buclă infinită
Callback-ul se scoate înainte de wp_update_post() și se pune la loc după; reviziile sunt sărite.
<?php
add_action( 'save_post_produs', 'dex_rezumat_cu_pret' );
function dex_rezumat_cu_pret( $post_id ) {
if ( wp_is_post_revision( $post_id ) ) {
return;
}
$pret = get_post_meta( $post_id, 'pret', true );
if ( '' === $pret ) {
return;
}
remove_action( 'save_post_produs', 'dex_rezumat_cu_pret' );
wp_update_post( array(
'ID' => $post_id,
'post_excerpt' => 'Preț: ' . $pret . ' lei',
) );
add_action( 'save_post_produs', 'dex_rezumat_cu_pret' );
}
Greșeli frecvente
- Te miri că articolul nu apare pe site:
post_statusimplicit estedraft. Pune'publish'dacă vrei să fie public. - Chemi
wp_update_post()dintr-un callbacksave_postfără să-l scoți curemove_action(): funcția declanșează din nousave_postla nesfârșit. - Verifici doar
is_wp_error()fără$wp_error=true: la eșec funcția întoarce0, nu un obiect de eroare. - Pui text dintr-un formular public direct în
post_title; curăță-l (de exemplu cusanitize_text_field()) și verifică permisiunile înainte.
Comenzi înrudite
get_post_meta / update_post_meta: Citește, salvează, adaugă și șterge câmpuri personalizate (post meta) ale unui articol: preț, oraș, cod produs.save_post: Acțiunea care rulează după ce un articol, o pagină sau alt tip de conținut a fost salvat; o folosești pentru câmpuri personalizate.wp post create: Creează un articol, o pagină sau alt tip de conținut, cu titlu, conținut, stare și autor dați ca opțiuni.wp post update: Modifică unul sau mai multe articole existente: titlu, stare, autor, conținut sau câmpuri personalizate.sanitize_text_field: Curăță textul de pe o singură linie primit de la utilizator: elimină HTML-ul, rândurile noi, tab-urile și spațiile în plus.