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

14

Estou tentando configurar um tipo de postagem personalizado após 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 efeito infeliz de adicionar esses metadados a cada postagem, independentemente de pertencer ou não a esse tipo personalizado.

Coloquei o acima em functions.php e acredito que isso possa fazer parte do problema. Acho que preciso restringir a ação 'save_post' para acionar apenas as postagens do meu tipo personalizado.

    
por Bobby Jack 17.08.2010 / 15:41

6 respostas

16
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. Apenas substitua "your_post_type" pelo nome do tipo de postagem. Além disso, pouco fato conhecido: o hook 'save_post' passa o ID do post como um argumento.

EDITAR

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

    
por John P Bloch 17.08.2010 / 16:02
4

Se você quiser lidar com vários tipos de postagens, recomendo uma instrução básica de 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;
    }
}

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

    
por EAMann 17.08.2010 / 16:48
4

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

  1. Considere prefixar suas meta_keys com um sublinhado . Fazer isso os oculta da lista de campos personalizados exibidos em uma tela de edição de postagens, ou seja,

    function save_my_metadata($post_id,$post=false) {
       if($post->post_type=='your_post_type')
          update_post_meta($post_id, '_my_metadata', $_POST['my_metadata']);
    }
    
    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 o 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% 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);
    function save_custom_post_type_posts($post_id,$post=false) {
       do_action("save_{$post->post_type}_post");
    }
    
    Com isso você pode então 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);
    function save_my_postype_metadata($post_id,$post) {
        update_post_meta($post_id, '_my_metadata', $_POST['my_metadata']);
    }
por MikeSchinkel 17.08.2010 / 22:03
1

Pessoalmente, 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 adicionado em breve ao núcleo.

    
por prettyboymp 18.08.2010 / 21:55
0

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

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

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

    
por hakre 17.08.2010 / 15:49
0

Eu não consigo fazer isso funcionar - não sei o que estou fazendo errado - mas estou tentando usar o gancho post_updated em vez do save_post - como eu quero que esses valores sejam inseridos após a postagem ter sido atualizada para que eu possa recuperar os valores do 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');
    
por jrutter 10.04.2011 / 14:34