web-dev-qa-db-de.com

Neue Bildgrößenversion nur für die Featured Image-Datei

Ich mache mir Sorgen, dass beim Hinzufügen einer neuen Bildgröße zu viele Dateien erstellt werden.

Alle hochgeladenen Dateien erzeugen die neue Größe. Ich benötige eine bestimmte Bildgröße nur für die als Fetured-Bild festgelegte Datei. Gibt es eine Möglichkeit, dies zu tun? .

Die Miniaturansicht , Mittel usw. sind in Ordnung, es ist jedoch nicht erforderlich, die neue Größe für jede Datei zu erstellen.

Ich denke, das sollte gleich nach dem Einstellen des Featured Image funktionieren.

6
Diana

Forschung

Die Frage Filter For Featured Image führte zu dieser Antwort: Wie hakt man update_post_meta und delete_post_meta? .

In Verbindung mit der hier gezeigten feinen globalen Variablen ($_wp_additional_image_sizes): Wie Sie eine Liste aller möglichen Miniaturbildgrößen erhalten, die in einem Thema festgelegt sind , bringen Sie uns zu dem Code, der den Aktionsklick "Als vorgestelltes Bild verwenden" auffängt.

enter image description here


Code

Dieser Code wird bei jedem Klick auf "Als empfohlenes Bild verwenden" ausgelöst. Anschließend werden alle zusätzlichen Bildgrößen durchlaufen und gelöscht, wobei die Standard-WordPress-Größen (Miniaturansicht, Mittel, Groß) beibehalten werden.
Testen Sie diesen Codedurchgehend, bevor Sie LIVE gehen.
GPL-Code. Es wird keine Garantie gewährt. Überprüfen Sie die Kommentare.

/**
    DRAWBACK
    - Setting the Featured Image can be done ONLY ONCE
    -- When first setting the FI, all other attachments intermediate sizes will be deleted
    -- If swapping the FI, the first image's remaining intermediate will be deleted, and the second DON'T HAVE any additional intermediates!

    TODO: Restoring deleted intermediates
    - this post may have an answer: https://wordpress.stackexchange.com/a/8082/12615
*/

add_action( 'added_post_meta', 'wpse_57369_selective_delete_intermediates', 10, 4 );
add_action( 'updated_post_meta', 'wpse_57369_selective_delete_intermediates', 10, 4 );

/**
 * Catches the "Used as featured image" action
*/
function wpse_57369_selective_delete_intermediates( $meta_id, $post_id, $meta_key, $meta_value )
{
    if ( '_thumbnail_id' == $meta_key )
    {
        global $_wp_additional_image_sizes;

       /**
        * The global holds all additional image sizes and contains this:
        * 
           array(
           ['post-thumbnail'] => array(
               ['width'] => 1000
               ['height'] => 288
               ['crop'] => 1
           )
           ['large-feature'] => array(
               ['width'] => 1000
               ['height'] => 288
               ['crop'] => 1
           )
           ['small-feature'] => array(
               ['width'] => 500
               ['height'] => 300
               ['crop'] =>
           )
        )
       */

        // Populate a new array with single values based on the keys of the global
        $all_sizes = array();
        foreach ( $_wp_additional_image_sizes as $key => $value )
        {
            $all_sizes[] = $key;
        }

        // Retrieve all attachments of current post/page/cpt
        $all_attachs = get_children( array(
                'post_parent' => $post_id,
                'post_type' => 'attachment',
                'numberposts' => -1,
                'post_mime_type' => 'image'
            ));

        // Determine upload path
        $uploads   = wp_upload_dir();
        $path_pos  = strpos( $uploads['basedir'], 'wp-content/' ); // start position of the string
        $base_path = substr( $uploads['basedir'], 0, $path_pos);  // path before wp-content, e.g., /etc/public_html/

        // Loop through all attachments
        foreach ( $all_attachs as $key => $value )
        {
            // This is the featured image
            if ( $key == $meta_value)
            {
                wpse_57369_delete_files( $key, $all_sizes, $base_path, 'small-feature' );
            }
            // Rest of attached images
            else
            {
                wpse_57369_delete_files( $key, $all_sizes, $base_path, false );
            }
        }
    }
}

