フック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;
}
あるアクションが次のアクションに変数を渡すことを可能にするような方法で関数を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のすべてのバージョンで機能するわけではありません。
これをさらに一歩進めて、動的データ(メソッドを含む)を許可するクラスを作成し、 マジックメソッド を使用してそれを通して関数をルーティングすることができます。
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' ) );
} );
参照