Несколько мета-значений для одного и того же мета-ключа, добавленного при нажатии кнопки "Предварительный просмотр изменений", но не при сохранении или обновлении записи


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

<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 даже при сохранении.

Как я могу прекратить добавлять мета-значение при Предварительном просмотре изменений попадании?

Author: Mayeenul Islam, 2015-10-19

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 и т. Д. И не отображается предварительный просмотр, но когда они установлены, предварительный просмотр именно такой, каким он должен быть.

 2
Author: Mayeenul Islam, 2015-10-27 12:52:31