Intereting Posts
Добавить загрузчик изображений на странице сообщений backend Ошибка плагина Эквивалентный пользовательский тип сообщения Кнопка Anchor TinyMCE не отображается Как включить изменения для почтовых метаданных? Как добавить идентификаторы элементов текущего, родительского и предкового объектов в body_class ()? Как отображать все сообщения только в тот же месяц и день? transition_post_status не работает с массовыми обновлениями Максимальное количество сообщений в сети (многосетевое соединение WP) Могу ли я перечислить пользовательский тип сообщения в другом настраиваемом типе сообщений в области администрирования? get_the_post_thumbnail_url с незарегистрированным размером удалить пользовательский тип сообщения ulr Удалить содержимое после тегов <! – more-> Как извлечь переменные из функции «add_shortcode»? Как сделать простое добавление, чтобы увеличить количество избранных моих сообщений WordPress

Проверьте перед публикацией, если уже существует сообщение с текущим значением настраиваемого поля

У меня есть пользовательский тип сообщения, в котором есть только 3 пользовательских поля.

$post_types = get_post_meta($post->ID,'post_types',true); $post_taxonomies = get_post_meta($post->ID,'post_taxonomies',true); $post_terms = get_post_meta($post->ID,'post_terms',true); 

Я хочу проверить, существует ли уже сообщение с этим значением $ post_types, а если есть -> показать сообщение без публикации.

Я создал метабокс для этих настраиваемых полей, которые уже имеют функцию для действия action_post.

 function sidebars_meta_save( $id ) { if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; if( !isset( $_POST['sidebars_nonce'] ) || !wp_verify_nonce( $_POST['sidebars_nonce'], 'save_sidebars_meta' ) ) return; if( !current_user_can( 'edit_post' ) ) return; $allowed = array( 'p' => array() ); if(isset( $_POST['post_terms'] )){ //check_exist_term - simple boolean function which check if //a post with this term already exist if(!check_exist_term($_POST['post_terms'])){ if( isset( $_POST['post_types'] ) ){ update_post_meta( $id, 'post_types', wp_kses( $_POST['post_types'], $allowed ) ); } if( isset( $_POST['post_taxonomies'] ) ) { update_post_meta( $id, 'post_taxonomies', wp_kses( $_POST['post_taxonomies'], $allowed ) ); } update_post_meta( $id, 'post_terms', wp_kses( $_POST['post_terms'], $allowed ) ); } }else{ //if I will use wp_delete_post here, the message will not show //wp_delete_post($id); //wp_redirect('post-new.php?post_type=sidebars'); //exit; } } } add_action( 'save_post', 'sidebars_meta_save' ); 

Моя функция определения перенаправления:

 function sidebars_redirect_location($location,$post_id){ if( isset( $_POST['post_types'] ) ){ if(check_exist_term($_POST['post_terms'])){ $status = get_post_status( $post_id ); $location = add_query_arg('message', 21, $location); //if I will use wp_delete_post here, I will be not able //to return to post edit page, because page will be already deleted } } return $location; } add_filter('redirect_post_location','sidebars_redirect_location',10,2); 

Моя почта обновила сообщение:

 function sidebars_custom_messages($messages){ $messages['sidebars'][21] = 'Looks like you tried publishing a post with term which already exist!'; return $messages; } add_filter('post_updated_messages', 'sidebars_custom_messages'); 

1) Где я должен использовать wp_delete_post () Если я хочу, прежде всего, показать сообщение, что это сообщение уже существует, и просто удалить это сообщение и остаться на этой странице? 2) Как показать красное сообщение вместо желтого?

Проверка наличия метазначений

Вы можете использовать get_posts() (или объект WP_Query ) для запроса всех сообщений, которые соответствуют WP_Query которые вы хотите сохранить. Вам нужно будет указать статус сообщения (т.е. какие статусы вы хотите игнорировать). Ниже приведен непроверенный код.

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

 //Collect the terms //I'm assuming that each of the values are strings. $meta_terms = $_POST['post_terms']; $meta_taxs = $_POST['post_taxonomies']; $meta_types = $_POST['post_types']; //Query post type 'products' to check for posts whose meta values match the POSTed ones $args = array( 'post__not_in'=> array($id), 'post_type' => 'product', 'post_status' => array('publish','pending','draft','future','private'), 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'post_terms', 'value' => $meta_terms, 'compare' => '=' ), array( 'key' => 'post_taxonomies', 'value' => $meta_taxs, 'compare' => '=' ), array( 'key' => 'post_types', 'value' => $meta_types 'compare' => '=' ) ) ); $existingMeta = get_posts( $args ); if(empty($existingMeta)){ //Go ahead and save meta data }else{ //Revert post back to draft status as shown in linked answer below. } 

Боковые замечания

«Post_terms» и т. Д. Кажутся довольно универсальными. Я бы дал им более описательные и уникальные имена – событие больше, если бы оно использовалось как ключевое слово в метатете сообщений. Кроме того, чтобы избежать конфликтов, вы можете отправить данные внутри массива с уникальным именем: ie

 <input type="text" name="myplugin[post_terms]" value=""/> 

Затем $_POST['myplugin']['post_terms'] данные как $_POST['myplugin']['post_terms'] а не $_POST['post_terms'] . Вы можете быть уверены, что любые данные внутри $_POST['myplugin'] были переписаны другим плагином. Также вы должны использовать nonces, чтобы помочь проверить источник / намерение.

Предотвращение публикации публикации

Вы не можете запретить публикацию публикации (если вы не используете jQuery). Однако сразу после публикации публикации вы можете выполнить проверку и, при желании, вернуть ее обратно в статус проекта: см. Мое решение этого связанного вопроса .

Отображение пользовательского сообщения

В связанном решении, если сообщение было возвращено обратно в черновик, я установил переменную сообщения в «10», чтобы было показано черновик сообщения: « Проект обновлен …. »:

 add_filter('redirect_post_location','my_redirect_location',10,2); function my_redirect_location($location,$post_id){ //If post was published... if (isset($_POST['publish'])){ //obtain current post status $status = get_post_status( $post_id ); //The post was 'published', but if it is still a draft, display draft message (10). if($status=='draft') $location = add_query_arg('message', 10, $location) } return $location; } 

Однако вы можете указать свое собственное сообщение. 10 ссылается на ключ массива, где каждое значение является сообщением. 0 пуст, 1-9 – сообщения по умолчанию (опубликованные, обновленные и т. Д.).

( Это не проверено ), но вы можете добавить свои собственные сообщения в этот массив:

 add_filter('post_updated_messages', 'my_custom_messages'); function my_custom_messages($messages){ //$message is an array of arrays. //$message['post_type'] is an array of messages for post type 'post_type' //It is a non-assocative array. Value for 0 is blank. Keys 1-9 hold the default messages //Add a custom message to key 21 for post type 'my_post_type' $messages['my_post_type'][21] = 'Looks like you tried publishing, but something went wrong'; return $messages } 

Затем вы можете установить сообщение на 21, а не на 10, как показано выше.