前提
独学者です。
https://teratail.com/questions/122515 と同じことがしたいため
解答欄にある GitHub の thumbnail-filename-changer.phpを利用しました。
コードの内容がわからなかったため、一つずつ調べたのですが、どうしてもわからない部分があったため、質問させてください。
実現したいこと
コードの意味を理解できるようになりたい
発生している問題・エラーメッセージ
25行目 空配列に(イメージサイズをすべて初期化)して、29行目からメタデータ追加(入れ直し)しているのはなぜなのでしょうか?
27行目 正規表現 !^image/! で MINEタイプ画像(例 image/jpegやimage/png)がなぜ通るのかわかないです。
95行目 $resized_fileを上書きする理由がわからないです。(上書き前も上書き後も同じ内容なのに)コードの内容がわからないです。
該当のソースコード
PHP
1<?php 2//コメントアウトが調べた結果 3/* 4Plugin Name: ThumbName Changer 5Plugin URI: http://creatorish.com/lab/4612 6Description: サムネイルのファイル名を{$width}x{$height}.jpgではなく-thumbnail.jpg等にするプラグイン。add_image_size($name,$w,$h,$c);で追加した画像は-{$name}.jpgになります。 7Version: 0.1 8Author: yuu@creatorish 9Author URI: http://creatorish.com 10*/ 11//画像をアップロードする際に自動的に生成されるイメージサイズをフィルター 12add_filter( 'intermediate_image_sizes_advanced', 'hack_intermediate_image_sizes_advanced' ); 13//アップロード時(添付ファイルアップロード直後 実行) 14add_filter( 'wp_generate_attachment_metadata', 'hack_wp_generate_attachment_metadata', 10, 2 ); 15 16//$sizes = イメージサイズ 17function hack_intermediate_image_sizes_advanced( $sizes ) { 18 return array();//空配列に(すべて初期化) 19} 20function hack_wp_generate_attachment_metadata( $metadata, $attachment_id ) {//アップロードしたファイルのメタデータ(横幅や高さ、ファイルルート),ファイルID(メディアのitem=数)。 21 $attachment = get_post( $attachment_id );//画像の投稿データ(投稿日や名前フルパス) 22 $uploadPath = wp_upload_dir();//upload ディクレトリの URL を取得する 23 //アップロードしたファイルのサーバー内の絶対パス 24 $file = path_join($uploadPath['basedir'], $metadata['file']);// パス名を連結する(サブディレクトリを含まないパス,現在定義されている uploads ディレクトリーからの画像(添付ファイル)の相対パス。) 25 error_log(var_export($metadata, true), 3, "./debug.txt"); 26 $metadata = array();//空配列に(イメージサイズをすべて初期化)なぜ? 27 //先頭にimage/ある場合=画像だったら,get_post_mime_type()でimage/jpegやimage/pngで返ってくる? 28 if ( preg_match('!^image/!', get_post_mime_type( $attachment )) && file_is_displayable_image($file) ) { 29 $imagesize = getimagesize( $file );// 画像の大きさを取得する 30 //メタデータ追加(入れ直しなぜ?) 31 $metadata['width'] = $imagesize[0];//画像の幅 32 $metadata['height'] = $imagesize[1];//画像の高さ 33 //$uwidth, $uheightに縦横比を維持した縮小サイズを代入(128=縮小時の最大幅,96=縮小時の最大高を指定) 34 list($uwidth, $uheight) = wp_constrain_dimensions($metadata['width'], $metadata['height'], 128, 96); 35 //HTML の img タグに入れて小サイズの画像を表示するための高さ/幅の文字列。 36 $metadata['hwstring_small'] = "height='$uheight' width='$uwidth'"; 37 38 // Make the file path relative to the upload dir 39 $metadata['file'] = _wp_relative_upload_path($file);//uploads ディレクトリーからの画像(添付ファイル)の相対パス = アップロードされたファイルへの相対パス 40 // make thumbnails and other intermediate sizes 41 global $_wp_additional_image_sizes;//add_image_size()で追加されたサイズの配列(サイズ名 横幅 高さ 切り抜き設定) 42 //サムネイル画像のサイズ名を取得(名前だけがすべてが配列に) 43 foreach ( get_intermediate_image_sizes() as $s ) { 44 $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => FALSE ); 45 if ( isset( $_wp_additional_image_sizes[$s]['width'] ) )//add_image_size()で追加したものに横幅が設定されている場合 46 //add_image_size()に設定されている横幅を追加 47 $sizes[$s]['width'] = intval( $_wp_additional_image_sizes[$s]['width'] ); // For theme-added sizes 48 else 49 //設定で設定したサイズ横幅を追加 50 $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options 51 if ( isset( $_wp_additional_image_sizes[$s]['height'] ) )//add_image_size()で追加したものに高さが設定されている場合 52 //add_image_size()に設定されている高さを追加 53 $sizes[$s]['height'] = intval( $_wp_additional_image_sizes[$s]['height'] ); // For theme-added sizes 54 else 55 //設定で設定したサイズ高さを追加 56 $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options 57 if ( isset( $_wp_additional_image_sizes[$s]['crop'] ) )//add_image_size()で追加したものに切り抜きが設定されている場合 58 //add_image_size()に設定されている切り抜き設定を追加 59 $sizes[$s]['crop'] = intval( $_wp_additional_image_sizes[$s]['crop'] ); // For theme-added sizes 60 else 61 //設定で設定した切り抜きオプションを追加 62 $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options 63 } 64 foreach ($sizes as $size => $size_data ) {//(as $key => $value) $sizesは全サイズの(サイズ名 横幅 高さ 切り抜き設定) 65 $resized = hack_image_make_intermediate_size( $file, $size_data['width'], $size_data['height'], $size_data['crop'], $size ); 66 if ( $resized ) 67 $metadata['sizes'][$size] = $resized; 68 } 69 // fetch additional metadata from exif/iptc 70 $image_meta = wp_read_image_metadata( $file );//画像ファイルの拡張メタデータ 71 if ( $image_meta ) 72 $metadata['image_meta'] = $image_meta; 73 74 } 75 error_log(var_export($metadata, true), 3, "./debug2.txt"); 76 return $metadata; 77} 78function hack_image_make_intermediate_size( $file, $width, $height, $crop = false, $size = "" ) { 79 if ( $width || $height ) {//横幅もしくは高さがある場合 80 //イメージサイズ名が thumbnail medium largeのどれかの場合 81 if ($size == "thumbnail" || $size == "medium" || $size == "large") { 82 $suffix = $size; 83 } else { 84 global $_wp_additional_image_sizes;//add_image_size()で追加されたサイズの配列 85 if (isset($_wp_additional_image_sizes[$size])) {//$sizeの引数に設定した値が、add_image_size()で追加されたサイズの中にある場合 86 $suffix = $size; 87 } else { 88 $suffix = null; 89 } 90 } 91 //コアファイルを触らずにサムネイル(jpg)のクオリティ値を変えられます。デフォルトは90。 92 $resized_img = wp_get_image_editor( $file ); 93 $destfilename = $file; 94 if ( ! is_wp_error( $resized_img) ) { 95 $_filenameArr = explode( '/', $file ); 96 if ( is_array( $_filenameArr ) ) { 97 $name = array_pop( $_filenameArr ); 98 $dir = implode( '/', $_filenameArr ); 99 // ファイル名から拡張子を取得 100 $_filenameArr = explode( '.', $name ); 101 $ext = array_pop( $_filenameArr ); 102 // リサイズ後のファイル名 103 $destfilename = "{$dir}/{$_filenameArr[0]}-{$suffix}.{$ext}"; 104 // リサイズして保存 105 $resized_img->set_quality( 90 ); 106 $resized_img->resize( $width, $height, $crop ); 107 $resized_img->save( $destfilename ); 108 } 109 } 110 $resized_file = $destfilename;//(画像ファイルのパス,サイズを変更する最大幅,サイズを変更する最大の高さ,画像をトリミングするか,ファイル名に追加する文字列,新しい画像ファイルのパス,画質のパーセンテージ) 111 //渡された変数が WordPress Error であるかチェックします 112 if ( !is_wp_error( $resized_file ) && $resized_file && $info = getimagesize( $resized_file ) ) { 113 //image_make_intermediate_size=画像をリサイズしてサムネイルや中間サイズにします?(なぜ?) 114 $resized_file = apply_filters('image_make_intermediate_size', $resized_file); 115 return array( 116 'file' => wp_basename( $resized_file ),//ベース名(パスの最後にある名前の部分)を取得する 117 'width' => $info[0], 118 'height' => $info[1], 119 'size' => $size 120 ); 121 } 122 } 123 return false; 124}?>
試したこと
正規表現は
!^image/
^image/!
^image/
の3つ書き換えたがどれも通らなかった
!は否定(!^image/ は文字列imageから始まらないものと認識している)
後ろの!の意味がわからない。(二重否定?)
$metadataは空配列にする前も
入れ直したあとも中身は同じものだった。
補足情報(FW/ツールのバージョンなど)
image_resizeをWP_Image_Editorに書き換えたいと思っている(非推奨のため)
WordPress 3.5で非推奨となったimage_resizeをWP_Image_Editorに置き換える方法。
その他コメントアウトで認識が違う箇所や非推奨の関数があれば教えていただけると幸いです。
WordPress 5.2.7
回答3件
あなたの回答
tips
プレビュー