質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

972閲覧

このPHPコードの意味が知りたい

mumu1354

総合スコア18

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2022/12/22 03:00

編集2022/12/22 06:23

前提

独学者です。
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/12/22 03:30

1つ目と3つ目は作った人しか「意図」までは分からないのではないでしょうか。 「知ってどうしたいのか」あたりも記載してもらえると。
mumu1354

2022/12/22 06:25

m.ts10806様 コメントありがとうございます。 知ってどうしたいのか >コードを読めるようになりたかったです。(勉強として)
m.ts10806

2022/12/22 06:29

業務上でも、コメントがしっかり書かれてなかったり、仕様書がなかったりする意図不明のコード(だけどちゃんと動いてる)って結構あって、改修することによる影響範囲も見えないのでほっとくってよくあるのですけど、勉強のためならなるべく最新のフレームワークのコードをリファレンス見ながら辿って行った方が有用だと思います。 提示のものはWordPressですし10年前のものですし、更新されなくなって久しい(作者のサイトもアクセスできない)ので、勉強の土台としてはハードルが高いわりに得られるものはあまりないかなと。
mumu1354

2022/12/22 06:57

m.ts10806様 業務上でもそういったことがあるのですね! 勉強の土台としてはハードルが高いわりに得られるものはあまりないかなと。 >たしかにおっしゃるとおりだと思います。今後気をつけます。ご指摘ありがとうございます。 WordPressは最近はあまり使われていないのでしょうか?
m.ts10806

2022/12/22 07:05

>WordPressは最近はあまり使われていないのでしょうか? 要件次第です。 「ぽさ」が嫌な人もいるでしょうし、業務アプリケーションには向きませんが、 コーポレートサイトや個人サイトなどサクッと作れるお手軽さはまだまだあるでしょうし、 プログラム分からなくてもプラグインやテーマ駆使すればそれなりのものができますしね。 結局は「どうなりたいか」「何を作りたい」かで有用かどうか全く意見が分かれると思いますよ。
mumu1354

2022/12/22 10:19

承知しました。 ありがとうございます。
guest

回答3

0

ベストアンサー

25行目 空配列に(イメージサイズをすべて初期化)して、29行目からメタデータ追加(入れ直し)しているのはなぜなのでしょうか?

画像のメタデータを残さず上書きしてしまいたいから、他のプラグインによって追加されたメタデータに邪魔されたくないから、ですかね。
特に$metadata['sizes']でしょうね、このプラグインの用意したリサイズ画像で確実に置き換えたいのでしょう。

27行目 正規表現 !^image/! の意味がわからない MINEタイプ画像(例 image/jpegやimage/png)がなぜ通るのかわかないです。

これは回答出てますね、正規表現のパターンの区切り文字は任意の文字にすることができます、区切り文字にした文字はパターンの中で\をつけてエスケープしなくてはいけません。
パターンで/をエスケープをするのは面倒なので/以外を区切り文字に指定してるって感じですね。

95行目 $resized_fileを上書きする理由がわからないです。(上書き前も上書き後も同じ内容なのに)

他のプラグインなどでimage_make_intermediate_sizeにフィルタがかけてあるなら、ちゃんとそれを通すためですね。
このプラグインから中間サイズ画像のデータを取得すると、他のプラグインによる最適化された中間サイズ画像への置き換えが効かない、みたいなことにならないように。

投稿2022/12/22 04:14

編集2022/12/22 04:17
KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mumu1354

2022/12/22 06:32

KazuhiroHatano様 回答ありがとうございます。 申し訳ありません。自分の理解不足でまだ把握しきれておりません もう少し詳細をお伺いしたいです。 画像のメタデータを残さず上書きしてしまいたいから、他のプラグインによって追加されたメタデータに邪魔されたくないから、ですかね。 >他のプラグインによって追加されたメタデータに邪魔されるというのはどういったことが起きるのでしょうか? apply_filters('image_make_intermediate_size', $resized_file);とはどのようなことをしているコードなのでしょうか?中間サイズ画像サイズを作る際にimage_make_intermediate_sizeを使用するのでしょうか? お手数おかけして申し訳ありません。 27行目 正規表現の件ありがとうございます。
KazuhiroHatano

2022/12/22 07:19 編集

43〜67行目に注目、ここget_intermediate_image_sizesで取得されないサイズのやつがいたら、残っちゃいますよね。そしたら、そのサイズの画像はこのプラグインによる置き換えがされないですよね。 image_make_intermediate_sizeは中間サイズ画像のファイル名を書き換えるフィルタフックです。 例えば別のプラグインが中間サイズ画像生成時にwebp版の画像も作っていて、対応ブラウザからのリクエストならwebpのファイル名で置き換えるみたいなことをしているなら、このimage_make_intermediate_sizeを使っているはずなので、このプラグインから中間サイズ画像を取得するとwebp版の画像に置き換わらない、みたいなことにならないようにするためにimage_make_intermediate_sizeを通しているものかと思います。
mumu1354

2022/12/22 10:17

KazuhiroHatano様 ご返信ありがとうございます。 get_intermediate_image_sizesはすべてのサイズが取得できるわけではないのですね。 たしかに置き換えがされないの困ります。 例えば別のプラグインが中間サイズ画像生成時にwebp版の画像も作っていて、対応ブラウザからのリクエストならwebpのファイル名で置き換えるみたいなことをしている >もし上記のようなプラグインが動いていた場合114行目の$resized_fileにはwebp版の画像が代入されるのでしょうか?
KazuhiroHatano

