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' );
Zack
источник
Большое спасибо. Не могли бы вы дать мне идею об имплантации. IE. который, но кода идет куда. Большое спасибо
Робин, я рыцарь
2
Красиво сделано. Второй блок кода заменяет ваш, значения функции - пара ключ / значение пользовательского поля. Поместите функцию либо в начало скрипта, либо в отдельный файл .php, включенный в начало скрипта.
aendrew
1
Как примечание, я использую ООП, так что это причина для publicмодификатора перед «функцией». Если вы включаете саму функцию, не помещая ее в класс, вам не нужно добавлятьpublic
Зак
Привет Зак, Эндрю и Филипп. Все работает прекрасно, но я попытался применить его и к запросу, но безрезультатно. Я не совсем понимаю, почему. Вот ссылка, так как вы все знаете, как работало начальное настраиваемое поле нового поста. wordpress.stackexchange.com/questions/8622/…
Робин I Рыцарь
1
Я не могу добавить ответ, так как у меня нет репутации на wordpress.stackexchange. На сегодняшний день появился новый метод, вы можете просто поместить массив в wp_insert_post как: meta_input => array (key => value)
Фредерик Витте
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);

Этот пост Кодекса помог - это своего рода противоположность того, что вы делаете (т.е. удаляете строку БД после удаления поста): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post

aendrew
источник
В этом случае единственный выход, который я вижу, - это использовать сеанс, это будет правильно.
Робин, я рыцарь
Неа; Я предполагаю, что ваш плагин пытается вставить пользовательские поля одновременно с сохранением сообщения, верно? Я думаю, что вам нужно подключиться к WP после сохранения поста, взять новый идентификационный номер поста, а затем передать его в add_post_meta (); создать CF. Я обновлю свой ответ через секунду с некоторым кодом.
aendrew
Спасибо за помощь. Кстати, это не плагин. Я написал это, чтобы мы могли настроить его столько, сколько нужно. (но не принимайте это, чтобы означать, что я хорошо разбираюсь в php, только методом проб и ошибок)
Robin I Knight
Это тема, тогда? Единственная реальная разница в том, что вы поместите это в functions.php, в этом случае.
aendrew
1

Используйте save_postфильтр, затем вызовите add_post_metaфункцию фильтра.

Мика Эрнст
источник
Бесполезный. $ post-> ID недоступен для wp_insert_post_data, что необходимо для создания настраиваемых полей.
aendrew
save_postДействие @aendrew находится в самом конце функции, у него есть идентификатор сообщения и переданный ему объект, ответ - звук.
Rarst
1
Я уверен, что это было отредактировано, Rarst. Несмотря на это, это имеет смысл сейчас.
aendrew
@aendrew ах, извините - не заметил этого
первый