WP вставити пост функції PHP та користувацькі поля


26

Функція WordPress використовується для програмного подання даних. Стандартні поля, які потрібно подати, щоб відобразити вміст, уривок, заголовок, дату та багато іншого.

Те, для чого немає документації, - це подання у спеціальне поле. Я знаю, що це можливо зadd_post_meta($post_id, $meta_key, $meta_value, $unique); функції.

Але, як включити це до стандартної 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',
  );
  wp_insert_post( $my_post );
  ?>

Відповіді:


35

Якщо ви прочитаєте документацію wp_insert_post, вона повертає ідентифікатор пошти щойно створеної вами публікації.

Якщо ви поєднаєте це з наступною функцією __update_post_meta(спеціальна функція, яку я придбала на цьому веб-сайті та трохи адаптувалась)

/**
  * 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 );
    }
}

Ви отримаєте наступне:

$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' );

Дуже дякую. Не могли б ви дати мені уявлення про імплантацію. IE. який, але коду, куди йде. Велике спасибі
Робін І лицар

2
Чудово зроблено. Другий блок коду замінює ваш, значення функції - це спеціальна пара клавіш / значення. Покладіть функцію або у верхній частині сценарію, або в окремий .php файл, що міститься у верхній частині сценарію.
aendrew

1
Як зауваження, я використовую OOP, тому це причина publicмодифікатора перед "функцією". Якщо ви включаєте саму функцію, не вводячи її в клас, вам не потрібно додаватиpublic
Зак

Привіт Зак, Ендрю та Філіп. Все працює чудово, проте я намагався застосувати його і до запиту, але безрезультатно. Я не зовсім розумію, чому. Ось посилання, оскільки ви всі знаєте, як спрацювало початкове користувацьке поле нової публікації. Я подумав, що ви можете побачити мою помилку. wordpress.stackexchange.com/questions/8622/…
Робін I лицар

1
Я не можу додати відповіді, оскільки не маю репутації на wordpress.stackexchange. На сьогоднішній день існує новий метод, ви можете просто помістити масив у wp_insert_post як: meta_input => масив (ключ => значення)
Frederik Witte

13

Ви можете просто додати 'add_post_meta' після '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);
?>

1

Я не думаю, що ви можете використовувати його з wp_insert_post () ;.

Причина в тому, як WP зберігає два типи даних. Пости зберігаються в одній великій монолітній таблиці з десятком різних стовпців (wp_posts); користувацькі поля зберігаються у більш простому, 4-стовпчиковій таблиці (wp_postmeta), що складається в основному з мета-ключа та значення, пов’язаних із публікацією.

Отже, ви не можете дійсно зберігати спеціальні поля, поки не отримаєте ідентифікатор пошти.

Спробуйте це:

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);

Ця публікація кодексу допомогла - це щось протилежне тому, що ви робите (тобто видалення рядка DB після видалення повідомлення): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post


У цьому випадку єдиний вихід, який я бачу, - це використовувати сеанс, чи було б це правильно.
Робін І лицар

Нах; Я здогадуюсь, що ваш плагін намагається одночасно вставити користувацькі поля, зберігаючи публікацію, правда? Я думаю, що вам потрібно зробити це підключити WP після збереження публікації, захопити новий ідентифікаційний номер повідомлення, а потім поставити його для add_post_meta (); для створення МВ. Я оновлю свою відповідь через секунду деяким кодом.
aendrew

Дякую за допомогу. До речі, це не плагін. Я написав це, щоб ми могли налаштувати його скільки завгодно. (але не сприйміть це, що я знаходжу добре з php, просто пробою та помилками)
Robin I Knight

То це тема? Єдиною реальною різницею є те, що ви поставите це в function.php у такому випадку.
aendrew

1

Скористайтеся save_postфільтром, а потім зателефонуйте add_post_metaу функцію фільтра.


Непомітний. $ post-> ID недоступний для wp_insert_post_data, що необхідно для створення спеціальних полів.
aendrew

@aendrew save_postдія знаходиться в самому кінці функції, вона має ідентифікатор повідомлення та переданий йому об'єкт, відповідь - це звук.
Рарст

1
Я впевнений, що це було відредаговано, Рарст. Незалежно, зараз це має сенс.
aendrew

@aendrew ах, вибачте - цього не помітили
Rarst
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.