WP wstaw funkcję post PHP i pola niestandardowe

26

Funkcja WordPress służy do programowego przesyłania danych. Standardowe pola do przesłania w celu umieszczenia treści, fragmentu, tytułu, daty i wielu innych.

Brak dokumentacji dotyczy sposobu przesłania do pola niestandardowego. Wiem, że jest to możliwe dzięki tej add_post_meta($post_id, $meta_key, $meta_value, $unique);funkcji.

Ale jak włączyć to do standardowej wp_insert_postfunkcji?

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );
  wp_insert_post( $my_post );
  ?>
Robin I Knight
źródło

Odpowiedzi:

35

Jeśli czytasz dokumentację wp_insert_post, zwraca identyfikator posta, który właśnie utworzyłeś.

Jeśli połączysz to z następującą funkcją __update_post_meta(niestandardową funkcję nabyłem z tej strony i trochę ją dostosowałem)

/**
  * Updates post meta for a post. It also automatically deletes or adds the value to field_name if specified
  *
  * @access     protected
  * @param      integer     The post ID for the post we're updating
  * @param      string      The field we're updating/adding/deleting
  * @param      string      [Optional] The value to update/add for field_name. If left blank, data will be deleted.
  * @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 );
    }
}

Otrzymasz następujące:

$my_post = array(
    'post_title' => $_SESSION['booking-form-title'],
    'post_date' => $_SESSION['cal_startdate'],
    'post_content' => 'This is my post.',
    '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' );
Zack
źródło
Dziękuję bardzo. Czy mógłbyś mi podać pomysł na implantację. TO ZNACZY. który oprócz kodu idzie gdzie. Wielkie dzięki
Robin I Knight
2
Ładnie wykonane. Drugi blok kodu zastępuje twój, wartości funkcji to niestandardowa para klucz / wartość pola. Umieść funkcję albo na górze skryptu, albo w osobnym pliku .php na górze skryptu.
aendrew
1
Uwaga: używam OOP, więc to jest powód publicmodyfikatora przed „funkcją”. Jeśli dołączasz samą funkcję bez umieszczania jej w klasie, nie musisz dodawaćpublic
Zack
Cześć Zack, Aendrew i Philip. Wszystko działa pięknie, ale starałem się zastosować to również do zapytania, ale bezskutecznie. Nie bardzo rozumiem dlaczego. Oto link, ponieważ wszyscy wiecie, jak działało początkowe pole niestandardowe, nowy post, myślałem, że może zobaczyć mój błąd. wordpress.stackexchange.com/questions/8622/…
Robin I Knight
1
Nie mogę dodać odpowiedzi, ponieważ nie mam reputacji na wordpress.stackexchange. Na dzień dzisiejszy istnieje nowa metoda, możesz po prostu umieścić tablicę w wp_insert_post jako: meta_input => tablica (klucz => wartość)
Frederik Witte
13

Możesz po prostu dodać „add_post_meta” po „wp_insert_post”

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     '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);
?>
Philip
źródło
1

Nie sądzę, że można go używać z wp_insert_post () ;.

Powodem jest to, w jaki sposób WP przechowuje dwa typy danych. Wpisy są przechowywane w jednym dużym monolitycznym stole z tuzinem różnych kolumn (wp_posts); pola niestandardowe są przechowywane w prostszej, 4-kolumnowej tabeli (wp_postmeta) składającej się głównie z meta klucza i wartości, powiązanych z postem.

W związku z tym nie możesz tak naprawdę przechowywać niestandardowych pól, dopóki nie będziesz mieć identyfikatora postu.

Spróbuj tego:

function myplugin_insert_customs($pid){

    $customs = array(
    'post_id' => $pid,
    'meta_key' => 'Your meta key',
    'meta_value' => 'Your meta value',
    );

    add_post_meta($customs);

}

add_action('save_post', 'myplugin_insert_customs', 99);

Ten post w kodeksie pomógł - jest to coś zupełnie przeciwnego do tego, co robisz (tj. Usuwanie wiersza DB po usunięciu postu): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post

Aendrew
źródło
W takim przypadku jedyne wyjście, jakie widzę, to skorzystanie z sesji, czy byłoby to prawidłowe.
Robin I Knight
Nie; Zgaduję, że Twoja wtyczka próbuje wstawić niestandardowe pola w tym samym czasie, gdy zapisywany jest wpis, prawda? Myślę, że musisz zapisać WP po ​​zapisaniu posta, pobrać nowy numer identyfikacyjny posta, a następnie podać go do add_post_meta (); stworzyć CF. Zaktualizuję swoją odpowiedź za sekundę kodem.
aendrew
Dzięki za pomoc. Nawiasem mówiąc, nie jest to wtyczka. Napisałem to, abyśmy mogli dostosować go w miarę potrzeb. (ale nie oznacza to, że jestem dobry w php, tylko próby i błędy)
Robin I Knight
To jest motyw? Jedyną prawdziwą różnicą jest to, że umieściłbyś to w functions.php.
Aendrew
1

Użyj save_postfiltru, a następnie wywołaj add_post_metafunkcję filtra.

Micah Ernst
źródło
Nieprzydatny. $ post-> ID nie jest dostępne dla wp_insert_post_data, która jest niezbędna do tworzenia niestandardowych pól.
aendrew
save_postDziałanie @aendrew znajduje się na samym końcu funkcji, ma identyfikator posta i obiekt przekazany do niego, odpowiedź jest dźwiękowa.
Rarst
1
Jestem prawie pewien, że to było edytowane, Rarst. Niezależnie od tego, teraz ma to sens.
aendrew
@aendrew ah, przepraszam - nie zauważyłem tego
Rarst