WordPress検証コード

# 概要
WordPressのテーマ・プラグインの検証をするときによく使うコードをまとめます。
開発よりもむしろ全体的なチューニングでよく使うものです。

## ログ出力
ログをファイルに書き出す。
`/wp-content/debug.log` にログが書き出される。

これを`wp-config.php`に書く

```php
define( 'WP_DEBUG', true );
if ( WP_DEBUG ) {
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', true );
    @ini_set( 'display_errors', 1 );
    define( 'SAVEQUERIES', true );
}
```

ログ出力

```php
error_log('test message');
```

## Hook
### 掛かっているフックを調べる
現状どのようなフックが掛かっているかを確認する。
ある程度は何がどんなフックをかけているか把握できる。

```php
add_action('wp_footer', function(){
	global $wp_filter;
	echo "<pre>";
	var_dump($wp_filter['wp_footer']);
	echo "</pre>";
});
```

### どのタイミングで起こるのかを確認

[WordPressの基本的なアクションフック](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7)が始まるごとにログを出力する。結構力技。

テーマのfunctions.php上ではロードが遅いので、プラグインから動かすのがおすすめ。

```php
add_action('muplugins_loaded',function(){error_log('[hook] muplugins_loaded');},0);
add_action('registered_taxonomy',function(){error_log('[hook] registered_taxonomy');},0);
add_action('registered_post_type',function(){error_log('[hook] registered_post_type');},0);
add_action('plugins_loaded',function(){error_log('[hook] plugins_loaded');},0);
add_action('sanitize_comment_cookies',function(){error_log('[hook] sanitize_comment_cookies');},0);
add_action('setup_theme',function(){error_log('[hook] setup_theme');},0);
add_action('load_textdomain',function(){error_log('[hook] load_textdomain');},0);
add_action('after_setup_theme',function(){error_log('[hook] after_setup_theme');},0);
add_action('auth_cookie_malformed',function(){error_log('[hook] auth_cookie_malformed');},0);
add_action('auth_cookie_valid',function(){error_log('[hook] auth_cookie_valid');},0);
add_action('set_current_user',function(){error_log('[hook] set_current_user');},0);
add_action('init',function(){error_log('[hook] init');},0);
add_action('register_sidebar',function(){error_log('[hook] register_sidebar');},0);
add_action('wp_register_sidebar_widget',function(){error_log('[hook] wp_register_sidebar_widget');},0);
add_action('wp_default_scripts',function(){error_log('[hook] wp_default_scripts');},0);
add_action('wp_default_styles',function(){error_log('[hook] wp_default_styles');},0);
add_action('admin_bar_init',function(){error_log('[hook] admin_bar_init');},0);
add_action('add_admin_bar_menus',function(){error_log('[hook] add_admin_bar_menus');},0);
add_action('wp_loaded',function(){error_log('[hook] wp_loaded');},0);
add_action('parse_request',function(){error_log('[hook] parse_request');},0);
add_action('send_headers',function(){error_log('[hook] send_headers');},0);
add_action('parse_query',function(){error_log('[hook] parse_query');},0);
add_action('pre_get_posts',function(){error_log('[hook] pre_get_posts');},0);
add_action('posts_selection',function(){error_log('[hook] posts_selection');},0);
add_action('wp',function(){error_log('[hook] wp');},0);
add_action('template_redirect',function(){error_log('[hook] template_redirect');},0);
add_action('get_header',function(){error_log('[hook] get_header');},0);
add_action('wp_enqueue_scripts',function(){error_log('[hook] wp_enqueue_scripts');},0);
add_action('twentyeleven_enqueue_color_scheme',function(){error_log('[hook] twentyeleven_enqueue_color_scheme');},0);
add_action('wp_head',function(){error_log('[hook] wp_head');},0);
add_action('wp_print_styles',function(){error_log('[hook] wp_print_styles');},0);
add_action('wp_print_scripts',function(){error_log('[hook] wp_print_scripts');},0);
add_action('get_search_form',function(){error_log('[hook] get_search_form');},0);
add_action('loop_start',function(){error_log('[hook] loop_start');},0);
add_action('the_post',function(){error_log('[hook] the_post');},0);
add_action('get_template_part_content',function(){error_log('[hook] get_template_part_content');},0);
add_action('loop_end',function(){error_log('[hook] loop_end');},0);
add_action('get_sidebar',function(){error_log('[hook] get_sidebar');},0);
add_action('dynamic_sidebar',function(){error_log('[hook] dynamic_sidebar');},0);
add_action('get_search_form',function(){error_log('[hook] get_search_form');},0);
add_action('pre_get_comments',function(){error_log('[hook] pre_get_comments');},0);
add_action('wp_meta',function(){error_log('[hook] wp_meta');},0);
add_action('get_footer',function(){error_log('[hook] get_footer');},0);
add_action('get_sidebar',function(){error_log('[hook] get_sidebar');},0);
add_action('twentyeleven_credits',function(){error_log('[hook] twentyeleven_credits');},0);
add_action('wp_footer',function(){error_log('[hook] wp_footer');},0);
add_action('wp_print_footer_scripts',function(){error_log('[hook] wp_print_footer_scripts');},0);
add_action('admin_bar_menu',function(){error_log('[hook] admin_bar_menu');},0);
add_action('wp_before_admin_bar_render',function(){error_log('[hook] wp_before_admin_bar_render');},0);
add_action('wp_after_admin_bar_render',function(){error_log('[hook] wp_after_admin_bar_render');},0);
add_action('shutdown',function(){error_log('[hook] shutdown');},0);
```

## スタイル・スクリプト

### キューされているスクリプト一覧を見る

```php
add_action( 'wp_print_scripts', function() {
    echo "<pre>";
    var_dump(wp_scripts()->queue);
    echo "</pre>";
}, 0);
```
スタイル

```php

add_action( 'wp_print_scripts', function() {
    echo "<pre>";
    var_dump(wp_styles()->queue);
    echo "</pre>";
}, 100);

```

## ポストメタ

```php

add_action('add_meta_boxes', function(){
    add_meta_box(
        'asashimo',
        'post_metas',
        'asashimo_render',
        null,
        'normal',
        'high',
    );
});

function asashimo_render() {
    echo "<pre>";
    var_dump(get_post_meta(get_the_ID()));
    echo "</pre>";
}
```

## JS

おまけ

## スクロール量検出
```php
add_action('wp_footer', function(){
    ?>
    <div
        id="asashimo"
        style="
            position: fixed;
            left: 0;
            background-color: yellow;
            width: 10em;
            height: 55px;
            padding: 5px;
        "
    >
        <span id="asashimo_scroll_y"></span><br/>
        <span id="asashimo_width"></span>
    </div>
    <script type="text/javascript">
        ;(function(){
            let fix = () => {
                document.getElementById('asashimo').style.top = window.innerHeight - 80 + 'px';
            }
            let w = () => {
                document.getElementById('asashimo_width').innerHTML = 'width: ' + window.innerWidth + 'px';
            }
            let y = () => {
                document.getElementById('asashimo_scroll_y').innerHTML = 'scroll-y: ' + window.pageYOffset + 'px';
            }
            window.addEventListener('DOMContentLoaded', fix, false);
            window.addEventListener('DOMContentLoaded', w, false);
            window.addEventListener('DOMContentLoaded', y, false);
            window.addEventListener('resize', fix, false);
            window.addEventListener('resize', w, false);
            window.addEventListener('scroll', y, false);
        })();
    </script>
    <?php
});
```