WP вставить функцию PHP сообщения и настраиваемые поля
4 ответ
- голосов
-
- 2011-02-04
Если вы читали документацию по
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' );
If you read the documentation for
wp_insert_post
, it returns the post ID of the post you just created.If you combine that with the following function
__update_post_meta
(a custom function I acquired from this site and adapted a bit)/** * 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 ); } }
You'll get the following:
$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.который,кроме кода,идет куда.Огромное спасибоThanks very much. Could you possibly give me an idea on the implantation. IE. which but of code goes where. Many Thanks
- 0
- 2011-02-04
- Robin I Knight
-
Отлично сделано.Второй блок кода заменяет ваш,значения функции - это пара ключ/значение настраиваемого поля.Поместите функцию либо в начало скрипта,либо в отдельный файл .php,включенный в начало скрипта.Nicely done. The second code block replaces yours, the function values is the custom field key/value pair. Put the function either at the top of the script, or in a separate .php file included at the top of the script.
- 2
- 2011-02-04
- aendrew
-
В качестве примечания,я действительно использую ООП,поэтому модификатор `public` стоит перед словомfunction.Если вы включаете саму функцию,не помещая ее в класс,вам не нужно добавлять `public`As a note, I do use OOP so that's the reason for the `public` modifier in front of "function". If you're including the function itself without putting it into a class, you don't need to add `public`
- 1
- 2011-02-05
- Zack
-
Привет,Зак,Эндрю и Филип.Все работает прекрасно,но я безуспешно пытался применить это к запросу.Не совсем понимаю почему.Вот ссылка,поскольку вы все знаете,как работало исходное настраиваемое поле,новое сообщение,я думал,вы можете увидеть мою ошибку.http://wordpress.stackexchange.com/questions/8622/wp-insert-post-php-function-dynamically-generated-custom-fieldsHello Zack, Aendrew and Philip. Everything is working beautifully however I tried to apply it to a query as well to no avail. I don't quite see why. Here is the link since you all know how the initial custom field new post worked I thought you might see my error. http://wordpress.stackexchange.com/questions/8622/wp-insert-post-php-function-dynamically-generated-custom-fields
- 0
- 2011-02-05
- Robin I Knight
-
@Zack - Хороший ответ.Но я бы старался избегать использования ведущих подчеркиваний в именах функций хотя бы потому,что имена с ведущими подчеркиваниями,как правило,используются разработчиками платформ,когда они хотят создавать _ "зарезервированные" _ или _ (псевдо) "скрытые" _ функции,чтобы людивидя,что они могут подумать,что это функции платформы,или,что еще хуже,они могут конфликтовать с будущей основной функцией WordPress.Просто мысль.@Zack - Nice answer. But I would tend to shy away from using leading underscores in function names if only because names with leading underscores tend to be used by platform developers when they want to create _"reserved"_ or _(pseudo) "hidden"_ functions so people seeing those might think they are platform functions, or worse they might conflict with a future WordPress core function. Just a thought.
- 0
- 2011-02-05
- MikeSchinkel
-
@MikeSchinkel: Сначала я начал использовать «__» для защищенных функций внутри класса,но затем изменил структуру своего плагина так,чтобы функция была общедоступной.Я бы также назвал его просто update_post_meta,но это определенно противоречило бы основным функциям WordPress.Так что я не знал,как это назвать :(@MikeSchinkel: At first, I originally started using "__" for protected functions within a class, but then changed the structure of my plugin to where the function needed to be public. I also would've named it simply "update_post_meta" but that would've definitely conflicted with WordPress' core functions. So I didn't know what to name it :(
- 0
- 2011-02-05
- Zack
-
@Zack - Может быть,`zacks_update_post_meta ()`?:) Другая проблема,которую я не упомянул с подчеркиванием в начале,заключается в том,что кто-то другой,столь же творческий,может использовать то же соглашение в плагине и,таким образом,конфликтовать с вашим.Кстати,знаете ли вы,что update_post_meta () добавляет,если его не существует?add_post_meta () нужен только тогда,когда вы хотите добавить повторяющиеся ключи.@Zack - Maybe `zacks_update_post_meta()`? :) The other issue I didn't mention with leading underscores is that someone else equally creative may use the same convention in a plugin and thus conflict with yours. BTW, did you know that `update_post_meta()` adds if it doesn't exist? `add_post_meta()` is only needed when you want to add duplicate keys.
- 0
- 2011-02-05
- MikeSchinkel
-
@MikeSchinkel: Изначально я нашел эту функцию где-нибудь на этом сайте,она мне понравилась,и я изменил ее только потому,что я такой.Я также полагал,что update_post_meta () уже сделал это,но не мог быть уверен.Когда я нашел функцию,я поспешил с выводами.@MikeSchinkel: I originally found the function elsewhere on this site, liked it, and refactored it just because I'm like that. I also figured `update_post_meta()` did that already, but couldn't be sure. When I found the function, I jumped to conclusions.
- 0
- 2011-02-05
- Zack
-
@Zack - Привет,изучение WordPress - это путешествие.Я полагаю,что у меня осталось как минимум 50% от этого путешествия,если не намного больше!@Zack - Hey learning WordPress is a journey. I figure I still have at least 50% more of that journey left, if not a lot more!
- 0
- 2011-02-05
- MikeSchinkel
-
Я не могу добавить ответ,так как у меня нет репутации на wordpress.stackexchange.На сегодняшний день существует новый метод,вы можете просто поместить массив в wp_insert_post как:meta_input=> array (key=> value)I can't add an answer, as I don't have reputation on wordpress.stackexchange. As of today there is a new method, you can simply put in an array into wp_insert_post as: meta_input => array(key=>value)
- 1
- 2016-10-15
- Frederik Witte
-
- 2011-02-05
Вы можете просто добавить 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); ?>
You can simple add the 'add_post_meta' after the '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); ?>
-
- 2011-02-04
Используйте фильтр
save_post
,затем вызовитеadd_post_meta
в своей функции фильтра.Use
save_post
filter, then calladd_post_meta
in your filter function.-
Бесполезный.$post-> ID недоступен для wp_insert_post_data,который необходим для создания настраиваемых полей.Unhelpful. $post->ID is not available to wp_insert_post_data, which is necessary for creating custom fields.
- 0
- 2011-02-04
- aendrew
-
Действие @aendrew `save_post` находится в самом конце функции,ему переданы идентификатор сообщения и объект,ответ звуковой.@aendrew `save_post` action is at the very end of the function, it has post's ID and object passed to it, answer is sound.
- 0
- 2011-02-05
- Rarst
-
Я почти уверен,что это отредактировали,Рарст.Тем не менее,теперь это имеет смысл.I'm pretty sure this was edited, Rarst. Regardless, it makes sense now.
- 1
- 2011-02-05
- aendrew
-
@aendrew ах,извини - не заметил этого@aendrew ah, sorry - didn't notice that
- 0
- 2011-02-05
- Rarst
-
- 2011-02-04
Я не думаю,что вы можете использовать его с 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
I don't think you can use it with wp_insert_post();.
The reason is because of how WP stores the two data types. Posts are stored in one big monolithic table with a dozen different columns (wp_posts); custom fields are stored in a simpler, 4-column table (wp_postmeta) comprised mainly of a meta key and value, associated with a post.
Consequently, you can't really store custom fields until you have the post ID.
Try this:
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);
This codex post helped -- it's kinda the opposite of what you're doing (i.e., deleting a DB row upon post deletion): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post
-
В этом случае единственный выход,который я вижу,- это использовать сеанс,было бы это правильно.In that case the only way out I can see is to use a session, would that be correct.
- 0
- 2011-02-04
- Robin I Knight
-
Неа;Я предполагаю,что ваш плагин пытается вставить настраиваемые поля одновременно с сохранением публикации,верно?Я думаю,что вам нужно подключиться к WP после сохранения сообщения,получить новый идентификатор сообщения и передать его в add_post_meta ();для создания CF.Я обновлю свой ответ через секунду некоторым кодом.Nah; I'm guessing your plugin is trying to insert custom fields at the same time a post is saved, right? I think what you need to do is hook into WP after the post is saved, grab the post's new ID number, then supply that to add_post_meta(); to create the CFs. I'll update my answer in a second with some code.
- 0
- 2011-02-04
- aendrew
-
Спасибо за помощь.Кстати это не плагин.Я написал его,чтобы мы могли настроить его столько,сколько нужно.(но не думайте,что я хорошо разбираюсь вphp,просто методом проб и ошибок)Thanks for the help. By the way its not a plugin. I wrote it so we can customise it as much as needed. (but don't take that to mean I'm any good with php, just trial and error)
- 0
- 2011-02-04
- Robin I Knight
-
Значит,это тема?Единственная реальная разница в том,что в этом случае вы поместите это вfunctions.php.It's a theme, then? Only real difference is you'd put that in functions.php, in that case.
- 0
- 2011-02-04
- aendrew
Функция WordPress используется для программной отправки данных.Стандартные поля для отправки,чтобы включить содержание,отрывок,заголовок,дату и многое другое.
Отсутствует документация по отправке в настраиваемое поле.Я знаю,что это возможно с помощью функции
add_post_meta($post_id, $meta_key, $meta_value, $unique);
.Но как включить это в стандартную функцию
wp_insert_post
?