attachment_fields_to_editの引数に関して:メモ

悩み
悩み

attachment_fields_to_editの引数に関してのメモです。

attachment_fields_to_edit

attachment_fields_to_editは、投稿画面で画像を挿入する際に出てくるメディアアップロード時に、カスタムフィールドを追加する場合などに用いるフックです。

上記はどちらもWordPress.orgのページです。

実際に使われる形での参考コードなどは、下記のページの「参考情報」をご覧下さい。

attachment_fields_to_editの引数

attachment_fields_to_editには$form_fields$postの2つの引数がありますが、このうち $form_fieldsの中身が分かりませんでした。

調査の結果、以下のページでなんとか把握できました。

上記ページには実例を交えた内容が記載されていますので、詳細はそちらでご確認いただく方が良いですが、一応下記に簡単にまとめたいと思います。


"label" => "Custom Field Label"; //カスタムフィールドのラベルを設定
"input" => "text"; //デフォルトはtextでhtmlやhiddenの指定も可能
"value" => "Custom Value"; //inputがtextなどの場合、その中に入力される値
"html" => "html"; //inputでhtmlを指定した場合ここの内容が使われるが、html以外だと無視される
"helps" => "Custom Help"; //追加したカスタムフィールド下部に説明用テキストを追加できる
"required" => false; //trueにすると必須入力であることを示す※がつく
"extra_rows" => array(); //追加したカスタムフィールドの下に、tdとして行を追加できる
"tr" => "<tr><td>...</td><tr>"; //extra_rows に似ていますが、こちらはtrの形で追加可能であり、htmlをそのまま記載できるようです

$form_fieldsは文字通りフォーム用の配列であると分かれば、理解がしやすいと思います。

extra_rows

extra_rowsの記述は以下のような形になります。


 'extra_rows' =>array( "classname1" => '内容1',"classname2" => '内容2'),

最初のclassname1と書いている所は、tdのクラス名に用いられます。
そのため、クラス名にしているできる文字列であれば数字が連番のようになっている必要はありません。

配列である必要はありますが、追加する td はもちろん一つでも問題ありません。

「※がついているものは必須」の文字列

attachment_fields_to_editでカスタムフィールドを追加すると、WordPressの設定が日本語であれば以下の文字列が自動で追加したフィールドの上部に挿入されます。

  • ※がついているものは必須事項

2,3年前の記事にあるスクリーンショットでは見かけませんでしたので、少し前から追加されたものかもしれません。

この部分は、$form_fieldsrequiredの設定で消せると思っていたのですが、実際には消せませんでした。
残念ながら現時点では正規の削除方法が見つかっていません。

一応構造としては以下のようになっていますので、管理画面に対するcssに記載すれば消せますが、部位を特定するための指定内容が大雑把なものになりそうですので、あまりお勧めできないように思います。


<p class="media-types media-types-required-info"><span class="required">*</span> が付いている欄は必須項目です</p>

attachment_fields_to_edit内で使える分岐

調べたところ、attachment_fields_to_editのフックで呼び出された際の$postの中身は、メディアアップローダー内で指定した画像の「添付ファイルのページ情報」です。

そのため$post->IDで取れるのは、アップロードされた(あるいはライブラリで選択した)画像のIDとなります。

そのため$postからどんな値をとっても、メディアアップローダーが呼び出された投稿画面に関する情報がとれず、投稿画面に関わる分岐(固定ページで呼び出された時にだけ内容を変更するなど)ができない模様です。

ただし、一度どこかに挿入された画像であれば個別の投稿に紐づくため、$post->post_parentで挿入先の情報がとれますので、それを利用する場合もあるかもしれません。

冒頭に示した参考サイトでは、以下のようにメディアタイプでの分岐のアイデアが書かれていましたので引用します。


// for audio files
if( substr($post->post_mime_type, 0, 5) == 'audio' ){
    // add your custom fields for audio files
}
 
// OR for images on a specific page
 
$page_id = 5; // set the id to whatever page you want these applied to
if( $post->post_parent == $page_id && substr($post->post_mime_type, 0, 5) == 'image' ){
    // add your image specific custom fields for this particular page
}

メディアアップローダーの画面自体は添付ファイルのページ(post_typeattachment)ですから、上の分岐条件であるメディア種類での分岐は可能なのはわかります。

ただ、次の$post->post_parentに関しては、前述のように投稿に紐づいていない場合は分岐が不可能だと思うのですが、この点理解できていません。


$current_screen = get_current_screen();
if ( $current_screen->base == 'post' && $current_screen->post_type == 'attachment' ) {}

上記のようにattachment_fields_to_editでも$current_screenを利用するコードをいくつか見かけましたが、 $current_screen には値が入っていないようでした。

参照したコードの前提が理解できていないのだとは思いますが、原因がわかりませんでした。


function get_current_screen() {
 global $current_screen;

 if ( ! isset( $current_screen ) )
  return null;

  return $current_screen;
}

ちなみに、get_current_screen()$current_screenの2種類がありますが、get_current_screen()のほうは内部で$current_screenを呼び出しているだけの模様です。

上記ページに両者の違いに関してのコードが書かれていますが、それを見ましても、globalから使うかfunctionから使うかの違いしかないようでした。

結び

何となく姿は見えてきましたが、必須事項の部分など操作できそうな箇所がどうにもできず、調査が足りていない印象です。

media.php内に書いていることが理解できず、頭が痛いです…。

1人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。