Intereting Posts
Может ли элемент RSS быть изменен с помощью крючка? Публикация переменных товаров в Woocommerce из грозных форм на WordPress Исключить внешний uri для версии css и js Что стоит использовать add_action, когда мы можем просто использовать add_filter? Как переопределить функцию электронной почты с помощью фильтров? Удаляет ли вы потерянные документы wp_postmeta? Используйте Gravatar в качестве резервного изображения, если локальное изображение не найдено Как использовать wp_get_recent_posts со многими типами сообщений? Ошибка установки WordPress локально – Файл 'wp-config.php' уже существует Как удалить содержимое с вкладки «Справка»? Нужен ли мне цикл для отображения объекта, прикрепленного к сообщениям? Индивидуальные методы первой публикации Безопасно ли обновлять обновление данных WooCommerce? Пользовательский тип сообщения игнорируется в запросе Проблема с памятью при параметре post per page

Вставка пользовательской почты после публикации опубликованного типа публикации

Я пытаюсь заполнить таблицу postmeta специальным значением, когда публикуется пользовательский тип («мои-решения»). Я прочитал несколько потоков, блог Codex и Pippin по этому вопросу и попробовал много вариантов, но не могу заставить это работать. Если кто-то может добавить или исправить что-нибудь, что было бы здорово.

function run_when_my_solution_published( $post ){ global $wpdb; $id = $post->ID; if($post->post_type == 'my-solutions'){ $wpdb->insert('wp_postmeta', array( 'meta_id' => NULL , 'post_id' => $id , 'meta_key' => 'my_json' , 'meta_value' => 'json' ), array( '%d' , '%d' , '%s' , '%s' ) ); } } add_action('new_to_publish', 'run_when_my_solution_published'); 

Solutions Collecting From Web of "Вставка пользовательской почты после публикации опубликованного типа публикации"

Новое Новое решение:

 function wpse153622_transition_solution( $new_status, $old_status, $post ) { if ( $new_status != $old_status && 'publish' === $new_status && 'my-solution' === $post->post_type ) { update_post_meta( $post_id, 'my_json', 'json' ); } } add_action( 'transition_post_status', 'wpse153622_transition_solution', 10, 3 ); 

Это должно срабатывать только тогда, когда 1. новый статус сообщения не совпадает с прежним. 2. новый статус сообщения равен публикации и 3. тип публикации равен типу вашего сообщения.

Новое решение

Редактирование: после чтения сообщений о переходах статуса сообщения, я думаю, что это должно сделать трюк:

 function wpse153622_save_solution( $post_id, $post ) { update_post_meta( $post_id, 'my_json', 'json' ); } add_action( 'publish_my-solution', 'wpse153622_save_solution', 10, 2 ); 

Это использует publish_my-solution , которое должно запускаться только при публикации публикации типа my-solution . См. {status}_{post_type} здесь .

Старое решение

Использование действия save_post_{post_type} будет работать для вас, хотя оно будет вызываться всякий раз, когда вы обновляете сообщение, а также публикуете:

 function wpse153622_save_solution( $post_id, $post, $update ) { update_post_meta( $post_id, 'my_json', 'json' ); } add_action( 'save_post_my-solution', 'wpse153622_save_solution', 10, 3 ); 

Я использовал это раньше, и он работает, но, как я уже сказал, он будет вызываться всякий раз, когда вы вносите изменения в сообщение. Я не думаю, что это будет большой проблемой.

Я смог добавить / удалить термины из типа сообщения, если он был опубликован с помощью hook_post_status. Я адаптировал ваш вопрос к моему решению ниже:

 function run_when_my_solution_published( $new_status, $old_status, $post ) { global $wpdb; if($post->post_type == 'my-solutions' && $new_status == 'publish'){ $wpdb->insert('wp_postmeta', array( 'meta_id' => NULL , 'post_id' => $id , 'meta_key' => 'my_json' , 'meta_value' => 'json' ), array( '%d' , '%d' , '%s' , '%s' ) ); } } add_action ('transition_post_status', 'run_when_my_solution_published', 999, 3); 

Хотя Codex говорит, что использовать этот крючок неприемлемо, это был единственный, с которым я мог бы работать.

Как сказал @Howdy_McGee, я фактически использовал publish_post действие publish_post .

Пример кода для отправки электронного сообщения на публикацию:

 function post_published_notification( $ID, $post ) { $author = $post->post_author; /* Post author ID. */ $name = get_the_author_meta( 'display_name', $author ); $email = get_the_author_meta( 'user_email', $author ); $title = $post->post_title; $permalink = get_permalink( $ID ); $edit = get_edit_post_link( $author, '' ); $to[] = sprintf( '%s <%s>', $name, $email ); $subject = sprintf( 'Published: %s', $title ); $message = sprintf ('Congratulations, %s! Your article “%s” has been published.' . "\n\n", $name, $title ); $message .= sprintf( 'View: %s', $permalink ); $headers[] = ''; wp_mail( $to, $subject, $message, $headers ); } add_action( 'publish_post', 'post_published_notification', 10, 2 ); 

Вы можете использовать более или менее то, что вы уже использовали для фильтрации по post_type . Я также определенно рекомендую использовать функцию add_post_meta вместо пользовательского запроса $wpdb .