it-swarm.com.de

Wie übergebe ich Argumente an add_action () oder rufe den Rückgabewert der aufgerufenen Funktion ab?

Ich möchte eine function Y($arg) aufrufen, wenn der Hook X ausgelöst wird.

Alternative: Fangen Sie den Rückgabewert von function Y() ab, der über add_action('X', 'Y'); in function W aufgerufen wird, der enthält die Anweisung add_action().

Wie mache ich das?

Mein Anwendungsfall:

Ich habe eine Funktion createMainPanel(), die einen anzuzeigenden String $ret zurückgibt.

Ich habe nur nach dem Hook "template_redirect" Zugriff auf die Post-Meta-Informationen, z. get_post() und dergleichen haben nach diesem Hook nur noch sinnvolle Werte. Daher möchte ich eine add_action('redirect_template', retrievePostInfo') mit der aktuell vorbereiteten Zeichenfolge für die Ausgabe ($ ret) hinzufügen und diese Funktion den Rest aufbauen und die Seite mit Echo drucken lassen.

Ein alternativer Gedanke war, irgendwie die Rückkehr von retrievePostInfo() abzurufen und an die Zeichenfolge von createMainPanel() anzuhängen.

Ich sehe jedoch keine Möglichkeit, diese beiden Möglichkeiten umzusetzen.

EDIT

Ich habe mein Problem auf eine Weise gelöst, die nichts mit der Frage zu tun hat, aber hier ist der Code:

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

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

Es ist möglich, use-Funktionen so auszuführen, dass eine Aktion Variablen an die nächste übergibt. In diesem Fall habe ich bis zum Ereignis wp_head gewartet, um den Filter the_content hinzuzufügen. Und beim Anhängen von Inhalten mit showPostMetaInfo wird der queried_object_id verwendet.

Dies macht Ihre Funktion ein wenig OOP freundlicher.

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

Hinweis: Dies funktioniert nicht mit allen PHP-Versionen.


Option 2

Wenn Sie noch einen Schritt weiter gehen, können Sie eine Klasse erstellen, die dynamische Daten (einschließlich Methoden) zulässt und Ihre Funktionen mit magic methods durch diese Klasse leitet.

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;

Mit dem dynamischen Objekt FunctionProxy können Sie Methoden und Eigenschaften im Handumdrehen erstellen.

// 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' ) );
} );

Referenz

1
jgraup

Sie können von add_action() nichts zurückerhalten - es wird immer true zurückgegeben.

Referenz

0
Pat J