我想打电话给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;
}
最合适的回答,由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\' ) );
} );
参考