日本語環境のwordpressテーマfunction.phpの先頭に書いておくことまとめ

いろいろ便利な関数とかあるけど、取得内容と関数名が一致しないのでグローバル変数を定義しちゃったほうがええんちゃう?ていう話です。

あと始めのほうはWordpressを日本語で動かすときの設定。一部のサーバではこれをしないと日時がおかしくなったりする。

グローバル変数でタイムスタンプを取得しているのは「必要な時に毎度毎度 time() 関数呼んでると、実行しているうちに時間が進んで同じ値にならないから」っていう理由。ログファイル名に使ったりセッションの生成に遣ったりいろいろ使う。

あと、Ajaxなんかを使うときには、各送信内容が意図しない文字コードにおなっている場合があるので早めに変換してしまう。

そのあとはWordpressの挙動調整用。

<?php

/**
 * ------------------------------------------------------------
 * 「日本語環境UTF-8だよ~」っていう設定。
 */
setlocale(LC_ALL, 'ja_JP');
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_detect_order('UTF-8,EUC-JP,eucjp-win,sjis-win,JIS,SJIS,ASCII');
mb_substitute_character('');
date_default_timezone_set('Asia/Tokyo');

/**
 * ------------------------------------------------------------
 * URLとかパスとか。
 */

// 現在参照されているURL。クエリ含む。
define('SELF_URL', $_SERVER["REQUEST_URI"]);
// 現在参照されている"正式な"URL。クエリ含む。
define('SELF_LINK', get_permalink());
// 親テーマへのパス。末尾のスラッシュ無し。
define('THEME_PATH', get_template_directory());
// 親テーマへのURL。末尾のスラッシュ無し。
define('THEME_URI', get_template_directory_uri());
// 現在のタイプスタンプ。
define('TIMESTAMP', time());

$upload_dir = wp_upload_dir();
// ベース url とサブディクレトリ(年月とか)を結合した URL、または upload ディレクトリの絶対 URL。
define('UPLOAD_URL', $upload_dir['url']);
// ベースディレクトリとサブディクレトリ(年月とか)を結合したパス、または upload ディクレトリのフルパス。
define('UPLOAD_DIR', $upload_dir['path']);
// サブディレクトリ(年月とか)を含まない URL パス。
define('UPLOAD_BASE_URL', $upload_dir['baseurl']);
// サブディレクトリ(年月とか)を含まないパス。
define('UPLOAD_BASE_DIR', $upload_dir['basedir']);

/**
 * ------------------------------------------------------------
 * 日本語文字コードの問題解決
 */

// 送信されてくる文字コードがバラバラなので独立して変換
mb_convert_variables('UTF-8', mb_detect_order(), $_GET);
mb_convert_variables('UTF-8', mb_detect_order(), $_POST);
mb_convert_variables('UTF-8', mb_detect_order(), $_FILES);

/**
 * ------------------------------------------------------------
 * WordPressの挙動
 */

// 日本語を強制
define('WPLANG', 'ja');

// プラグインとテーマの編集を無効化
define('DISALLOW_FILE_EDIT', true);

// 自動アップデートONに設定
define('WP_AUTO_UPDATE_CORE', true);
add_filter('auto_update_core', '__return_true');
add_filter('auto_update_plugin', '__return_true');
add_filter('auto_update_theme', '__return_true');
add_filter('auto_update_translation', '__return_true');
add_filter('auto_core_update_send_email', '__return_true');

/**
 * ------------------------------------------------------------
 * その他のWordpressの挙動(必要に応じてコメントアウト)
 */

// admin_bar 非表示
add_filter('show_admin_bar', '__return_false');

// 不要なprefetchタグを削除
remove_action('wp_head', 'dns-prefetch');
remove_action('wp_head', 'wp_resource_hints', 2);

// RSSを削除(パクリ対策)
remove_action('wp_head', 'feed_links');
remove_action('wp_head', 'feed_links_extra');

// 絵文字スクリプト削除
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
add_filter('emoji_svg_url', '__return_false');

// 不要なjson削除
remove_action('wp_head', 'rest_output_link_wp_head');

// 編集URLを削除
remove_action('wp_head', 'rsd_link');

// wlwmanifestを非表示
remove_action('wp_head', 'wlwmanifest_link');

// generator表示を削除
remove_action('wp_head', 'wp_generator');

// oembedを削除
remove_action('wp_head', 'wp_oembed_add_discovery_links');

その他セキュリティ関係の設定変更。xmlrpcとかwp-cronなんかをOFFにしている。プラグインの挙動を阻害する場合が多々あるのでご利用は慎重に。

<?php

/**
 * ------------------------------------------------------------
 * セキュリティ対策
 */

// xmlrpc攻撃対策
function theme_remove_x_pingback($headers)
{
    unset($headers['X-Pingback']);
    return $headers;
}
add_filter('wp_headers', 'theme_remove_x_pingback');
add_filter('xmlrpc_enabled', '__return_false');

// authorID攻撃対策
function theme_slug_redirect_author_archive()
{
    if (is_author()) {
        header("HTTP/1.0 404 Not Found");
        exit;
    }
}
add_action('template_redirect', 'theme_slug_redirect_author_archive');

// wp-corn無効化
// wp-cornを無効化すると自動アップデートがOFFになる
// define('DISABLE_WP_CRON', true);

// 404の場合に勝手にそれっぽいURLにリダイレクトされるのを防止
function theme_404_link($redirect_url, $requested_url)
{
    if (is_404()) {
        include THEME_PATH . '/404.php';
        exit;
    }
    return $redirect_url;
}
add_filter('redirect_canonical', 'theme_404_link', 10, 2);

仕事で使うときはこんな感じで積極的に機能を制限したり挙動を調整するんだけど、このブログは特にこだわりが無いのでほとんど生の状態のwordpressで運営してます。

質問・コメントなどあると嬉しいです