¿Cómo guardo metadatos solo para un tipo de publicación personalizada específica?

14

Estoy tratando de configurar un tipo de publicación personalizada siguiendo a este tutorial . Sin embargo, estoy un poco confundido sobre cómo / dónde implementar update_post_meta() . El tutorial sugiere este patrón:

add_action('save_post', 'save_my_metadata');

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

Lo que funciona, pero tiene el desafortunado efecto de agregar esos metadatos a cada publicación, ya sea que pertenezca a este tipo personalizado o no.

Puse lo anterior en functions.php y supongo que eso podría ser parte del problema. Supongo que necesito restringir la acción 'save_post' para desencadenar solo las publicaciones de mi tipo personalizado.

    
pregunta Bobby Jack 17.08.2010 - 15:41

6 respuestas

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

Eso debería funcionar. Simplemente reemplaza 'your_post_type' con el nombre del tipo de publicación. Además, un hecho poco conocido: el enlace 'save_post' pasa la ID de la publicación como un argumento.

EDIT

Actualicé la función para reflejar el comentario de Jan. Gracias Jan!

    
respondido por el John P Bloch 17.08.2010 - 16:02
4

Si desea manejar múltiples tipos de publicaciones, recomendaría una declaración de cambio 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;
    }
}

Los casos son básicamente los mismos que if($post->post_type) == 'post_type_1') {} , pero no requieren varios bloques if-else. El bloque default en el switch maneja los casos donde el tipo de publicación no está en su conjunto personalizado.

    
respondido por el EAMann 17.08.2010 - 16:48
4

@John P Bloch y @EAMann ya han dado excelentes respuestas, por lo que la mía es además:

  1. Considera prefijar tus meta_keys con un guión bajo . Al hacerlo, los oculta de la lista de campos personalizados mostrados en una pantalla de edición de publicación, es decir,

    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, eso significa que necesitarías un metabox personalizado para poder editar los campos también. Aquí hay una pantalla de edición para el contexto:



  2. Otra cosa que podría hacer es agregar su propio enlace para facilitar el guardado de tipos de publicación específicos, es decir, su enlace podría ser " save_{$post_type}_post "; para un tipo de publicación movie sería save_movie_post . Esto es lo que tendría que agregar al archivo functions.php de su tema o en un complemento en alguna parte:

    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");
    }
    
    Con eso, podría volver a escribir su código original así (incluido el truco de subrayado del # 1 anterior):

    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']);
    }
respondido por el MikeSchinkel 17.08.2010 - 22:03
1

Personalmente, prefiero seguir el patrón de abajo para agregar meta manejadores personalizados a los tipos de publicación. Con lo siguiente, puede agregar el soporte meta a un tipo de publicación simplemente agregando la clave de soporte ('subtítulo' en el ejemplo a continuación) a la matriz de soporte para el tipo de publicación llamando a 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'));

Esperemos que algo como esto pronto se agregue al núcleo.

    
respondido por el prettyboymp 18.08.2010 - 21:55
0

La actualización previa comprueba si la publicación actual es o no de su tipo de publicación. Eso aseguraría que no lo guardes para todas las publicaciones.

También debe verificar la entrada (que falta en su ejemplo) y, junto a eso, tenga en cuenta que es posible que solo agregue la acción cuando ese post-tipo esté activo. Si ese es el caso, no necesita verificar ese tipo de publicación más adelante.

Obtener un tipo de publicaciones: get_post_type() o $post->post_type;

    
respondido por el hakre 17.08.2010 - 15:49
0

No puedo hacer que esto funcione, no estoy seguro de lo que estoy haciendo mal, pero estoy tratando de usar el enlace post_updated en lugar de save_post, ya que quiero que estos valores se inserten después de que se haya actualizado la publicación para poder recuperar los valores del otros 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');
    
respondido por el jrutter 10.04.2011 - 14:34

Lea otras preguntas en las etiquetas