Diferenciar la imagen destacada de las imágenes publicadas al subirlas

5

Quiero diferenciar la imagen destacada de las imágenes post.

El plan es dar a la Imagen Destacada múltiples tamaños, pero las imágenes dentro / conectadas a la publicación solo necesitan los tamaños predeterminados.

Sé que puedo usar intermediate_image_sizes para filtrar qué tipos de publicaciones personalizadas se asignan a qué tamaños de imagen, así:

/** Don't Make Extra Sizes **/
function post_type_sizes( $image_sizes ){
    $post_type_size_array = array('icon', 'med-thumb', 'large', 'full');
    $post_image_sizes = array('thumbnail', 'medium', 'large', 'full');

    if( isset($_REQUEST['post_id']) && 'cpt_test' === get_post_type($_REQUEST['post_id']) )
        return $post_type_size_array;
    else
        return $post_image_sizes;

    return $image_sizes;
}
add_filter('intermediate_image_sizes', 'post_type_sizes', 999 ); 

Pero solo quiero dar varios tamaños personalizados a la imagen destacada y dejar cualquier publicación que se cargue en los tamaños predeterminados de TinyMCE (miniatura, mediana, grande, completa).

    
pregunta Howdy_McGee 21.02.2014 - 16:02

2 respuestas

4

Puedes hacerlo filtrando el valor meta para _thumbnail_id .

add_filter( 'update_post_metadata', 'generate_featured_image_sizes', 10, 5 );
add_filter( 'add_post_metadata', 'generate_featured_image_sizes', 10, 5 );

function generate_featured_image_sizes( $check, $object_id, $meta_key, $meta_value, $unique_or_prev ) {
    if ( $meta_key == '_thumbnail_id' ) {

        // regenerate previous featured image thumbs if it exists
        if ( false !== ( $prev_thumb_id = get_post_meta( $object_id, '_thumbnail_id', true ) ) ) {
            $prev_new_metadata = wp_generate_attachment_metadata( $prev_thumb_id, get_attached_file( $prev_thumb_id ) );
            if ( ! is_wp_error( $prev_new_metadata ) )
                wp_update_attachment_metadata( $prev_thumb_id, $prev_new_metadata );
        }

                    // remove all normal image sizes before we add our filter
                    cleanup_attachment_images( $meta_value );

        // filter image sizes for featured
        add_filter( 'intermediate_image_sizes', 'featured_image_sizes', 9999 );

        // regenerate thumbnails for featured
        $new_metadata = wp_generate_attachment_metadata( $meta_value, get_attached_file( $meta_value ) );
        if ( ! is_wp_error( $new_metadata ) )
            wp_update_attachment_metadata( $meta_value, $new_metadata );

                    // remove featured sizes from previous featured image
                    if ( isset( $prev_thumb_id ) && $prev_thumb_id )
                        cleanup_attachment_images( $prev_thumb_id );

        // tidy up
        remove_filter( 'intermediate_image_sizes', 'featured_image_sizes', 9999 );
    }

    return $check;
}

function featured_image_sizes( $sizes ) {
    return array( 'large', 'featured', 'slider' );
}

function cleanup_attachment_images( $attachment_id ) {
    $uploadpath = wp_upload_dir();
    $intermediate_sizes = array();
    foreach ( get_intermediate_image_sizes() as $size ) {
        if ( $intermediate = image_get_intermediate_size( $attachment_id, $size ) )
            $intermediate_sizes[] = $intermediate;
    }
    // remove intermediate and backup images if there are any
    foreach ( $intermediate_sizes as $intermediate ) {
        /** This filter is documented in wp-admin/custom-header.php */
        $intermediate_file = apply_filters( 'wp_delete_file', $intermediate[ 'path' ] );
        @ unlink( path_join( $uploadpath[ 'basedir' ], $intermediate_file ) );
    }
}

La recreación de las miniaturas es solo un caso de generación y actualización de los metadatos del archivo adjunto, por lo que al regenerar cada vez que se modifica la imagen mostrada, debe obtener el efecto deseado.

Esto funcionará en la carga pero también cuando se cambie la imagen mostrada. Además, volverá a generar los pulgares para la miniatura anterior, por lo que es como una imagen normal con los tamaños normales nuevamente.

La razón para usar los ganchos add_post_metadata y update_post_metadata es para que tengamos acceso al valor actual anterior que se actualiza en la base de datos.

NOTA No hay una diferencia real entre la ventana emergente de agregar medios para la imagen destacada o el editor, esos enlaces simplemente abren la ventana emergente en un estado diferente, por lo que no hay una manera fácil de saber qué estado se solicitó (imagen destacada o editor) cuando se cargan las imágenes. De ahí el enfoque que he mostrado arriba.

ACTUALIZACIÓN Agregué una función a la que podría llamar para eliminar los conjuntos de miniaturas generadas para un archivo adjunto. Llamarías a esto antes de generar nuevos metadatos adjuntos. Incluso podría filtrar los tamaños de imagen que elimina o modificar la función para que pueda pasarlos como un argumento.

    
respondido por el sanchothefat 27.02.2014 - 11:39
2

También puedes probar esto

function post_type_sizes( $image_sizes ){

    $feature_image_sizes = array('thumbnail');

    // checking for feature image uploading or not
    if( isset($_REQUEST['post_id']) && 'post' === get_post_type($_REQUEST['post_id']) && get_post_meta( $_REQUEST['post_id'], 'feature_image_uploading', true ) ){
        update_post_meta( $_POST['post_id'],'feature_image_uploading', false );
        return $feature_image_sizes;
    }

    return $image_sizes;
}
add_filter('intermediate_image_sizes', 'post_type_sizes', 999 ); 

add_action('admin_footer', 'monksinc_notify_feature_image_event', 9999 );
function monksinc_notify_feature_image_event(){

    global $pagenow, $post;

    if( 'post.php' !== $pagenow && 'post' !== get_post_type( $post->ID ) )
        return;

    ?>
    <script>
        (function(){
            jQuery('#set-post-thumbnail').click(function(e){
                e.preventDefault();
                jQuery.post(
                    ajaxurl,
                    { action: 'set_post_thumbnail_notify', post_id: jQuery('#post_ID').val() },
                    function( response ){

                        console.log(response);
                    }
                );
            });
        })();
    </script>
    <?php
}

add_action( 'wp_ajax_set_post_thumbnail_notify', 'set_post_thumbnail_notify_callback' );
function set_post_thumbnail_notify_callback(){

    $result = array( 'status'=> 'fail'  );

    if( isset( $_POST ) && 'set_post_thumbnail_notify' === $_POST['action'] && '' !== $_POST['post_id'] ){
        update_post_meta( $_POST['post_id'],'feature_image_uploading', true );
        $result = array( 'status'=> 'success' );
    }

    echo json_encode($result);
    die();
}
  1. en este script, estoy agregando una llamada ajax al enlace de imagen de la función que me notifica que el usuario está cargando una imagen destacada
  2. estoy configurando un meta de publicación cuando el usuario carga una imagen destacada y utilizo esta meta de verificación posterior para generar tamaños específicos para la imagen destacada
respondido por el Ravinder Kumar 27.02.2014 - 23:21

Lea otras preguntas en las etiquetas