it-swarm.com.de

Unterscheiden Sie vorgestellte Bilder von Post-Bildern beim Hochladen

Ich möchte das vorgestellte Bild von Post-Bildern unterscheiden.

Es ist geplant, dem vorgestellten Bild mehrere Größen zuzuweisen, aber für die Bilder, die sich im Post befinden/mit dem Post verbunden sind, werden nur die Standardgrößen benötigt.

Ich weiß, dass ich intermediate_image_sizes verwenden kann, um zu filtern, welche benutzerdefinierten Beitragstypen welchen Bildgrößen zugewiesen werden.

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

Ich möchte dem Featured Image jedoch nur mehrere benutzerdefinierte Größen zuweisen und alle Posts, die in die TinyMCE-Standardgrößen hochgeladen werden (Miniaturansicht, Mittel, Groß, Voll), belassen.

5
Howdy_McGee

Sie können dies tun, indem Sie den Metawert für _thumbnail_id filtern.

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

Das Wiederherstellen der Miniaturansichten ist nur ein Fall des Erzeugens und Aktualisierens der Anhangsmetadaten, sodass Sie den gewünschten Effekt erzielen sollten, wenn Sie das ausgewählte Bild ändern.

Dies funktioniert beim Hochladen, aber auch, wenn das vorgestellte Bild geändert wird. Außerdem werden die Thumbnails für das alte Thumbnails neu generiert, sodass es wieder wie ein normales Bild mit den normalen Größen aussieht.

Der Grund für die Verwendung der Hooks add_post_metadata und update_post_metadata ist, dass wir Zugriff auf den aktuellen Wert before haben, der in der Datenbank aktualisiert wird.

NOTEEs gibt keinen wirklichen Unterschied zwischen dem Popup zum Hinzufügen von Medien für das ausgewählte Bild oder den Editor. Diese Links öffnen das Popup nur in einem anderen Status, sodass nicht einfach festgestellt werden kann, welcher Status angefordert wurde (ausgewähltes Bild oder Editor) ), wenn Bilder hochgeladen werden, daher der oben gezeigte Ansatz.

UPDATEIch habe eine Funktion hinzugefügt, die Sie aufrufen können, um Sätze von generierten Miniaturansichten für einen Anhang zu löschen. Sie würden dies aufrufen, bevor Sie neue Metadaten für Anhänge generieren. Sie können sogar die Bildgrößen filtern, die entfernt werden, oder die Funktion so ändern, dass Sie sie als Argument übergeben können.

4
sanchothefat

sie können dies auch versuchen

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. in diesem Skript füge ich einem Feature-Image-Link einen Ajax-Aufruf hinzu, mit dem ich benachrichtigt werde, dass ein Benutzer ein ausgewähltes Bild hochlädt
  2. ich stelle ein Post-Meta ein, wenn der Benutzer ein ausgewähltes Bild hochlädt und dieses Post-Meta zur bedingten Überprüfung verwendet, um bestimmte Größen für ein ausgewähltes Bild zu generieren
2
Ravinder Kumar