2022/12/22 10:32

他のプラグインがある中間サイズ画像を同画像の別バージョンに差し替える、という処理を行うのであればおよそimage_make_intermediate_sizeを使うだろうという推定のもと、このプラグインの作者はこのようにしたのだろうと推測します。 ただ、同じことはこのプラグインが行なっているように、画像のメタデータのsizesを上書きするという方法でも実現可能で、このプラグインと同じやり方で同画像の別バージョンへの差し替えを行なっているプラグインとは競合することになるかと思います。
mumu1354

2022/12/22 12:41

KazuhiroHatano様 ご返信ありがとうございます。 そうなのですね! プラグイン作成のときは他のプラグインのことも考えなきゃですね。。。 ちなみにget_intermediate_image_sizesで取得されないサイズとはどのような場合が考えられるのでしょうか?
KazuhiroHatano

2022/12/22 15:24

例えば、画像の保存時ではなく、テンプレートで画像が使用された時に指定されたサイズに応じてリサイズ画像を生成してmetadataのsizesに追加することで、そのサイズを必要とする画像にだけリサイズ画像を生成して無駄にたくさんのリサイズ画像を作らないようにする、みたいなことができます。 こういうことをしてるプラグインがあるとget_intermediate_image_sizesにないサイズのファイルがmetadataのsizesに登録されている状態になります。
mumu1354

2023/01/03 12:32 編集

KazuhiroHatano様 ご返信ありがとうございます。 そういったことができるんですね。 たしかにadd_image_size()のやり方だと無駄なサイズの画像も作成されますもんね。 お教えいただきありがとうございます。
guest

0

25行目 空配列に(イメージサイズをすべて初期化)して、29行目からメタデータ追加(入れ直し)しているのはなぜなのでしょうか?

例えば、1から10の和を求めるときに、

PHP

1$sum = 0; 2for($i=1;$i<=10;$i++){ 3 $sum += $i; 4}

としたときに、何故$sum = 0;というコードがあるかわかりますか?
・わかる場合→それと同じです
・わからない場合→ちょっと説明が困難です

27行目 正規表現 !^image/! の意味がわからない MINEタイプ画像(例 image/jpegやimage/png)がなぜ通るのかわかないです。

これは、「先頭からimage/という文字列があって、以降は不問」という意味ですので、それらにマッチします。

95行目 $resized_fileを上書きする理由がわからないです。(上書き前も上書き後も同じ内容なのに)

その行以外のコードは読んでないので、想像ですが、たまたま一致しただけなのでしょう。
例えば、$x = str_replace(" ","",$x);という「文字列に空白が含まれていれば削除」というコードで、元々$xに空白が含まれていなければ実行前後で内容は不変です。

投稿2022/12/22 04:02

otn

総合スコア84645

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2022/12/22 04:11 編集

> !は否定(!^image/ は文字列imageから始まらないものと認識している) PHPで正規表現を文字列で書くときに、前後を同じ文字で囲む必要があります。 "/aaa/"とか"#bbb#"とか。多く使われるのは / ですが、"image/" という "/" を含んだパターンのためエスケープしないで済ませるために別の文字 ! を使ったのでしょう。 前後を囲む必要があるのは、"!aaa!i"のように正規表現のオプションを指定する場合があるからです。 "!aaa!i"は、オプションiがあるので、「aaaを含む文字列にマッチ。ただし大文字A小文字aを区別しない」という意味です。 PHPの入門を終えてない途中で実用プログラムを読もうとすると、こういうところで躓くことになります。
mumu1354

2022/12/22 06:43

otn様 回答ありがとうございます。 申し訳ありません。自分の理解不足でまだ把握しきれておりません もう少し詳細をお伺いしたいです。 何故$sum = 0;というコードがあるかわかりますか? >$sumという変数を定義するために必要な認識です。 この場合$metadata = array();は書かずに $metadata['width'] = $imagesize[0];で値を上書きしても問題なさそうに思えました。 なぜ$metadata = array();が必要化理解できていない状態です。 95行目 $resized_fileについて >apply_filters('image_make_intermediate_size', $resized_file);とは、どのようなことをしているコードなのでしょうか? 正規表現の件大変わかりやすくまとめていただきありがとうございます。 PHPの入門を終えてない途中で実用プログラムを読もうとすると、こういうところで躓くことになります。 >おっしゃるとおりだと思います。これを機にPHPの基礎の勉強に励んでいきたいと思います。 ご指摘ありがとうございます。
otn

2022/12/22 09:21 編集

> なぜ$metadata = array();が必要化理解できていない状態です。 すいません。前後を見てないので、この変数がその前で使われていたことに気づいてなかったです。 私の回答に書いたのは、「変数は使う前に何か代入しておく」という事を言っただけで、 「このプログラムにおいて、ここで、なぜそれまでの値を捨てないといけないか」は考えてません。 > とは、どのようなことをしているコードなのでしょうか? については、すでにKazuhiroHatanoさんか説明してくれていますね。
mumu1354

2022/12/22 10:18

承知しました。 ありがとうございます。
guest

0

! は / の代わりじゃないでしょうか?

!^image/!/^image\// と等価

投稿2022/12/22 03:25

編集2022/12/22 03:26
yuma.inaura

総合スコア1453

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mumu1354

2022/12/22 06:43

yuma.inaura様 ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問