Несколько мета-значений для того же добавления мета-ключа в «Preview Changes», но не для сохранения или обновления сообщения

Я беру несколько значений местоположения с каждым сообщением, поэтому это массив (всегда). Поле мета-формы моего сообщения выглядит так:

<select name="<?php echo $project_prefix; ?>offer_locations[]" id="<?php echo $project_prefix; ?>offer_locations" required multiple="multiple"> ... ... ... </select> 

Если сообщение уже существует без какого-либо значения для местоположений, существующее значение будет иметь значение null , но по мере того, как это поле является обязательным, новое значение местоположения [при сохранении], несомненно, будет массивом, и мы должны добавить значение postmeta.

Условия, которые я сделал с помощью array_diff() , работают нормально. Я сделал собственный сценарий и проверил код, и даже в WordPress я проверил код ( собственный блок кода ), так как вы можете увидеть пару var_dump() , echo и exit() inline. Но…

 <?php function save_post_specifics_meta( $post_id ) { global $project_prefix; // verify nonce if (!isset($_POST['post_specifics_nonce']) || !wp_verify_nonce($_POST['post_specifics_nonce'], basename(__FILE__))) return $post_id; // check autosave if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id; // check permissions if ( 'post' == $_POST['post_type'] && !current_user_can('edit_post', $post_id) ) return $post_id; //Location meta data $existing_locations = get_post_custom_values( "{$project_prefix}post_locations", $post_id ); $new_locations = $_POST["{$project_prefix}post_locations"]; //always an array var_dump($existing_locations); //for debugging only var_dump($new_locations); //for debugging only if( is_array( $existing_locations ) ) { $new_diff = array_diff( $new_locations, $existing_locations ); $existing_diff = array_diff( $existing_locations, $new_locations ); } else { $new_diff = $new_locations; $existing_diff = $existing_locations; } var_dump($new_diff); //for debugging only var_dump($existing_diff); //for debugging only if( $new_diff ) { foreach( $new_diff as $new_location ) { add_post_meta( $post_id, "{$project_prefix}post_locations", $new_location ); echo "New Multiple: ", $new_location, '<br>'; //for debugging only } } if( $existing_locations && $existing_diff ) { if( is_array( $existing_diff ) ) { foreach ( $existing_diff as $existing_location ) { delete_post_meta( $post_id, "{$project_prefix}post_locations", $existing_location ); echo "Delete Multiple: ", $existing_location, '<br>'; //for debugging only } } else { delete_post_meta( $post_id, "{$project_prefix}post_locations", $existing_diff ); echo "Delete Single: ", $existing_diff, '<br>'; //for debugging only } } exit(); //for debugging only } add_action( 'save_post', 'save_post_specifics_meta', 10 ); add_action( 'new_to_publish', 'save_post_specifics_meta', 10 ); 

При сохранении или обновлении сообщения местоположение мета-поля выполняется так, как ожидалось. Но если оператор ввода данных попадает в кнопку Preview Changes , add_post_meta() запускается, даже в пределах истинных условных фигурных скобок и добавляя повторяющиеся записи, я не знаю, как !!! : о

Затем я добавил true к последнему параметру (строка # 40), чтобы сделать значение уникальным, чтобы я мог останавливать повторяющиеся записи. Но добавление true прекратило добавлять любое новое значение в meta_key даже при сохранении.

Как я могу прекратить добавлять мета значение в Preview Changes ?

Solutions Collecting From Web of "Несколько мета-значений для того же добавления мета-ключа в «Preview Changes», но не для сохранения или обновления сообщения"

На самом деле я бы хотел получить ответ от @ialocin, потому что он предложил мне путь. Но поскольку код немного длинный для поля комментариев, я отправляю его здесь как ответ. Но я бы с удовольствием принял ответ, более соответствующий ситуации:

После предложения @ ialocin, я понял, что $post_id не был точным для хита Preview Changes , поэтому $existing_locations не получал правильную информацию db. Теперь я изменил следующую строку:

 $existing_locations = get_post_custom_values( "{$project_prefix}post_locations", $post_id ); 

в следующие условные линии:

 if( $_POST[ 'wp-preview' ] === 'dopreview' ) { //if it's a preview hit, grab the actual post's data $actual_post_id = wp_get_post_parent_id( $post_id ); $existing_locations = get_post_custom_values( "{$project_prefix}post_locations", $actual_post_id ); } else { //else, go with the actual post $existing_locations = get_post_custom_values( "{$project_prefix}post_locations", $post_id ); } 

Все работает как ожидается в localhost. Хотя иногда, превью попадает в превью preview_id и preview_nonce и т. Д., И не показывает предварительный просмотр, но когда они установлены, предварительный просмотр – именно то, что должно быть.