william
  • 0
Новичок

Очистка метаданных сообщения при автосохранении

  • 0

Для начала я использую этот БОЛЬШОЙ ответ для создания настраиваемых типов сообщений, а также для пользовательского способа вставки этих типов сообщений на другие страницы, вы можете просмотреть этот ответ здесь: Пользовательское поле/мета, заполненное выпадающим списком существующих сообщений?

Однако я столкнулся с проблемой, когда WordPress автоматически сохраняет себя, он очищает все метаданные, которые я поместил в формы.

ПРИМЕР:

Я выбираю 3 выпадающих списка, которые я хочу, из своего метабокса и нажимаю «Обновить».

Страница перезагружается, и 3 варианта по-прежнему выбраны. В phpMyAdmin я могу найти метаданные и увидеть массив на месте, как и должно быть.

Теперь я жду, пока wordpress автоматически сохранится.

Как только это произойдет, я могу либо обновить страницу (не обновить, просто обновить), и метаданные будут потеряны, либо я могу найти метаданные в phpMyAdmin, и они ничего не отобразят (то есть: они исчезли).

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

Последнее замечание: если вы скопируете и вставите код Майка в functions.php, вы сможете очень легко воссоздать мою ошибку (в wordpress 3.1).

Share
  1. Используя действие сохранения поста, я проверяю состояние:

    <?php
    
    add_action('save_post' ,'my_save_postdata');
    
    function my_save_postdata ( $post_id )
    {
        if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
            return $post_id;
        }
    
        // logic
    
    }
    
    • 0
    • Хотя ваш ответ, кажется, работает хорошо, я собираюсь придерживаться своего ответа, потому что я предпочитаю получать доступ к данным публикации из $postarr, а не из фактического получения $_POST. Я не знаю, действительно ли в любом случае ЛУЧШЕ, но я заставил это работать так, как я этого хочу, так что я придерживаюсь этого 🙂

      • 0
    • Технически, использование фильтра для выполнения подобного действия не является целью фильтров. Фильтр предназначен для изменения переданных данных и возврата измененных данных для использования в последующих действиях. Действие должно использоваться при выполнении операции. В этом случае подходят действия ‘save_post’ или ‘save_post_’. Они вызываются только в том случае, если все остальные операции, связанные с сохранением нового поста, выполнены успешно.

      • 0
  2. Ну, как всегда, я чувствую себя дураком, но после нескольких часов поиска в Интернете и увидев, что у многих людей возникает этот вопрос, и я нигде не могу найти ответ, я думаю, я не НАСТОЛЬКО медленный!

    важный код — это что-то вроде этих строк:

    add_filter('wp_insert_post_data',array(__CLASS__,'filter_wp_insert_post_data'),10,2);
    static function filter_wp_insert_post_data($data, $postarr) {
         update_post_meta($postarr['ID'],'_offices',$postarr['offices']);
         return $data;
    }
    

    что происходит, так это то, что этот код запускается, но нет $postarr[‘offices’], поэтому вместо этого он вставляет пустые данные! поэтому быстрое решение этого:

    if(isset($postarr['offices']))
    update_post_meta($postarr['ID'],'_offices',$postarr['offices']);
    

    Если данные, которые вы хотите вставить, не установлены, они не будут обновляться!

    Я не уверен, почему WordPress не передает эти переменные при автоматическом сохранении, но делает это при реальном сохранении, но в любом случае это работает, так что я счастлив!

    • 0

Оставить ответ

You must login to add an answer.