it-swarm-pt.tech

Como faço para salvar metadados apenas para um tipo de postagem personalizado específico?

Estou tentando configurar um tipo de post personalizado seguindo este tutorial . No entanto, estou um pouco confuso sobre como/onde implementar update_post_meta(). O tutorial sugere esse padrão:

add_action('save_post', 'save_my_metadata');

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

O que funciona, mas tem o infeliz efeito de adicionar esses metadados a cada post, seja ele pertencente a esse tipo personalizado ou não.

Eu coloquei o acima em functions.php e estou adivinhando que pode ser parte do problema. Acho que preciso restringir a ação 'save_post' para acionar apenas as postagens do meu tipo personalizado.

15
Bobby Jack
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']);
}

Isso deve funcionar. Basta substituir "your_post_type" pelo nome do tipo de postagem. Além disso, pouco fato conhecido: o hook 'save_post' passa o ID da postagem como um argumento.

EDITAR

Eu atualizei a função para refletir o comentário de Jan. Obrigado Jan!

16
John P Bloch

Se você quiser lidar com vários tipos de post, eu recomendaria uma instrução de switch básica:

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;
    }
}

Os casos são basicamente os mesmos de if($post->post_type) == 'post_type_1') {}, mas não exigem vários blocos if-else. O bloco default no switch trata de casos em que o tipo de postagem não está em seu conjunto personalizado.

4
EAMann

@John P Bloch e @EAMann já deram ótimas respostas, então o meu também é:

  1. Considerar prefixando suas meta_keys com um sublinhado. Ao fazer isso, oculta-os da lista de campos personalizados exibidos em uma tela de edição de postagens, ou seja,.

    função save_my_metadata ($ post_id, $ post = false) {
     if ($ post-> post_type == 'your_post_type') 
     update_post_meta ($ post_id, 'meus_metadados', $ _POST ['meus_metadados' ]); 
    } 
    
    Obviamente, isso significa que você precisa de um metabox personalizado para poder editar os campos também. Aqui está uma tela de edição para contexto:



  2. Outra coisa que você pode fazer é adicionar seu próprio gancho para facilitar a gravação de tipos de postagem específicos, ou seja, o gancho pode ser "save_{$post_type}_post"; para um tipo de post movie, seria save_movie_post. Aqui está o que você teria que adicionar ao arquivo functions.php do seu tema ou em um plug-in em algum lugar:

     add_action ('save_post', 'save_custom_post_type_posts', 10,2); 
     função save_custom_post_type_posts ($ post_id, $ post = false) {
     do_action ("salvar _ {$ pós- > post_type} _post "); 
    } 
    
    Com isso, você pode reescrever seu código original assim (incluindo o truque de sublinhado do # 1 acima):

     add_action ('save_my_postype_post', 'save_my_postype_metadata', 10,2); 
     função save_my_postype_metadata ($ post_id, $ post) {
     update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']); 
    }
4
MikeSchinkel

Pessoalmente, eu prefiro seguir o padrão abaixo para adicionar meta manipuladores personalizados para postar tipos. Com o abaixo, você pode adicionar o suporte meta a um tipo de postagem apenas adicionando a chave de suporte ('subtítulo' no exemplo abaixo) à matriz de suporte para o tipo de postagem chamando 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'));

Espero que algo assim seja logo adicionado ao núcleo.

1
prettyboymp

Eu não consigo fazer isso funcionar - não sei o que estou fazendo errado - mas estou tentando usar hook post_updated em vez do save_post - como eu quero que esses valores sejam inseridos depois que o post foi atualizado para que eu possa recuperar os valores dos outros campos personalizados .

 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
jrutter

Antes da atualização, verifique se a postagem atual é do seu tipo de postagem. Isso garantiria que você não o salvaria para todas as postagens.

Você deve verificar também a entrada (que está faltando no seu exemplo) e, ao lado disso, lembre-se de que você só pode adicionar a ação quando esse tipo de postagem estiver ativo. Se esse for o caso, você não precisará verificar esse tipo de postagem posteriormente.

Obtendo um tipo de postagens: get_post_type() ou $post->post_type;

0
hakre