如何将参数传递给Add_action()或检索被调用函数的返回值?

时间:2016-11-05 作者:Alex

我想打电话给function Y($arg) 当挂钩X 已启动。

备选方案:从中捕获返回值function Y(), 叫做viaadd_action(\'X\', \'Y\'); 在里面function W, 哪一个contains 这个add_action() 陈述

我该怎么做?

我的用例:

我有一个功能createMainPanel() 返回字符串的$ret 待显示。

我只能在“template\\u redirect”挂钩后访问帖子元信息,例如:。get_post() 而类似的东西只有在挂钩之后才有合理的价值。因此,我想添加一个add_action(\'redirect_template\', retrievePostInfo\') 使用当前为输出准备的字符串($ret)),并让该函数构建其余部分并使用echo打印页面。

另一种想法是以某种方式找回retrievePostInfo() 并将其附加到createMainPanel().

然而,我看不到实现这两种可能性的有效方法。

EDIT

我以一种与问题无关的方式解决了问题,但代码如下:

ERRONEOUS CODE:

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;
}

CORRECT CODE:

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;
}

2 个回复
最合适的回答,由SO网友:jgraup 整理而成

有可能use 函数的方式允许一个操作将变量传递给下一个操作。在这种情况下,我一直等到wp_head 要添加的事件the_content 滤器它将使用queried_object_id 添加内容时showPostMetaInfo.

这使您的函数更加面向对象友好。

// 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更进一步,您可以创建一个允许动态数据(包括方法)的类,并使用magic methods.

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\' ) );
} );
参考

SO网友:Pat J

你无法从add_action() -- 它总是回来true.

参考add_action() developer docs

相关推荐

显示作者姓名PHP(自制插件)

我有一个需要帮助的问题,因为我自己找不到解决办法。我接管了一个网站,之前有人在那里创建了一个自制插件。。使用默认插件“Contact Form 7”,用户可以在页面上创建帖子。()https://gyazo.com/c8b20adecacd90fb9bfe72ad2138a980 )关于自行创建的插件“Contact Form 7 extender”,帖子是通过PHP代码在后台生成的(https://gyazo.com/115a6c7c9afafd2970b66fd421ca76a3)其工作原理如下:如果