web-dev-qa-db-fra.com

Ajouter du code dans une fonction standard wordpress spécifique

Est-il possible d'ajouter des fragments de code dans la fonction standard de wordpress? Dans mon cas, je développe un plugin qui va retracer l'emplacement exact de l'appelant de la méthode wp_delete_attachment dans wordpress. Je peux y arriver par debug_backtrace () mais cette méthode doit être appelée dans la méthode que vous souhaitez suivre. Comment puis-je y arriver sans toucher/éditer les fonctions principales de wordpress?

function wp_delete_attachment( $post_id, $force_delete = false ) { <-- wordpress core function
global $wpdb;
  //my custom code inside wordpress core function
  $bt = debug_backtrace();
  $caller = array_shift($bt);

  die(json_encode($caller));
}
1
Danryl Carpio

Je résous le problème en accrochant ma fonction à delete_attachment, puis en plaçant la trace de débogage dans ma fonction et en filtrant le wp_delete_attachment. Cela permet de récupérer le fichier et le numéro de ligne où le nom wp_delete_attachment est appelé.

add_action( 'delete_attachment', 'your_function' );
function your_function($postid) {
    $trace = debug_backtrace();

    if(is_array($trace) && !empty($trace)) {        
        foreach ($trace as $trace_value) {
            if(array_key_exists("function", $trace_value)) {
                if($trace_value['function'] == "wp_delete_attachment") {

                    echo $trace_value;

                }
            }
        }
    }
}
0
Danryl Carpio

Cela dépend de ce que vous voulez faire.

Si vous regardez dans la définition de la fonction , vous remarquerez un peu do_action () :

Par exemple:

do_action( 'delete_attachment', $post_id );
do_action( 'delete_post', $post_id );
do_action( 'deleted_post', $post_id );

Ce sont des points, appelés crochets dans WordPress, où vous pouvez réellement exécuter vos tâches. Les crochets vous aideront à modifier le comportement principal sans modifier le noyau WordPress lui-même.

Supposons que vous souhaitiez intégrer le code avant la suppression de la pièce jointe. Vous pouvez ensuite utiliser add_action('delete_attachement', 'yourfunction'); dans le functions.php de votre plugin ou de votre thème pour exécuter le code de votre choix.

Par exemple:

add_action('delete_attachement', 'yourfunction');

function yourfunction( $post_id ){
  echo 'sample';
  die;
}
1
RRikesh

Vous devez associer votre fonction à l'attribut delete_attachement, mais vous devez également supprimer certaines fonctions supplémentaires appelées avant d'appeler votre action accrochée pour atteindre le bon appelant de wp_delete_attachment().

Voici une implémentation possible ...

function my_backtrace( $post_id ) {
    $bt     = debug_backtrace();
    array_shift( $bt ); // Remove reference to function
    array_shift( $bt ); // Remove reference to call_user_func_array
    array_shift( $bt ); // Remove reference to do_action
    array_shift( $bt ); // Remove reference to wp_delete_attachment
    $caller = array_shift( $bt ); // This is what called wp_delete_attachment
    die( '<pre>' . json_encode( $caller, JSON_PRETTY_PRINT ) . '</pre>' );
}
add_action('delete_attachement', 'my_backtrace');

Aussi, vous pouvez utiliser json_encode( $caller, JSON_PRETTY_PRINT ) pour imprimer votre JSON codé;)

Laisse-moi savoir comment ça marche pour toi ...

À votre santé

0
shramee