Diferencie a imagem em destaque das imagens postadas após o upload

5

Eu quero diferenciar a imagem em destaque das imagens postadas.

O plano é fornecer vários tamanhos para Imagens em destaque, mas as imagens internas / conectadas à postagem precisam apenas dos tamanhos padrão.

Eu sei que posso usar intermediate_image_sizes para filtrar quais tipos de postagem personalizados são atribuídos a quais tamanhos de imagem, assim:

/** 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 ); 

Mas só quero dar vários tamanhos personalizados à Imagem em destaque e deixar qualquer postagem enviada para os tamanhos padrão do TinyMCE (miniatura, médio, grande e completo).

    
por Howdy_McGee 21.02.2014 / 16:02

2 respostas

4

Você pode fazer isso filtrando o 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 ) );
    }
}

Recriar as miniaturas é apenas um caso de gerar e atualizar os metadados do anexo, portanto, regenerando sempre que a imagem em destaque for alterada, você deve obter o efeito desejado.

Isso funcionará no upload, mas também quando a imagem em destaque for alterada. Além disso, ele regenera os polegares para a miniatura antiga, de modo que é como uma imagem normal com os tamanhos normais novamente.

A razão para usar os ganchos add_post_metadata e update_post_metadata é para que tenhamos acesso ao valor atual antes que seja atualizado no banco de dados.

NOTA Não há diferença real entre o pop-up add media para a imagem em destaque ou o editor, esses links apenas abrem o pop-up em um estado diferente, então não há maneira fácil de saber qual estado foi solicitado (imagem em destaque ou editor) quando as imagens estão sendo carregadas, daí a abordagem que mostrei acima.

UPDATE Eu adicionei uma função que você poderia chamar para excluir conjuntos de miniaturas geradas para um anexo. Você chamaria isso antes de gerar novos metadados de anexos. Você pode até mesmo filtrar os tamanhos das imagens que remove ou modificar a função, para que você possa passá-los como um argumento.

    
por sanchothefat 27.02.2014 / 11:39
2

você também pode tentar isso

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. neste script, estou adicionando uma chamada do ajax ao link da imagem do recurso que me avisa que o usuário está fazendo o upload de uma imagem em destaque
  2. Estou definindo uma meta meta quando o usuário faz upload da imagem em destaque e usa essa meta postagem para verificação condicional para gerar tamanhos específicos para a imagem em destaque
por Ravinder Kumar 27.02.2014 / 23:21