Як зберегти метадані лише для певного спеціального типу публікації?


16

Я намагаюся налаштувати спеціальний тип публікації, слідуючи цьому посібнику . Однак я трохи розгублений, як / де здійснити 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" лише тригером для публікацій мого користувацького типу.


Приємне запитання, Боббі Джек, але чи можу я попросити вас переказати це питання на кшталт "Як зберегти метадані лише для конкретних спеціальних типів публікації"; як і ваш заголовок, занадто загальне, щоб люди могли його визнати, коли шукають рішення цієї проблеми.
MikeSchinkel

@Mike: зроблено (повністю згоден з вашою пропозицією, дякую!)
Боббі Джек

Відповіді:


18
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' передає ідентифікатор повідомлення як аргумент.

EDIT

Я оновив функцію, щоб відобразити коментар Яна. Дякую Яну!


1
Він навіть додає саму публікацію як другий аргумент , тому вам не потрібно використовувати глобальну змінну.
Ян Фабрі

Це рішення справді спрацьовує ... Раніше я його використовував у клієнтських проектах із великим успіхом.
EAMann

Блискуче - працює як шарм. І я припускаю, що було б сенс робити "if ($ post-> post_type == 'animal') {update_post_meta ($ ID," number_of_legs ", $ _POST ['number_of_legs']);} else if ($ post-> post_type == 'транспортний засіб') {update_post_meta ($ ID, "number_of_wheels", $ _POST ['number_of_wheels'])}} ... і т. д. ... для обробки декількох типів публікацій? погані можливості форматування коментарів!)
Боббі Джек

Насправді, з кількома типами публікацій, я б рекомендував використовувати замість цього оператор. Менша розмітка, швидша продуктивність, простіше додавати справи в майбутньому.
EAMann

@EAMann - так, на півдорозі написав це, я зрозумів, що перехід буде кращим, але коментарі - не ідеальне місце для початку редагування коду, тому я лінувався;)
Боббі Джек

4

Якщо ви хочете обробляти декілька типів публікацій, я рекомендую основний оператор переключення:

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Блок в комутаторі обробляє випадки , коли тип пост не в призначеному для користувача наборі.


4

@John P Bloch та @EAMann вже дали чудові відповіді, тому моя додатково:

  1. Подумайте про префіксацію мета-ключів підкресленням . Це приховує їх зі списку користувацьких полів, що відображаються на екрані редагування публікацій, тобто

    функція save_my_metadata ($ post_id, $ post = false) {
       if ($ 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файлу теми чи десь у плагіні:

    добавлення ('save_post', 'save_custom_post_type_posts', 10,2);
    функція save_custom_post_type_posts ($ post_id, $ post = false) {
       dogery ("зберегти _ {$ post-> post_type} _post");
    }
    
    З цим ви зможете переписати свій оригінальний код так (включаючи трюк підкреслення з №1 вище):

    добавлення ('save_my_postype_post', 'save_my_postype_metadata', 10,2);
    функція save_my_postype_metadata ($ post_id, $ post) {
        update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }

1

Особисто я вважаю за краще дотримуватися наведеної нижче схеми для додавання користувацьких мета-обробників до типів публікацій. За допомогою наведеного нижче ви можете додати мета-підтримку до типу публікації, просто додавши ключ підтримки ('субтитр' у прикладі нижче) до масиву підтримки типу публікації, зателефонувавши add_post_type_support ('my_post_type', 'subtyl');

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

Перед оновленням перевірте, чи є поточна публікація вашого типу публікації. Це гарантує, що ви не збережете його для всіх публікацій.

Ви також повинні перевірити вхідні дані (цього немає у вашому прикладі), а поруч із цим пам’ятайте, що ви можете додавати дії лише тоді, коли цей пост-тип активний. Якщо це так, вам не потрібно буде потім перевіряти цей пост.

Отримання типу допису: get_post_type()або$post->post_type;


0

Я не можу змусити це працювати - не впевнений, що я роблю неправильно - але я намагаюся використовувати пост-оновлений гак замість 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');

Не забудьте - я це зрозумів!
jrutter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.