/**
 * Delete all custom intermediates files, except when $keep_size is defined
*/
function wpse_57369_delete_files( $ID, $all_sizes, $base_path, $keep_size=false )
{
    foreach ( $all_sizes as $intermediate )
    {
        /* We need to know the image url [0] and if it exists [3] */
        $the_url = wp_get_attachment_image_src( $ID, $intermediate );

        /* If additional image exist, go ahead */
        if( $the_url[3] )
        {
            // Path of the image to be deleted
            $url_pos  = strpos( $the_url[0], 'wp-content/' );
            $url_end  = substr( $the_url[0], $url_pos);

            // Delete all intermediates
            if ( !$keep_size )
            {
                // loga( $ID . ' - ' . $intermediate, 'delete-me');
                unlink( $base_path . $url_end );
            }

            // Featured image, Selective delete
            else
            {
                // Delete intermediate
                if ( $intermediate != $keep_size )
                {
                    // loga( $ID . ' - ' . $intermediate, 'delete-me');
                    unlink( $base_path . $url_end );                    
                }

                // Keep intermediate, no action needed
                // PROBABLY, RESTORING AN INEXISTENT IMAGE SIZE MUST BE DONE HERE
                else
                {
                    // loga( $ID . ' - ' . $intermediate, 'keep-me');
                }
            } 
        }
    }
}

function loga()
{
    // This is the FireBug FirePHP console call
    // http://www.firephp.org/HQ/Use.html
}

Ergebnis

Ordnerinhalt nach dem Hochladen Bilder, noch kein Feature-Image festgelegt
enter image description here

Ordnerinhalt nach dem Einstellenfondo-restauraciones als Featured Image
enter image description here


Weitere Hinweise

Für den Umgang mit ALLEN zusätzlichen Bildgrößen (WordPress-Standardeinstellungen und benutzerdefiniert) verwenden Sie:

$all_sizes = get_intermediate_image_sizes();

/**
 * $all_images contains all intermediate image sizes, WordPress default and declared custom sizes:
 * 
    array(
        [0] => 'thumbnail'
        [1] => 'medium'
        [2] => 'large'
        [3] => 'post-thumbnail'
        [4] => 'large-feature'
        [5] => 'small-feature'
    )
*/
4
brasofilo

Sie können das vorgestellte Bild src/source abrufen, indem Sie die folgenden Argumente für die Kernfunktion verwenden (wobei $post mit global $post voranstehen sollte):

wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );

Wie man es benutzt

Ich habe ein freies Plugin geschrieben, das auf GitHub verfügbar ist und "Dynamic Image Resize" heißt.

Sie können es kostenlos herunterladen und verwenden.

Funktionscode

Platziere [dynamic_image] in deinem Inhalt. Der Shortcode hat vier Argumente:

  • src Vollständiger Pfad zum Bild in Ihrem Upload-Verzeichnis oder der ID
  • width Integer-Wert
  • height Integer-Wert
  • classes CSS-Klassen - durch ein Leerzeichen getrennt

… Aber es gibt auch ein:

Vorlagen-Tag

global $post;
// Use the template tag with ID *OR* full path
dynamic_image_resize( array(
     // The full path to the image in your uploads folder
     'src'     => wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );
     // OR: the ID
     'src'     => get_post_thumbnail_id( $post->ID )

    ,'width'   => 60
    ,'height'  => 100
    ,'classes' => 'some classes to align and style the image'
) );

Legen Sie es einfach in Ihre Vorlage, wo Sie es brauchen und finito.

Hinweis: Es basiert auf einer Idee/Vorschlag von Konstantin Kovshenin.


Nebenbemerkung:

Wenn Sie die Standardbildgrößen standardmäßig überspringen/deaktivieren möchten, fügen Sie einfach 0 als width und height in den Administratoreinstellungen hinzu.

4
kaiser