Cum se actualizează câmpurile personalizate folosind funcția wp_insert_post()?
Funcția WordPress este utilizată pentru trimiterea datelor pe cale programatică. Câmpurile standard de transmis includ conținutul, extrasul, titlul, data și multe altele.
Ceea ce nu este documentat este modul de transmitere către un câmp personalizat. Știu că este posibil cu funcția add_post_meta($post_id, $meta_key, $meta_value, $unique);
.
Dar cum includem asta în funcția standard wp_insert_post
?
<?php
$my_post = array(
'post_title' => $_SESSION['booking-form-title'], // titlul formularului de rezervare
'post_date' => $_SESSION['cal_startdate'], // data de început din calendar
'post_content' => 'Aceasta este postarea mea.',
'post_status' => 'publish', // status publicat
'post_type' => 'booking', // tip postare rezervare
);
wp_insert_post( $my_post );
?>

Dacă citești documentația pentru wp_insert_post
, aceasta returnează ID-ul postării pe care tocmai ai creat-o.
Dacă combini asta cu următoarea funcție __update_post_meta
(o funcție personalizată pe care am obținut-o de pe acest site și pe care am adaptat-o puțin)
/**
* Actualizează meta-informațiile unei postări. De asemenea, șterge sau adaugă automat valoarea pentru field_name dacă este specificat
*
* @access protected
* @param integer ID-ul postării pe care o actualizăm
* @param string Câmpul pe care îl actualizăm/adaugăm/ștergem
* @param string [Opțional] Valoarea de actualizat/adaugat pentru field_name. Dacă este lăsat gol, datele vor fi șterse.
* @return void
*/
public function __update_post_meta( $post_id, $field_name, $value = '' )
{
if ( empty( $value ) OR ! $value )
{
delete_post_meta( $post_id, $field_name );
}
elseif ( ! get_post_meta( $post_id, $field_name ) )
{
add_post_meta( $post_id, $field_name, $value );
}
else
{
update_post_meta( $post_id, $field_name, $value );
}
}
Vei obține următoarele:
$my_post = array(
'post_title' => $_SESSION['booking-form-title'],
'post_date' => $_SESSION['cal_startdate'],
'post_content' => 'Acesta este postul meu.',
'post_status' => 'publish',
'post_type' => 'booking',
);
$the_post_id = wp_insert_post( $my_post );
__update_post_meta( $the_post_id, 'my-custom-field', 'my_custom_field_value' );

Mulțumesc foarte mult. Ai putea, te rog, să îmi dai o idee despre implementare. Adică, care bucată de cod unde se plasează. Mulțumesc mult.

Foarte bine realizat. Al doilea bloc de cod îl înlocuiește pe al tău, funcția values reprezintă perechea cheie/valoare a câmpului personalizat. Pune funcția fie în partea de sus a scriptului, fie într-un fișier .php separat inclus la începutul scriptului.

Ca o observație, eu folosesc OOP, de aceea am folosit modificatorul public
în fața "funcției". Dacă incluzi funcția în sine fără a o pune într-o clasă, nu este nevoie să adaugi public
.

Salut Zack, Aendrew și Philip. Totul funcționează perfect, dar am încercat să aplic și la o interogare fără succes. Nu înțeleg exact de ce. Iată link-ul, deoarece voi toți știți cum a funcționat inițial câmpul personalizat pentru postări noi, am crezut că ați putea vedea greșeala mea. http://wordpress.stackexchange.com/questions/8622/wp-insert-post-php-function-dynamically-generated-custom-fields

@Zack - Răspuns frumos. Dar aș fi tentat să evit utilizarea liniuțelor de subliniere la începutul numelor de funcții, doar pentru că numele cu liniuțe de subliniere tind să fie folosite de dezvoltatorii de platforme atunci când doresc să creeze funcții "rezervate" sau (pseudo) "ascunse", astfel încât oamenii care le văd ar putea crede că sunt funcții ale platformei sau, mai rău, ar putea intra în conflict cu o funcție viitoare din nucleul WordPress. Doar o părere.

