在特定的WordPress标准函数中添加代码

时间:2016-04-28 作者:Danryl Carpio

是否可以在wordpress标准函数中添加一段代码片段?在我的例子中,我正在开发一个插件,它将跟踪wordpress中wp\\u delete\\u attachment方法调用方的确切位置。我可以通过debug_backtrace() 但必须在要跟踪的方法内调用此方法。如何在不接触/编辑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));
}

3 个回复
最合适的回答,由SO网友:Danryl Carpio 整理而成

我通过将函数挂接到delete_attachment 钩子,然后将调试跟踪放在我的函数中并过滤wp_delete_attachment, 通过这个,我可以检索调用wp_delete_附件的文件和行号。

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;

                }
            }
        }
    }
}

SO网友:RRikesh

这取决于你想做什么。

如果你调查一下function definition, 你会注意到一些do_action():

例如:

do_action( \'delete_attachment\', $post_id );
do_action( \'delete_post\', $post_id );
do_action( \'deleted_post\', $post_id );
这些是WordPress中称为钩子的点,您可以在这些点上实际运行您的东西。挂钩将帮助您修改核心行为,而无需修改WordPress核心本身。

假设您希望在删除附件之前挂接到代码中,然后可以使用add_action(\'delete_attachement\', \'yourfunction\'); 在插件或主题中functions.php 运行所需的任何代码。

例如:

add_action(\'delete_attachement\', \'yourfunction\');

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

SO网友:shramee

您需要将函数挂接到delete_attachement 钩子,但您还需要删除一些在调用钩子操作之前调用的额外函数,以访问的正确调用方wp_delete_attachment().

下面是一个可能的实现。。。

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\');
您还可以使用json_encode( $caller, JSON_PRETTY_PRINT ) 漂亮地打印编码的JSON;)

让我知道它是如何为你工作的。。。

干杯

相关推荐

Apply_Filters()对所需的参数进行切片

我正在尝试向WooCommerce订单中的每个退款行添加一个按钮(其功能超出了这个问题的范围,足以说明它需要退款id作为参数)。我发现这些行是在woocommerce\\includes\\admin\\meta Box\\views\\html订单退款中创建的。无法重写的php。然而,有一项行动:do_action( \'woocommerce_admin_order_item_values\', null, $refund, $refund->get_id() ); 这似乎非常适合我的