サポート » プラグイン » 投稿一覧画面でカスタムフィールドの項目を追加したい

  • Admin Columnsプラグインを使って、カスタム投稿の投稿一覧画面をカスタマイズしています。

    カスタムフィールドのフィールドタイプが「関連」のフィールドは、その関連する投稿のタイトルを一覧画面に表示したいのですが、投稿のIDが表示されてしまいます。

    Admin Columnsプラグインを使って、関連する投稿のタイトルを一覧に表示することはかのうでしょうか?

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • 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#L365

    トピック投稿者 nesty.wp

    (@nestywp)

    mimosafa さま

    「フック」というのをカスタマイズではよく目にしていて、コピペしたりして使っていましたが、自分でフックを定義したことがなくて、何をどうすればいいのかわかりません。

    function get_value($id) { を基にして、function custom_get_value($id) { を定義して
    add_filter('get_value', 'custom_get_value');

    みたいな感じでしょうか?

    初歩的なことをすみません。

    そもそも、このフックが適切かどうかも不明なので問の答えとして不適切かもしれません。
    が、フックを利用したカスタマイズは理解できておいたほうが良いと思うので、脱線覚悟で回答してみます。

    https://github.com/wp-plugins/codepress-admin-columns/blob/master/classes/column/custom-field.php#L365

    上記リンク先の例で言います。

    $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' /* 関連先に指定した投稿タイプ */  ) {

    なんていうのでも代替できるのではないでしょうか。

    何度も言いますがこのフックが適切かどうかは調べていません。

    健闘を祈ります。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「投稿一覧画面でカスタムフィールドの項目を追加したい」には新たに返信することはできません。