Guardar medios en WordPress - ¿Qué hook se dispara al guardar una imagen?

30 may 2012, 16:15:38
Vistas: 15.8K
Votos: 8

Hola,

Estoy intentando ejecutar código que se active cuando guardo una imagen en la biblioteca de medios. Como es habitual, selecciono el archivo, lo subo, ingreso los metadatos y luego hago clic en guardar. En este punto quiero engancharme a WordPress y redirigir a otra URL. Esto es para que, en lugar de llevar al usuario a una lista de medios subidos, pueda llevarlos a una herramienta de manipulación de imágenes.

Encontré un filtro que se dispara justo antes de que se creen los metadatos, pero ¿no hay nada para cuando se guarda el archivo?

Gracias,

2
Comentarios

Prueba a usar el solucionador de problemas de Hooks de Hikari. Me ha ayudado a encontrar el hook que necesitaba para una acción personalizada.

cpilko cpilko
30 may 2012 18:23:18

Richard, ¿estás seguro de que ninguna de las respuestas proporcionadas a tus preguntas es la correcta? Por favor, revisa las preguntas frecuentes, especialmente la sección "¿Cómo hago preguntas aquí?"...

brasofilo brasofilo
29 jun 2012 08:12:32
Todas las respuestas a la pregunta 3
0

Actualmente no hay ningún hook que se dispare después de la carga de archivos multimedia, al menos que yo sepa. El problema con los hooks disponibles durante el proceso de carga y guardado de archivos y datos multimedia es que están limitados a una porción del proceso, por lo que usar cualquiera de ellos no es confiable. Por ejemplo, add_attachment se dispara después de que un nuevo archivo completa el proceso de carga, pero antes de editar los metadatos del archivo. Si intentas redirigir al usuario en este punto, interrumpirá el proceso de carga para archivos subsecuentes si hay más de un archivo en la carga, aunque podría ser adecuado para otro tipo de acciones.

Para tu caso específico, sin embargo, puedes engancharte al action hook admin_init y verificar si estamos en la pantalla de la biblioteca multimedia después de haber subido o editado un archivo. Sabemos esto guardando el número de adjuntos antes de la carga y comparándolo con el número de adjuntos después de la carga:

add_action('admin_init', 'redirect_after_media_save');
function redirect_after_media_save() {

    global $pagenow;

    // cuando visitamos la pantalla de carga, guardamos el número de adjuntos
    if ( $pagenow == 'media-new.php' ) {
        $attachments_before = array_sum((array)wp_count_attachments());
        update_option('count_attach_before', $attachments_before);
    }

    if ( $pagenow == 'upload.php' ) { // estamos en la página de la biblioteca multimedia

        // obtenemos el conteo de adjuntos antes y después de la carga
        $attachments_before = get_option('count_attach_before');
        $attachments_after = array_sum((array)wp_count_attachments());

        if ( 
            // hay nuevos archivos cargados
            ( wp_get_referer() == admin_url('media-new.php') && $attachments_after > $attachments_before )
            ||
            // o acabamos de editar un archivo multimedia
            isset($_GET['posted'])
        ) {
                // redirigimos a la ubicación deseada
                wp_redirect(admin_url());
                exit;
        }
    }
}

Este código redirigirá al usuario al escritorio después de una carga o edición exitosa de un archivo multimedia, puedes ajustarlo según tus necesidades. También podrías elegir un hook de administración diferente a admin_init si deseas realizar tareas distintas a la redirección.

19 nov 2012 01:46:01
0

Quizás una respuesta un poco tardía, pero tuve un escenario similar y quería compartir la solución.

En el archivo functions.php del tema (también funcionaría creando un plugin), utilicé el hook 'add_attachment' para crear un nuevo post (tipo de contenido personalizado 'talk') basado en cada archivo subido. Por supuesto, el ejemplo podría pulirse un poco, pero esto funcionó para procesar cada archivo adjunto de medios que se subía.

<?php
function cpt_from_attachment($attachment_ID)
{          
    global $current_user;
    get_currentuserinfo();

    $attachment_post = get_post( $attachment_ID );

    $type = get_post_mime_type($attachment_ID);
    if(strpos($type, 'audio') === 0)
    {
        // Crear nuevo objeto de post personalizado solo para archivos de audio
        $my_post = array(
          'post_title'    => $attachment_post->post_title,
          'post_content'  => $attachment_post->post_content,
          'post_type'   => 'talk',
          'post_author'   => $current_user->ID
        );

        // Insertar el post personalizado en la base de datos
        $post_id = wp_insert_post( $my_post );
        wp_update_post( array(
                'ID' => $attachment_ID ,
                'post_parent' => $post_id
            )
        );
        wp_set_post_terms( $post_id, get_post_meta($attachment_ID, "artist", true), 'speaker' );
    }
}

add_action("add_attachment", 'cpt_from_attachment');
2 jul 2014 23:25:17
0

Parece que no hay una acción al guardar medios, pero hay un filtro. Desafortunadamente, eso significa que puedes hacer algunas cosas, pero no puedes mostrar nada directamente o romperás el filtro.

add_filter('attachment_fields_to_save', 'attachment_stuff');
function attachment_stuff($stuff){

    //Haz cosas aquí, pero no muestres nada directamente o romperás el filtro.

    return $stuff;
}

$stuff es en realidad un array de campos utilizados por la página del elemento multimedia. Podrías intentar otras cosas como engancharte a un hook más genérico del panel de administración y verificar el valor $_GET['action'] de 'editattachment'.

27 jun 2012 02:24:53