情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

WordPress:add_action / add_filter で登録した全 action / filter の一覧を表示する方法

WordPress (80) WordPressプラグイン (26)

WordPressプラグインをいろいろと入れているうちに、headタグの中身がどんどん増えて、ページ読込速度の負担になってしまうことがあります。

明らかに無駄なCSSや、JavaScriptを読み込んでいたり、プラグイン由来の余分な行は、どうせなら削除したいのですが、その行だけを見ても、どのプラグイン由来で出力されているのかはよくわかりません

今回は、headタグの中身(wp_head())を出力しているプラグインを特定するための情報収集方法として、add_actionやadd_filterで登録したaction/filterの一覧を表示する方法を紹介します

wp_head()

テンプレートのヘッダには、「wp_head()」という関数があると思います。

ここで、各テンプレートのヘッダに書き込みたい内容が呼び出され、次々とlinkタグやscriptタグ、metaタグなどのヘッダの行数が増えていく仕組みです。

もっと具体的には、add_actionで、wp_headに対して関数が事前登録されており、wp_headでは、その登録済みの関数を、do_actionで順番に呼び出している、という具合です。

したがって、wp_headに対して登録済みのactionに相当する関数の出所が分かれば大きなヒントとなります。

actionだけど$wp_filter

というわけで、action一覧をどうやって表示すればいいのか、という話になるのですが、action一覧は$wp_filterというグローバル変数に格納されています。

実は$wp_actionsという変数もあるのですが、actionとして登録される関数自体はfilterとして登録される関数と一緒に$wp_filterに格納されてしまう仕組みになっています。

$wp_filterは配列で、wp_head用のactionは$wp_filter['wp_head']を次のようにして出力することで、登録されている関数に関する情報一覧が表示できます。

<?php echo '<!--'; var_dump ( $wp_filter['wp_head'] ); echo '-->'; ?>

こんな行をテンプレートに仕込めば、HTMLに、コメントアウトされた状態でactionの中身出力されます。

$wp_filter['wp_head']の中身

