web-dev-qa-db-ja.com

Add_action()に引数を渡す、または呼び出された関数の戻り値を取得する方法

フックXが起動されたときにfunction Y($arg)を呼び出したいです。

代替方法:function W内のfunction Y()を介して呼び出されるadd_action('X', 'Y');からの戻り値をキャッチします。 含むadd_action()ステートメント。

それ、どうやったら出来るの?

私のユースケース:

表示する文字列$retを返す関数createMainPanel()があります。

私は "template_redirect"フックの後にのみ投稿メタ情報にアクセスすることができます。 get_post()などは、そのフックの後にのみ意味のある値を持ちます。したがって、出力用に現在準備されている文字列($ ret)を含むadd_action('redirect_template', retrievePostInfo')を追加し、その関数に残りを作成させてページをエコーで印刷させます。

retrievePostInfo()の戻り値を取得し、それをcreateMainPanel()の文字列に追加するという別の方法が考えられました。

しかし、私はこれらの可能性のどちらかを実行するための実用的な方法を見ることができません。

編集

私は質問とは関係のない方法で私の問題を解決しました、しかしここにコードがあります:

エラーコード:

function showPostMetaInfo()
{
    $id = get_the_ID();

    $string.= "<table id='meta-info'>"
            . "<thead>"
            . "<tr>"
            . "<th> Meta Type </th>"
            . "<th> Value"
            . "</tr>"
            . "</thead>"
            . "<tbody>"
            . "<tr>"
            . "<td> Title </td>"
            . "<td>".get_the_title($id)."</td>"
            . "</tr>"
            . "<tr>"
            . "<td> Author </td>"
            . "<td>".get_the_author($id)."</td>"
            . "</tr>"
            . "<tr>"
            . "<td> Published </td>"
            . "<td>".get_the_date("", $id)."</td>"
            . "</tr>"
            . "<tr>"
            . "<td> Last Modified </td>"
            . "<td>".get_the_modified_date("", $id)."</td>"
            . "</tr>"
            . "<tr>"
            . "<td> Categories </td>"
            . "<td>".listCategories($id)."</td>"
            . "</tr>"
            . "<tr>"
            . "<td> Tags </td>"
            . "<td>".listTags($id)."</td>"
            . "</tr>"
            . "</tbody>"
            . "</table>";

    return $string;
}

正しいコード:

function showPostMetaInfo()
{
    $id = get_queried_object_id();

    $string.= "<table id='meta-info'>"
            . "<thead>"
            . "<tr>"
            . "<th> Meta Type </th>"
            . "<th> Value"
            . "</tr>"
            . "</thead>"
            . "<tbody>"
            . "<tr>"
            . "<td> Title </td>"
            . "<td>".get_the_title($id)."</td>"
            . "</tr>"
            . "<tr>"
            . "<td> Author </td>"
            . "<td>".get_the_author($id)."</td>"
            . "</tr>"
            . "<tr>"
            . "<td> Published </td>"
            . "<td>".get_the_date("", $id)."</td>"
            . "</tr>"
            . "<tr>"
            . "<td> Last Modified </td>"
            . "<td>".get_the_modified_date("", $id)."</td>"
            . "</tr>"
            . "<tr>"
            . "<td> Categories </td>"
            . "<td>".listCategories($id)."</td>"
            . "</tr>"
            . "<tr>"
            . "<td> Tags </td>"
            . "<td>".listTags($id)."</td>"
            . "</tr>"
            . "</tbody>"
            . "</table>";

    return $string;
}
1
Alex

あるアクションが次のアクションに変数を渡すことを可能にするような方法で関数をuseすることは可能です。この場合、wp_headイベントがthe_contentフィルタを追加するのを待ちました。そしてshowPostMetaInfoを使ってコンテンツを追加するときはqueried_object_idを使います。

これによりあなたの関数はもう少しOOPフレンドリーになります。

// Wait till the head
add_action( 'wp_head', function() {

    // Get the queried ID for use with `the_content`
    $queried_id = get_queried_object_id();

    add_filter( 'the_content', function( $content ) use ( $queried_id ) {

        // append post meta info to content
        return $content . showPostMetaInfo( $queried_id );
    } );
} );

function showPostMetaInfo( $id = null ) {

    if ( empty( $id ) ) {
        return '';
    }

    ob_start();

    ?>
    <table id='meta-info'>
    <thead>
    <tr>
        <th> Meta Type</th>
        <th> Value
    </tr>
    </thead>
    <tbody>
    <tr>
        <td> Title</td>
        <td><?php echo get_the_title( $id ); ?></td>
    </tr>
    <tr>
        <td> Author</td>
        <td><?php echo get_the_author( $id ); ?></td>
    </tr>
    <tr>
        <td> Published</td>
        <td><?php echo get_the_date( "", $id ); ?></td>
    </tr>
    <tr>
        <td> Last Modified</td>
        <td><?php echo get_the_modified_date( "", $id ); ?></td>
    </tr>
    <tr>
        <td> Categories</td>
        <td><?php echo listCategories( $id ); ?></td>
    </tr>
    <tr>
        <td> Tags</td>
        <td><?php echo listTags( $id ); ?></td>
    </tr>
    </tbody>
    </table><?php

    return ob_get_clean();
}

function listCategories( $id ) { return 'listCategories: ' . $id; };
function listTags( $id ) { return 'listTags: ' . $id; };

注:これはPHPのすべてのバージョンで機能するわけではありません。


オプション2

これをさらに一歩進めて、動的データ(メソッドを含む)を許可するクラスを作成し、 マジックメソッド を使用してそれを通して関数をルーティングすることができます。

if ( ! class_exists( 'FunctionProxy' ) ):

    class FunctionProxy {

        private $s = array ();

        // properties
        function __set( $k, $c ) { $this->s[ $k ] = $c; }
        function __get( $k ) { return isset($this->s[ $k ]) ? $this->s[ $k ] : null; }

        // methods
        public function __call( $method, $args ) {
            if ( isset($this->s[ $method ]) && is_callable( $this->s[ $method ] ) ) {
                return call_user_func_array( $this->s[ $method ], func_get_args() );
            } else {
                echo "unknown method " . $method;
                return false;
            }
        }

        // backtrace caller
        static function get_backtrace_object( $depth = 3 ) {
            $trace  = debug_backtrace();
            return isset( $trace[ $depth ][ 'object' ] ) ? $trace[ $depth ][ 'object' ] : null;
        }
    }

endif;

FunctionProxy動的オブジェクトを使うと、メソッドやプロパティをその場で作ることができます。

// Wait till the head
add_action( 'wp_head', function() {

    // create our dynamic object
    $func = new FunctionProxy();

    // Get the queried ID for use with `the_content`
    $func->queried_id = get_queried_object_id();

    // Create a method on the object
    $func->filter_the_content = function( $content ) {

        // Find the callee of this function
        $caller = FunctionProxy::get_backtrace_object();

        // Return content plus post meta from our caller object
        return $content . showPostMetaInfo( $caller->queried_id );
    };

    // add content filer
    add_filter( 'the_content', array ( $func, 'filter_the_content' ) );
} );

参照

1
jgraup

add_action()から何も取り戻すことはできません - それは常にtrueを返します。

参照

0
Pat J