今日は前回の記事の続きでWordPressのカスタム投稿タイプごとに生成するアイキャッチ画像、投稿サムネイルなどに使用できる画像サイズを分けて生成する方法です。
例として以下のような画像サイズ定義をadd_image_size()を使ってfunctions.php内で行っていたとします。
//カスタム投稿タイプ「book」用
add_image_size('book', 300, 300 );
//カスタム投稿タイプ「video」用
add_image_size('video', 400, 400 );
//カスタム投稿タイプ「game」用
add_image_size('game', 500, 500 );
book、video、gameというカスタム投稿タイプがあると仮定し、上記で定義した名称とカスタム投稿タイプ名が一致する画像サイズのみ生成し、他の画像サイズは作らないようにしたいと思います。
このまま画像をアップロードしてしまえば、上記の3パターンがどのポストタイプの時でも生成されてしまいますが、
add_action('save_post', 'save_custom_data');
function save_custom_data() {
//カスタム投稿タイプ「book」の場合
if( get_post_type() == 'book' ){
add_image_size( 'video' , 0 , 0 );
add_image_size( 'game' , 0 , 0 );
//カスタム投稿タイプ「video」の場合
}elseif( get_post_type() == 'video' ){
add_image_size( 'book' , 0 , 0 );
add_image_size( 'game' , 0 , 0 );
//カスタム投稿タイプ「game」の場合
}elseif( get_post_type() == 'game' ){
add_image_size( 'book' , 0 , 0 );
add_image_size( 'video' , 0 , 0 );
}
}
こんな感じでsave_postフックなどにひっかけて当該カスタム投稿タイプで不要な画像サイズをadd_image_size()でサイズ0で登録しなおします。
すると昨日の記事でも書いたとおり、add_image_size()に0で登録したサイズは生成されないので、カスタム投稿タイプごとの画像サイズ生成分けを実現できてサーバー内に不要な画像サイズが生成されずスッキリします。
ポイントとしては、カスタム投稿タイプごとに必要画像生成サイズを登録するのではなく、カスタム投稿タイプごとに不要な画像サイズを外す、という発想の転換です。
大量に画像サイズがある場合は、配列で管理してforeachなどで一気に生成し、解除時は作りたい画像サイズのみを配列からunsetして再びforeachで0登録してしまえば簡単で良いです。
//画像サイズを追加する
$img_size = array(
'img1' =>array( 111 , 111 , false ),
'img2' =>array( 222 , 222 , false ),
'img3' =>array( 333 , 333 , false ),
'img4' =>array( 444 , 444 , false ),
'img5' =>array( 555 , 555 , false )
);
foreach( $img_size as $k => $v ){
add_image_size( $k , $v[0] , $v[1] , $v[2] );
}
add_action('save_post', 'save_custom_data');
function save_custom_data() {
global $img_size;
//img3のサイズだけ生成したい場合は配列から除去
unset($img_size['img3']);
//残った項目をサイズ0で再登録
foreach( $img_size as $k => $v ){
add_image_size( $k , 0 , 0 );
}
}
こんな感じでいけると思います。
この例では実行後にimg3の画像サイズのみが生成されます。
functions.phpの読み込みタイミングでカスタム投稿タイプの分岐はできませんので登録時に対応するのは難しい?ので現状ではこれしかカスタムポストタイプごとに画像サイズの生成分けはできないと思うのですが、他に良い方法をご存知の方がいらっしゃいましたらぜひ教えて下さい!