新しい画像サイズを追加するときに作成されるファイルが多すぎることが心配です。
アップロードされたファイルはすべて新しいサイズを生成します。Fetured imageとして設定されたファイルにのみ特定の画像サイズが必要ですが、これを行う方法はありますか? 。
サムネイル、中などは問題ありませんが、ファイルごとに新しいサイズを作成する必要はありません。
これは、Featured Imageを設定した直後に機能するはずです。
質問 注目の画像のためのフィルタ この答えにつながります: update_post_metaとdelete_post_metaをフックする方法? 。
ここで明らかにされた素晴らしいグローバル変数($_wp_additional_image_sizes
)と結合されます: テーマ内で設定されたすべての可能なサムネイルサイズのリストを取得する方法 特集画像として "アクションクリック。
このコードは、「注目の画像として使用」をクリックするたびに発生します。それはそれからすべての追加の画像サイズを調べ、それらを削除して、デフォルトの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、機能画像はまだ設定されていません
フォルダの内容 設定後 注目の画像として/ fondo-restauraciones
すべての追加の画像サイズ(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'
)
*/
コア関数で次の引数を使用することで、注目のイメージ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
を追加するだけです。