Вызов функции после создания нового поста для пользовательского типа записи в WordPress?

6 сент. 2010 г., 15:57:09
Просмотры: 15.3K
Голосов: 8

Предположим, я создал новый тип записи 'product'. Есть ли способ выполнить пользовательскую функцию после того, как этот новый пост типа 'product' будет создан?

1
Комментарии

@dotty: Помог ли вам какой-либо из ответов ниже решить вашу проблему? Если да, пожалуйста, проголосуйте за них, чтобы поблагодарить людей, которые вам помогли, и выберите лучший ответ, чтобы ваш вопрос не оставался в списке "неотвеченных".

MikeSchinkel MikeSchinkel
10 сент. 2010 г. 23:32:47
Все ответы на вопрос 3
2

В functions.php:

function mynewproduct(){
    myfunction();
}
add_action( 'new_product', 'mynewproduct' );

Для получения дополнительной информации и официальной документации обратитесь сюда:

http://codex.wordpress.org/Post_Status_Transitions

7 сент. 2010 г. 15:15:50
Комментарии

Я не думаю, что new_{post_type} сработает, потому что status в действии {status}_{post_type} никогда не будет установлен в new.

Spencer Spencer
8 июл. 2015 г. 05:24:12

В этом случае полезно понимать, что подразумевается под "создано"

Tom J Nowell Tom J Nowell
8 июл. 2015 г. 15:33:50
0

Привет, @dotty:

Посмотрите на конец функции wp_insert_post() в файле /wp-includes/post.php (строки 2148-2392 в WordPress 3.0.1. Обратите внимание, что WordPress использует эту функцию как для добавления, так и для обновления записей.)

В конце находится следующий код. Из него можно увидеть вызов wp_transition_post_status() (подробнее об этом чуть позже), а также хуки действий edit_post, post_updated, save_post и wp_insert_post (честно говоря, не понимаю, зачем нужны последние два вместо одного.) Вы можете использовать любой из них, подходящий для ваших нужд:

<?php
wp_transition_post_status($data['post_status'], $previous_status, $post);
if ( $update ) {
  do_action('edit_post', $post_ID, $post);
  $post_after = get_post($post_ID);
  do_action( 'post_updated', $post_ID, $post_after, $post_before);
}
do_action('save_post', $post_ID, $post);
do_action('wp_insert_post', $post_ID, $post);
return $post_ID;

И, как упомянул @Jan Fabry, существуют хуки действий, находящиеся в wp_transition_post_status() (строки 2713-2717 файла /wp-includes/post.php в WordPress 3.0.1.) Обратите внимание, их три; используйте подходящий:

<?php
function wp_transition_post_status($new_status, $old_status, $post) {
  do_action('transition_post_status', $new_status, $old_status, $post);
  do_action("${old_status}_to_$new_status", $post);
  do_action("${new_status}_$post->post_type", $post->ID, $post);
}
7 сент. 2010 г. 04:55:24
2

Функция wp_transition_post_status будет вызвана, и это запустит действие "${new_status}_$post->post_type", так что если product переходит в состояние publish, будет вызвано действие publish_product.

6 сент. 2010 г. 16:12:01
Комментарии

Так я назначаю свою функцию на действие publish_product?

dotty dotty
6 сент. 2010 г. 16:48:13

@dotty: Вы можете так сделать, но если пользователь создаст товар, но еще не нажмет "Опубликовать", этот хук не сработает. Возможно, это именно то, что вам нужно, а возможно и нет.

Jan Fabry Jan Fabry
6 сент. 2010 г. 18:09:19