Devsway

日々の記録とか記憶とか。


まずはじめに


do_actionはadd_filterのエイリアスです。


大まか流れとしては

add_action => do_actionです。

理由は下記を見ていけばわかると思います。


function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
    return add_filter($tag, $function_to_add, $priority, $accepted_args);
}

add_filterは何をやっているのか?


グローバル変数に登録してnew Hook()します。


function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
    global $wp_filter;//グローバル
    if ( ! isset( $wp_filter[ $tag ] ) ) {//新規のタグに対応
        $wp_filter[ $tag ] = new WP_Hook();//Hookの機能はここが担う
    }
    $wp_filter[ $tag ]->add_filter( $tag, $function_to_add, $priority, $accepted_args );
    return true;
}

do_actionは何をやっているのか?


実行したいタグ名に何かしらの$function_to_addがあった場合、

それを実行します。


function do_action($tag, $arg = '') {
    global $wp_filter, $wp_actions, $wp_current_filter;//グローバルから参照

    if ( ! isset($wp_actions[$tag]) )
        $wp_actions[$tag] = 1;
    else
        ++$wp_actions[$tag];

    // Do 'all' actions first
    if ( isset($wp_filter['all']) ) {
        $wp_current_filter[] = $tag;
        $all_args = func_get_args();
        _wp_call_all_hook($all_args);
    }

    if ( !isset($wp_filter[$tag]) ) {
        if ( isset($wp_filter['all']) )
            array_pop($wp_current_filter);
        return;
    }

    if ( !isset($wp_filter['all']) )
        $wp_current_filter[] = $tag;

    $args = array();
    if ( is_array($arg) && 1 == count($arg) && isset($arg[0]) && is_object($arg[0]) ) // array(&$this)
        $args[] =& $arg[0];
    else
        $args[] = $arg;
    for ( $a = 2, $num = func_num_args(); $a < $num; $a++ )
        $args[] = func_get_arg($a);

    $wp_filter[ $tag ]->do_action( $args );//!!!!!!!!!!最終的にはここで実行する!!!!!

    array_pop($wp_current_filter);
}

function did_action($tag) { global $wp_actions; if ( ! isset( $wp_actions[ $tag ] ) )//あるかチェック return 0; return $wp_actions[$tag];//実行!!!!!!! }


カテゴリー

オレオレIT用語辞典