array(6) {
  [1]=>
  array(3) {
    ["wp_enqueue_scripts"]=>
    array(2) {
      ["function"]=>
      string(18) "wp_enqueue_scripts"
      ["accepted_args"]=>
      int(1)
    }
    ["noindex"]=>
    array(2) {
      ["function"]=>
      string(7) "noindex"
      ["accepted_args"]=>
      int(1)
    }
    ["remove_widget_action"]=>
    array(2) {
      ["function"]=>
      string(20) "remove_widget_action"
      ["accepted_args"]=>
      int(1)
    }
  }
  [2]=>
  array(1) {
    ["feed_links"]=>
    array(2) {
      ["function"]=>
      string(10) "feed_links"
      ["accepted_args"]=>
      int(1)
    }
  }
  [3]=>
  array(1) {
    ["feed_links_extra"]=>
    array(2) {
      ["function"]=>
      string(16) "feed_links_extra"
      ["accepted_args"]=>
      int(1)
    }
  }
  [8]=>
  array(1) {
    ["wp_print_styles"]=>
    array(2) {
      ["function"]=>
      string(15) "wp_print_styles"
      ["accepted_args"]=>
      int(1)
    }
  }
  [9]=>
  array(1) {
    ["wp_print_head_scripts"]=>
    array(2) {
      ["function"]=>
      string(21) "wp_print_head_scripts"
      ["accepted_args"]=>
      int(1)
    }
  }
  [10]=>
  array(11) {
    ["rsd_link"]=>
    array(2) {
      ["function"]=>
      string(8) "rsd_link"
      ["accepted_args"]=>
      int(1)
    }
    ["wlwmanifest_link"]=>
    array(2) {
      ["function"]=>
      string(16) "wlwmanifest_link"
      ["accepted_args"]=>
      int(1)
    }
    ["adjacent_posts_rel_link_wp_head"]=>
    array(2) {
      ["function"]=>
      string(31) "adjacent_posts_rel_link_wp_head"
      ["accepted_args"]=>
      int(0)
    }
    ["locale_stylesheet"]=>
    array(2) {
      ["function"]=>
      string(17) "locale_stylesheet"
      ["accepted_args"]=>
      int(1)
    }
    ["wp_generator"]=>
    array(2) {
      ["function"]=>
      string(12) "wp_generator"
      ["accepted_args"]=>
      int(1)
    }
    ["rel_canonical"]=>
    array(2) {
      ["function"]=>
      string(13) "rel_canonical"
      ["accepted_args"]=>
      int(1)
    }
    ["wp_shortlink_wp_head"]=>
    array(2) {
      ["function"]=>
      string(20) "wp_shortlink_wp_head"
      ["accepted_args"]=>
      int(0)
    }
    ["fancybox"]=>
    array(2) {
      ["function"]=>
      string(8) "fancybox"
      ["accepted_args"]=>
      int(1)
    }
    ["a43d5b40ea6c9a4bf76089f6a852f623wp_head"]=>
    array(2) {
      ["function"]=>
      array(2) {
        [0]=>
        &object(HeadSpace2)#199 (7) {
          ["modules"]=>
          object(HSM_ModuleManager)#198 (2) {
            ["modules"]=>
            array(5) {
              ["hsm_pagetitle"]=>
              object(HSM_PageTitle)#197 (6) {
                ["page_title"]=>
                string(45) "情報科学屋さんを目指す人のメモ"
                ["separator"]=>
                string(0) ""
                ["force"]=>
                bool(false)
                ["position"]=>
                string(6) "before"
                ["max_length"]=>
                int(0)
                ["headspace"]=>
                NULL
              }
              ["hsm_description"]=>
              object(HSM_Description)#196 (3) {
                ["description"]=>
                NULL
                ["max_length"]=>
                int(150)
                ["headspace"]=>
                NULL
              }
              ["hsm_tags"]=>
              object(HSM_Tags)#195 (9) {
                ["tags"]=>
                string(0) ""
                ["show_post"]=>
                string(5) "never"
                ["show_page"]=>
                string(5) "never"
                ["append"]=>
                bool(true)
                ["zone_tag"]=>
                bool(true)
                ["force_tag_search"]=>
                bool(false)
                ["disable_suggest"]=>
                bool(false)
                ["zone_tag_key"]=>
                string(76) "QeXfUYfV34GcpUS9TaSfy8kEtcMb8GVMq7Z0hPi1s4rBUQVTU8NSoHApm_m80DJQkkNj29p2Dfc-"
                ["headspace"]=>
                NULL
              }
              ["hsm_javascript"]=>
              object(HSM_JavaScript)#194 (2) {
                ["scripts"]=>
                NULL
                ["headspace"]=>
                NULL
              }
              ["hsm_stylesheet"]=>
              object(HSM_Stylesheet)#193 (3) {
                ["stylesheets"]=>
                array(0) {
                }
                ["disable"]=>
                bool(false)
                ["headspace"]=>
                NULL
              }
            }
            ["active"]=>
            array(5) {
              [0]=>
              object(HSM_PageTitle)#197 (6) {
                ["page_title"]=>
                string(45) "情報科学屋さんを目指す人のメモ"
                ["separator"]=>
                string(0) ""
                ["force"]=>
                bool(false)
                ["position"]=>
                string(6) "before"
                ["max_length"]=>
                int(0)
                ["headspace"]=>
                NULL
              }
              [1]=>
              object(HSM_Description)#196 (3) {
                ["description"]=>
                NULL
                ["max_length"]=>
                int(150)
                ["headspace"]=>
                NULL
              }
              [2]=>
              object(HSM_Tags)#195 (9) {
                ["tags"]=>
                string(0) ""
                ["show_post"]=>
                string(5) "never"
                ["show_page"]=>
                string(5) "never"
                ["append"]=>
                bool(true)
                ["zone_tag"]=>
                bool(true)
                ["force_tag_search"]=>
                bool(false)
                ["disable_suggest"]=>
                bool(false)
                ["zone_tag_key"]=>
                string(76) "QeXfUYfV34GcpUS9TaSfy8kEtcMb8GVMq7Z0hPi1s4rBUQVTU8NSoHApm_m80DJQkkNj29p2Dfc-"
                ["headspace"]=>
                NULL
              }
              [3]=>
              object(HSM_JavaScript)#194 (2) {
                ["scripts"]=>
                NULL
                ["headspace"]=>
                NULL
              }
              [4]=>
              object(HSM_Stylesheet)#193 (3) {
                ["stylesheets"]=>
                array(0) {
                }
                ["disable"]=>
                bool(false)
                ["headspace"]=>
                NULL
              }
            }
          }
          ["site"]=>
          object(HS_SiteManager)#192 (2) {
            ["modules"]=>
            array(0) {
            }
            ["active"]=>
            array(0) {
            }
          }
          ["disabled"]=>
          bool(false)
          ["plugin_name"]=>
          string(9) "headspace"
          ["plugin_base"]=>
          string(51) "/wp/wp-content/plugins/headspace2"
          ["version_url"]=>
          NULL
          ["meta"]=>
          array(1) {
            ["page_title"]=>
            string(45) "情報科学屋さんを目指す人のメモ"
          }
        }
        [1]=>
        string(7) "wp_head"
      }
      ["accepted_args"]=>
      int(1)
    }
    ["6a481ae43e04dc6f803cc493c64829b4wpp_print_ajax"]=>
    array(2) {
      ["function"]=>
      array(2) {
        [0]=>
        &object(WordPressPopularPosts)#2045 (17) {
          ["version"]=>
          string(5) "2.3.2"
          ["qTrans"]=>
          bool(false)
          ["postRating"]=>
          bool(false)
          ["thumb"]=>
          bool(true)
          ["pluginDir"]=>
          string(62) "http://did2memo.net/wp-content/plugins/wordpress-popular-posts"
          ["charset"]=>
          string(5) "UTF-8"
          ["magicquotes"]=>
          int(1)
          ["default_thumbnail"]=>
          string(75) "http://did2memo.net/wp-content/plugins/wordpress-popular-posts/no_thumb.jpg"
          ["user_ops"]=>
          array(2) {
            ["stats"]=>
            array(2) {
              ["order_by"]=>
              string(5) "views"
              ["limit"]=>
              string(2) "10"
            }
            ["tools"]=>
            array(4) {
              ["ajax"]=>
              bool(false)
              ["css"]=>
              bool(true)
              ["stylesheet"]=>
              bool(true)
              ["thumbnail"]=>
              array(2) {
                ["source"]=>
                string(8) "featured"
                ["field"]=>
                string(0) ""
              }
            }
          }
          ["id_base"]=>
          string(3) "wpp"
          ["name"]=>
          string(23) "Wordpress Popular Posts"
          ["widget_options"]=>
          array(2) {
            ["classname"]=>
            string(13) "popular-posts"
            ["description"]=>
            string(36) "The most Popular Posts on your blog."
          }
          ["control_options"]=>
          array(3) {
            ["id_base"]=>
            string(3) "wpp"
            ["width"]=>
            int(250)
            ["height"]=>
            int(350)
          }
          ["number"]=>
          int(2)
          ["id"]=>
          string(5) "wpp-2"
          ["updated"]=>
          bool(false)
          ["option_name"]=>
          string(10) "widget_wpp"
        }
        [1]=>
        string(14) "wpp_print_ajax"
      }
      ["accepted_args"]=>
      int(1)
    }
    ["ogp__open_graph_prowp_head"]=>
    array(2) {
      ["function"]=>
      array(2) {
        [0]=>
        &string(19) "ogp__open_graph_pro"
        [1]=>
        string(7) "wp_head"
      }
      ["accepted_args"]=>
      int(1)
    }
  }
}

arrayの中身が表示され、1から順番に[1][2][3]のようになっている、一つ一つが、wp_headに登録された関数です。

そして、関数は上から(数字の小さい順に)呼ばれます。

したがって、これとheadの中身を見比べて前後が分かれば、とある行がどのプラグインから出力されているのかを推測することができます。

かなり長いですが、よく見ると、各関数名が表示されているので、プラグイン名がだいたいわかるものが多いと思います。分からないものでも、その関数名を頼りに検索すれば、WordPress標準のものだとか、どのプラグインのものだとかがわかります。

まとめ

今回は、wp_headを始めとする、add_action/add_filterされた関数の一覧を取得する方法を紹介しました。今回は特定のタグ('wp_head'など)の表示方法を紹介しましたが、「var_dump( $wp_filter );」とすれば、登録済みの全action/filterを一括表示することも可能です。

コメント(1)

  1. ブランドコピー
    2014年10月10日(金) 23:55

新しいコメントを投稿