@MikeSchinkel: La început, am folosit "__" pentru funcții protejate într-o clasă, dar apoi am schimbat structura plugin-ului meu astfel încât funcția a trebuit să fie publică. De asemenea, aș fi numit-o pur și simplu "update_post_meta", dar asta ar fi intrat cu siguranță în conflict cu funcțiile de bază ale WordPress. Așa că nu am știut cum să o numesc :(

@Zack - Poate zacks_update_post_meta()
? :) Alta problema pe care nu am mentionat-o cu underscore-urile la început este ca altcineva la fel de creativ poate folosi aceeași convenție într-un plugin și astfel intră în conflict cu al tău. Apropo, știai că update_post_meta()
adaugă dacă nu există? add_post_meta()
este necesar doar când vrei să adaugi chei duplicate.

@MikeSchinkel: Inițial am găsit funcția în altă parte pe acest site, mi-a plăcut și am refactorizat-o doar pentru că așa sunt eu. De asemenea, am presupus că update_post_meta()
face asta deja, dar nu puteam fi sigur. Când am găsit funcția, am sărit la concluzii.

@Zack - Hei, învățarea WordPress-ului este o călătorie. Cred că mai am cel puțin 50% din această călătorie în față, dacă nu chiar mult mai mult!

Puteți adăuga simplu 'add_post_meta' după 'wp_insert_post'
<?php
$my_post = array(
'post_title' => $_SESSION['booking-form-title'],
'post_date' => $_SESSION['cal_startdate'],
'post_content' => 'Acesta este articolul meu.',
'post_status' => 'publish',
'post_type' => 'booking',
);
$post_id = wp_insert_post($my_post);
add_post_meta($post_id, 'META-KEY-1', 'META_VALUE-1', true);
add_post_meta($post_id, 'META-KEY-2', 'META_VALUE-2', true);
?>

Puteți adăuga elementul 'meta_input' în parametrii postului ca un array de valori meta pentru post, indexate după cheia lor meta.
<?php
$my_post = array(
'post_title' => $_SESSION['booking-form-title'],
'post_date' => $_SESSION['cal_startdate'],
'post_content' => 'Acesta este postul meu.',
'post_status' => 'publish',
'post_type' => 'booking',
'meta_input' => array(
'your_custom_meta_field_name' => $_SESSION['your_custom_meta_field_value']
)
);
wp_insert_post( $my_post );
?>

Neajutorător. $post->ID nu este disponibil pentru wp_insert_post_data, care este necesar pentru crearea de câmpuri personalizate.

@aendrew Acțiunea save_post
este chiar la sfârșitul funcției, are ID-ul postului și obiectul transmis, răspunsul este corect.

Sunt destul de sigur că acest lucru a fost editat, Rarst. Oricum, acum are sens.

Nu cred că poți folosi această funcționalitate cu wp_insert_post().
Motivul este modul în care WordPress stochează cele două tipuri de date. Postările sunt stocate într-un tabel monolitic mare cu o duzină de coloane (wp_posts); câmpurile personalizate sunt stocate într-un tabel mai simplu, cu 4 coloane (wp_postmeta) format în principal dintr-o cheie meta și o valoare, asociate cu o postare.
În consecință, nu poți stoca câmpuri personalizate până nu ai ID-ul postării.
Încearcă asta:
function myplugin_insert_customs($pid){
$customs = array(
'post_id' => $pid,
'meta_key' => 'Cheia ta meta',
'meta_value' => 'Valoarea ta meta',
);
add_post_meta($customs);
}
add_action('save_post', 'myplugin_insert_customs', 99);
Acest articol de pe Codex a fost de ajutor -- este cam opusul a ceea ce faci tu (adică ștergerea unei înregistrări din baza de date la ștergerea unei postări): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post

În acest caz, singura soluție pe care o văd este să folosesc o sesiune, ar fi corect?

Nu; presupun că plugin-ul tău încearcă să insereze câmpuri personalizate în același timp când un articol este salvat, corect? Cred că trebuie să te conectezi la WP după ce articolul este salvat, să obții noul ID al articolului, apoi să-l transmiți la add_post_meta(); pentru a crea câmpurile personalizate. Voi actualiza răspunsul meu imediat cu niște cod.

Mulțumesc pentru ajutor. Apropo, nu este un plugin. L-am scris astfel încât să-l putem personaliza cât de mult este necesar. (dar nu înțelege asta ca și cum aș fi expert în PHP, doar încercări și erori)
