web-dev-qa-db-fra.com

Comment passer des arguments à add_action () ou récupérer la valeur de retour de la fonction appelée?

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

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.


Option 2

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

1
jgraup

Vous ne pouvez rien obtenir de add_action() - il retourne toujours true.

Référence

0
Pat J