J'aimerais appeler un function Y($arg)
lorsque le hook X
est déclenché.
Alternative: récupérez la valeur de retour de function Y()
, appelée via add_action('X', 'Y');
dans function W
, qui contient l'instruction add_action()
.
Comment je fais ça?
Mon cas d'utilisation:
J'ai une fonction createMainPanel()
qui renvoie une chaîne $ret
à afficher.
Je n'ai accès aux informations méta postales qu'après le hook "template_redirect", par exemple. get_post()
et les autres n'ont que des valeurs sensibles après ce crochet. Ainsi, je veux ajouter un add_action('redirect_template', retrievePostInfo')
avec la chaîne actuellement préparée pour la sortie ($ ret)) et laisser cette fonction construire le reste et imprimer la page avec echo.
Une autre solution consistait en quelque sorte à récupérer le retour de retrievePostInfo()
et à l’ajouter à la chaîne de createMainPanel()
.
Cependant, je ne vois pas de manière efficace de mettre en œuvre l'une ou l'autre de ces possibilités.
MODIFIER
J'ai résolu mon problème sans aucun rapport avec la question, mais voici le code:
CODE ERRONÉ:
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;
}
CODE CORRECT:
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;
}
Il est possible de use
fonctions d'une manière qui permette à une action de transmettre des variables à la suivante. Dans ce cas, j'ai attendu l'événement wp_head
pour ajouter le filtre the_content
. Et il utilisera le queried_object_id
lors de l'ajout de contenu avec showPostMetaInfo
.
Cela rend votre fonction un peu plus OOP plus conviviale.
// 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; };
Note: Cela ne fonctionnera pas avec toutes les versions de PHP.
En allant plus loin, vous pouvez créer une classe qui autorise les données dynamiques (y compris les méthodes) et y acheminer vos fonctions à l'aide de méthodes magiques .
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;
En utilisant l'objet dynamique FunctionProxy
, vous pouvez créer des méthodes et des propriétés à la volée.
// 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' ) );
} );
Référence
Vous ne pouvez rien obtenir de add_action()
- il retourne toujours true
.