web-dev-qa-db-ja.com

Featured Imageファイル専用の新しい画像サイズバージョン

新しい画像サイズを追加するときに作成されるファイルが多すぎることが心配です。

アップロードされたファイルはすべて新しいサイズを生成します。Fetured imageとして設定されたファイルにのみ特定の画像サイズが必要ですが、これを行う方法はありますか?

サムネイルなどは問題ありませんが、ファイルごとに新しいサイズを作成する必要はありません。

これは、Featured Imageを設定した直後に機能するはずです。

6
Diana

研究

質問 注目の画像のためのフィルタ この答えにつながります: update_post_metaとdelete_post_metaをフックする方法?

ここで明らかにされた素晴らしいグローバル変数($_wp_additional_image_sizes)と結合されます: テーマ内で設定されたすべての可能なサムネイルサイズのリストを取得する方法 特集画像として "アクションクリック。

enter image description here


コード

このコードは、「注目の画像として使用」をクリックするたびに発生します。それはそれからすべての追加の画像サイズを調べ、それらを削除して、デフォルトのWordPressサイズ(サムネイル、中、大)を維持します。
LIVEに進む前に、このコードをテストしてください throughly
GPLコード。保証はありません。コメントを確認してください。

/**
    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
}

結果

フォルダの内容 アップロード後 images、機能画像はまだ設定されていません
enter image description here

フォルダの内容 設定後 注目の画像として/ fondo-restauraciones
enter image description here


その他の注意

すべての追加の画像サイズ(WordPressのデフォルトおよびカスタム定義)を処理するには、次のようにします。

$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

コア関数で次の引数を使用することで、注目のイメージsrc/sourceを取得できます($postは、global $postを先頭にして呼び出す必要があります)。

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

どうやって使うのですか

私はfreeplugin をGitHub で利用できる、 "Dynamic Image Resize"と書きました。

あなたは無料でそれをダウンロードして使うことができます。

ショートコード

あなたのコンテンツに[dynamic_image]を入れてください。ショートコードには4つの引数があります。

  • srcアップロードディレクトリ内の画像またはIDへのフルパス
  • width整数値
  • height整数値
  • classes Cssクラス - スペースで区切る

…でも、

テンプレートタグ

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

あなたがそれを必要とするところであなたのテンプレートでそれをダンプしてそしてfinito。

注:これはKonstantin Kovsheninによるアイデア/提案に基づいています。


傍注:

デフォルトでデフォルトの画像サイズをスキップ/無効にしたい場合は、管理設定でwidthおよびheightとして0を追加するだけです。

4
kaiser