Cum se actualizează câmpurile personalizate folosind funcția wp_insert_post()?

4 feb. 2011, 22:10:23
Vizualizări: 81K
Voturi: 31

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 );
  ?>
0
Toate răspunsurile la întrebare 5
10
35

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' );
4 feb. 2011 23:01:57
Comentarii

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.

Robin I Knight Robin I Knight
4 feb. 2011 23:13:58

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.

aendra aendra
4 feb. 2011 23:37:11

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.

Zack Zack
5 feb. 2011 05:13:38

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

Robin I Knight Robin I Knight
5 feb. 2011 19:22:23

@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 MikeSchinkel
5 feb. 2011 19:46:08

@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 Zack
5 feb. 2011 19:50:08

@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 MikeSchinkel
5 feb. 2011 20:01:08

@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 Zack
5 feb. 2011 20:04:00

@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!

MikeSchinkel MikeSchinkel
5 feb. 2011 20:06:43

Nu pot adăuga un răspuns, deoarece nu am reputație pe wordpress.stackexchange. Începând de astăzi există o metodă nouă, puteți pur și simplu să introduceți un array în wp_insert_post ca: meta_input => array(key=>value)

Frederik Witte Frederik Witte
15 oct. 2016 12:59:23
Arată celelalte 5 comentarii
0
17

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);
?>
5 feb. 2011 10:58:21
0

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 );
  ?>
21 sept. 2020 02:44:33
4

Folosește filtrul save_post, apoi apelează add_post_meta în funcția ta de filtrare.

4 feb. 2011 22:30:13
Comentarii

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

aendra aendra
4 feb. 2011 22:40:01

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

Rarst Rarst
5 feb. 2011 02:16:12

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

aendra aendra
5 feb. 2011 04:04:54

@aendrew ah, scuze - nu am observat asta

Rarst Rarst
5 feb. 2011 11:46:54
4

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

4 feb. 2011 22:31:37
Comentarii

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

Robin I Knight Robin I Knight
4 feb. 2011 22:42:46

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.

aendra aendra
4 feb. 2011 22:48:58

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)

Robin I Knight Robin I Knight
4 feb. 2011 22:52:01

Este o temă, atunci? Singura diferență reală este că ai pune asta în functions.php, în acest caz.

aendra aendra
4 feb. 2011 23:00:49