travisnorthcutt
  • 0
Гуру

Как сохранить метаданные только для определенного пользовательского типа сообщений?

  • 0

Я пытаюсь настроить пользовательский тип сообщения, следуя этому руководству. Однако я немного смущен тем, как/где реализовать update_post_meta() . Учебник предлагает этот шаблон:

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

Что действительно работает, но имеет неприятный эффект добавления этих метаданных к каждому сообщению, независимо от того, принадлежит ли оно к этому пользовательскому типу или нет.

Я вставил вышеизложенное functions.php и предполагаю, что это может быть частью проблемы. Я предполагаю, что мне нужно ограничить действие «save_post», чтобы оно срабатывало только для сообщений моего пользовательского типа.

Share
  1. Хороший вопрос, Бобби Джек, но могу ли я попросить вас переименовать вопрос на что-то вроде «Как сохранить метаданные только для определенных пользовательских типов сообщений»; так как ваш заголовок слишком общий, чтобы люди могли его распознать, когда ищут решение этой проблемы.

    • 0
  2. function save_my_metadata($ID = false, $post = false)
    {
        if($post->post_type != 'your_post_type')
            return;
        update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
    }
    

    Это должно сработать. Просто замените your_post_type на название типа записи. Также малоизвестный факт: хук save_post передает ID поста в качестве аргумента.

    РЕДАКТИРОВАТЬ

    Я обновил функцию, чтобы отразить комментарий Яна. Спасибо Ян!

    • 0
  3. Если вы хотите обрабатывать несколько типов сообщений, я бы рекомендовал базовый оператор switch:

    add_action('save_post', 'save_my_metadata');
    
    function save_my_metadata($ID = false, $post = false)
    {
        switch($post->post_type) 
        {
            case 'post_type_1':
                // Do stuff for post type 1
                update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
                break;
            case 'post_type_2':
                // Do stuff for post type 2
                break;
            default:
                return;
        }
    }
    

    Случаи в основном такие же, как и в if($post->post_type) == 'post_type_1') {} случае, но не требуют нескольких блоков if-else. Блок default в переключателе обрабатывает случаи, когда тип записи отсутствует в вашем пользовательском наборе.

    • 0
  4. @John P Bloch и @EAMann уже дали отличные ответы, так что мой вдобавок:

    1. Рассмотрите возможность использования префикса meta_keys с символом подчеркивания. Это скроет их из списка настраиваемых полей, отображаемых на экране редактирования сообщения, т.е.
      функция save_my_metadata($post_id,$post=false) {
         если($post->post_type=='your_post_type')
            update_post_meta($post_id, '_my_metadata', $_POST['my_metadata']);
      }
      

      Очевидно, это означает, что вам понадобится собственный метабокс, чтобы иметь возможность редактировать поля. Вот экран редактирования контекста:

    2. Еще одна вещь, которую вы можете сделать, это добавить свой собственный хук, чтобы упростить сохранение определенных типов сообщений, т.е. ваш хук может быть » save_{$post_type}_post «; для movie типа сообщения это будет save_movie_post . Вот что вам нужно добавить в functions.php файл вашей темы или где-нибудь в плагине:
      add_action('save_post', 'save_custom_post_type_posts',10,2);
      функция save_custom_post_type_posts($post_id,$post=false) {
         do_action("save_{$post->post_type}_post");
      }
      

      После этого вы можете переписать свой исходный код следующим образом (включая трюк с подчеркиванием из # 1 выше):

      add_action('save_my_posttype_post','save_my_postype_metadata',10,2);
      функция save_my_postype_metadata($post_id,$post) {
          update_post_meta($post_id, '_my_metadata', $_POST['my_metadata']);
      }
    • 0
  5. Лично я предпочитаю следовать приведенному ниже шаблону для добавления пользовательских мета-обработчиков к типам сообщений. С помощью приведенного ниже вы можете добавить метаподдержку к типу сообщения, просто добавив ключ support («подзаголовок» в приведенном ниже примере) в массив support для типа сообщения, вызвав add_post_type_support(‘my_post_type’, ‘subtitle’);

    class Subtitle_Meta_Handler {
        public function initialize() {
            add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
            add_action('save_post', array($this, 'update'));
        }
    
        public function add_metabox($post_type, $post)
        {
            if(post_type_supports($post_type, 'subtitle'))
            {
                add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
            }
        }
    
        public function metabox($post)
        {
            $subtitle = get_post_meta($post->ID, 'subtitle', true);
            if(!$subtitle)
            {
                $subtitle = '';
            }
            ?>
            <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
            <?php
            wp_nonce_field('update_subtitle', 'subtitle_nonce');
        }
    
        public function update($post_id)
        {
            if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
                return $post_id;
            }
            if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
                $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
                if(empty($subtitle)) {
                    delete_post_meta($post_id, 'subtitle');
                } else {
                    update_post_meta($post_id, 'subtitle', $subtitle);
                }
            }
        }
    }
    add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));
    

    Надеюсь, что-то подобное скоро будет добавлено в ядро.

    • 0
  6. Перед обновлением проверьте, относится ли текущий пост к вашему типу поста. Это гарантирует, что вы не сохраните его для всех сообщений.

    Вы также должны проверить ввод (который отсутствует в вашем примере), и, кроме того, имейте в виду, что вы можете добавить действие только тогда, когда этот тип записи активен. Если это так, вам не нужно проверять этот тип сообщения позже.

    Получение типа сообщений: get_post_type() или$post->post_type;

    • 0
  7. Я не могу заставить это работать — не уверен, что я делаю неправильно — но я пытаюсь использовать хук post_updated вместо save_post — так как я хочу, чтобы эти значения были вставлены после того, как сообщение было обновлено, чтобы я мог получить значения из других настраиваемых полей.

     function update_meta ($ID = false, $post = false) {
      update_post_meta($ID, 'rest_long', 'Test 1');
      update_post_meta($ID, 'rest_lat', 'Test 2');
    }
    
    add_action('post_updated', 'update_meta');
    
    • 0

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

You must login to add an answer.