Несколько мета-значений для одного и того же мета-ключа, добавленного при нажатии кнопки "Предварительный просмотр изменений", но не при сохранении или обновлении записи
Я беру несколько значений местоположения с каждым сообщением, так что это массив (всегда). Мое поле мета-формы сообщения выглядит так:
<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()
встроенный. Но...
<?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 );
При сохранении или обновлении записи мета-поле местоположения работает так, как ожидалось. Но если оператор ввода данных нажмет кнопку Предварительный просмотр изменений, add_post_meta()
срабатывает, даже в истинных условных скобках, и добавляет повторяющиеся записи, Я не знаю, как!!!: o
Затем я добавил true
к последнему параметру (строка № 40), чтобы сделать значение уникальным, чтобы я мог остановить повторяющиеся записи. Но добавление true
перестало добавлять какое-либо новое значение в meta_key
даже при сохранении.
Как я могу прекратить добавлять мета-значение при Предварительном просмотре изменений попадании?
1 answers
На самом деле я бы хотел получить ответ от @ialocin, потому что он подсказал мне способ. Но поскольку код немного длинноват для поля комментария, я публикую его здесь в качестве ответа. Но я бы с удовольствием принял ответ, более соответствующий ситуации:
После предложения @ialocin я понял, что $post_id
не был точным для Изменений предварительного просмотра , поэтому $existing_locations
не получал правильную информацию о бд. Теперь я изменил следующую строку:
$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
и т. Д. И не отображается предварительный просмотр, но когда они установлены, предварительный просмотр именно такой, каким он должен быть.