投稿一覧画面でカスタムフィールドの項目を追加したい
-
Admin Columns プラグインを使ったことがないので当てずっぽになりますが、
'cac/column/meta/raw_value'
フック、あるいは、'cac/column/meta/value'
フックは使えませんか?https://github.com/wp-plugins/codepress-admin-columns/blob/master/classes/column/custom-field.php#L343
https://github.com/wp-plugins/codepress-admin-columns/blob/master/classes/column/custom-field.php#L365mimosafa さま
「フック」というのをカスタマイズではよく目にしていて、コピペしたりして使っていましたが、自分でフックを定義したことがなくて、何をどうすればいいのかわかりません。
function get_value($id) { を基にして、function custom_get_value($id) { を定義して
add_filter('get_value', 'custom_get_value');
みたいな感じでしょうか?
初歩的なことをすみません。
そもそも、このフックが適切かどうかも不明なので問の答えとして不適切かもしれません。
が、フックを利用したカスタマイズは理解できておいたほうが良いと思うので、脱線覚悟で回答してみます。上記リンク先の例で言います。
$value = apply_filters( 'cac/column/meta/value', $value, $id, $this );
本来、イクオール左辺の
$value
(以後、左$value
)に代入されるのは、右辺のapply_filter
関数の第二引数$value
(以後、右$value
)です。右
$value
には、この行に来る前に種々の操作の上、左$value
に代入されるべき適切な値が入っています。(もしかすると投稿のID )フックを利用せず、なにもしなかった場合は左
$value
に、当初予定されていた通り右$value
が代入されます。apply_filter
第一引数の文字列('cac/column/meta/value'
)がフィルターフックです。(私自身、スラッシュが入ったフックはあまり見慣れないのですが、他の一般的なフックと同様です)WordPress はこのフックを利用することで左
$value
に右$value
を代入するときに好きなようにカスタマイズする(たとえば投稿のIDを受け取って、それを投稿のタイトルに変えて左辺に代入する)機能を提供してくれています。では、実際にカスタマイズする場合はどうすればよいのでしょう。
まず、右
$value
を受け取って、それをお望みの形にカスタマイズして返す(return
する)関数を作ります。(定義するのは「フック」ではなく、それに適用する「関数」の方です。)function my_customize( $value ) { $title = get_the_title( $value ); return $title; }
上記は、右
$value
を受け取って、それを投稿タイトルに変更して左$value
に代入するためにreturn
しています。この関数は 右
$value
をそのままの形ではなく nesty.wp さんが望む形(投稿IDではなく投稿タイトルを出力したい)に変えてしまうフィルターの役割をはたします。このフィルターをフィルターフック(
'cac/column/meta/value'
)に適用してあげます。add_filter( 'cac/column/meta/value', 'my_customize' );
—
ところで、
$value = apply_filters( 'cac/column/meta/value', $value, $id, $this );
は、「関連」フィールドの時だけに適用されるフックでしょうか?
多分違います。
カスタムフィールド全般について適用されていると考えるのが自然でしょう。このままですと
my_customize
関数の中であらゆるカスタムフィールドがget_the_title
関数の洗礼を受けることになります。…困りました。
そこで、活躍するのが
apply_filters( 'cac/column/meta/value', $value, $id, $this );
こちらの第三引数、第四引数です。
第三引数
$id
、第四引数$this
は、先ほどのmy_customize
関数の第二引数、第三引数として利用することができます。つまり、
function my_customize( $value, $id, $obj ) { // $this は特別な変数なので気分的に別の変数名にしました… if ( /* $id, $obj を使って何らかの条件分岐 */ ) { $value = get_the_title( $value ); } return $value; }
とすることが出来るということです。
この場合、関数をフックに適用する際に
add_filter( 'cac/column/meta/value', 'my_customize' );
と先ほどと同様のやり方だとダメです。
フィルター関数('my_customize'
)の引数の数をadd_filter
の第四引数で指定してあげなくてはいけません。(デフォルトは1
)
(第三引数は? わからなければ10
にしておいてください。)add_filter( 'cac/column/meta/value', 'my_customize', 10, 3 );
これで複数の引数をもつ関数をフィルターフックに適用することができました。
—
最初にも言ったように、そもそもこのフックが適切かはわかりません。(こんな長文書いている間に調べろよ、という声も聞こえますが…)
ただ、このプラグインは利用者も多く、評価も高いので何かしらのフックは用意されていると思います。もし、「このフック、あやしいな」というのがあれば、とりあえず関数を作って、その関数の中で
var_dump
なりprint_r
なり実行して調べてみるのが良いでしょう。function my_customize( $value, $id, $obj ) { if ( is_user_logged_in() ) { var_dump( $value ); var_dump( $id ); var_dump( $obj ); } return $value; }
—
もし条件分岐をするなら、本当は
$this
を利用した方がいいと思いますが、クラスのメソッドやプロパティを分析しなければいけないので難易度がかなり上がります。
若干あぶなっかしいですが、/** * $id に現在の投稿のIDが格納されていると仮定して */ if ( get_post_type( $id ) === 'my_post_type' /* 関連フィールドを設定した投稿タイプ */ && absint( $value ) && ( $post = get_post( $value ) ) && $post->post_type === 'related_post_type' /* 関連先に指定した投稿タイプ */ ) {
なんていうのでも代替できるのではないでしょうか。
何度も言いますがこのフックが適切かどうかは調べていません。
健闘を祈ります。
- トピック「投稿一覧画面でカスタムフィールドの項目を追加したい」には新たに返信することはできません。