<WordPress>カスタマイズ13選

 こんにちは、その日暮らしです。

 今回は、当ブログで実際に使っているWordPressのカスタマイズ例を13件紹介します。

 コピペフリーですので是非試してみてください。

[PR]
目次

wp-config.php編

デバッグモード

/** Enable debug mode and logging if the wp-config.debug-on file exists. */
if ( file_exists( __DIR__ . '/wp-config.debug-on' ) ) {
    /* Enable Debug mode */
    define( 'WP_DEBUG', true );
    /* Enable Debug logging to the /wp-content/debug.log file */
    define( 'WP_DEBUG_LOG', true );
    /* Disable display of errors and warnings */
    define( 'WP_DEBUG_DISPLAY', false );
    @ini_set( 'display_errors', 0 );
}

 デバッグログをファイルに記録するためのコードです。
 wp-config.phpがあるフォルダにwp-config.debug-onという名前のファイルが存在しているとデバッグモードが有効になり「wp-content」フォルダの下の「debug.log」ファイルにログが記録されるようになります。ログを記録するには以下のようなコードをログを出力したい箇所に追加します。

error_log('hogehoge');

 すると、以下のようにログが記録されます。

[25-Mar-2023 22:57:02 UTC] hogehoge

 なお、8行目と9行目はデバッグログがブラウザの画面に表示されないようにするためのコードです。デバッグログには機微な情報が含まれることがあるのでこのコードは必須です。

記事のリビジョンの停止

/** Disable post revisions */
define( 'WP_POST_REVISIONS', false );
/** Set the auto save interval to 86400 seconds */
define( 'AUTOSAVE_INTERVAL', 86400 );

 記事の更新時にリビジョンが保存されるのを停止するコードと記事の自動保存の間隔を1日にするコードです(個人的な趣味です)。2行目の「false」を数字に変えるとその数だけ記事のリビジョンが保存されるようになります。また、4行目では「86400」を他の数字に変えるとその秒数間隔で記事が自動で保存されるようになります。

functions.php編

sitemap.xml作成機能の無効化

// WordPress標準のsitemap.xml作成機能を無効にする。
add_filter('wp_sitemaps_enabled', '__return_false');

 WordPress5.5からsitemap.xmlの作成機能が標準で搭載されました。ただ、この機能で作成されるsitemap.xmlは、優先度や更新頻度や更新日の情報が含まれていません。そのため、当ブログでは、プラグイン「XML Sitemap Generator for Google」を使ってsitemap.xmlを作成しており、WordPressのsitemap.xml作成機能は無効化しています。

自動補完リダイレクトの無効化

// 前方一致による自動補完リダイレクトを無効にする。
add_filter('do_redirect_guess_404_permalink', '__return_false');
// 古いスラッグによる自動補完リダイレクトを無効にする。
remove_action('template_redirect', 'wp_old_slug_redirect');

 当ブログには、パーマリンクのスラッグが「20210922-python-matplotlib-logarithmic-graph」となっている記事と「20210922-python-matplotlib-logarithmic-graph-minor-ticks」となっている記事があります。前者が後者の前方一致になっています。このような場合、自動補完リダイレクトが有効だと、記事「20210922-python-matplotlib-logarithmic-graph」へのアクセスが記事「20210922-python-matplotlib-logarithmic-graph-minor-ticks」へリダイレクトされてしまいます。それが原因で記事「20210922-python-matplotlib-logarithmic-graph」がGoogleでインデックス化されないことがあり気づくのにずいぶんと時間がかかりました。このような不都合があるので前方一致による自動補完リダイレクトは無効にするのがおすすめです。

※ 2023/4/1現在上記現象は再現しなくなりました。前方一致部分が存在していないパーマリンクだった場合のみリダイレクトするようWordPress仕様が変わったのかもしれません。とはいえ意図しない結果となる可能性があるのでやはり無効にすることをお勧めします。

 また、WordPressでは、パーマリンクを変更した場合に古いスラッグがデータベース上に記録され古いパーマリンクによるURLでアクセスしても新しいパーマリンクへリダイレクトされます。これも意図しない結果となる可能性があるので無効にするのがおすすめです。

非公開記事の非表示

// 非公開の記事を管理者ログイン状態でも非表示にする。
function my_pre_get_posts_1($query) {
    // 管理者画面なら抜ける。
    if (is_admin())
        return;
    // プレビュー画面あるいはID指定の投稿ページあるいはID指定の固定ページなら抜ける。
    if (!empty($query->get('preview')) || !empty($query->get('p')) || !empty($query->get('page_id')))
        return;
    // クエリを公開状態に限定する。
    $query->set('post_status', 'publish');
}
add_action('pre_get_posts', 'my_pre_get_posts_1');

 記事の編集画面で「表示状態」を「非公開」にした記事が、管理者でログインした状態で表示したブログの記事一覧画面に表示されないようにするためのコードです(個人的な趣味です)。

特殊文字変換の無効化

// 記事のタイトルの特殊文字変換を無効にする。
remove_filter('the_title', 'wptexturize');
// 記事の本文の特殊文字変換を無効にする。
remove_filter('the_content', 'wptexturize');
// 記事の抜粋の特殊文字変換を無効にする。
remove_filter('the_excerpt', 'wptexturize');
// 記事のコメントの特殊文字変換を無効にする。
remove_filter('comment_text', 'wptexturize');

 記事のタイトルや本文や抜粋やコメント内にある「"」や「'」を勝手に全角に変換されないようにするためのコードです。これがないと、半角の「"」や「'」が全角の「”」や「’」に勝手に変換されてしまいます。技術系のブログなどでソースコードを紹介する場合には必須の設定です。

サイトヘルス警告の非表示

// WordPressのサイトヘルスで「永続オブジェクトキャッシュを使用してください」と表示されるのを止める。
add_filter('site_status_should_suggest_persistent_object_cache', '__return_false');
// WordPressのサイトヘルスで「ページキャッシュは検出されませんでしたが、サーバーのレスポンスは良好です」と表示されるのを止める。
function my_disable_test_to_see_if_page_caching_is_enabled($tests) {
    unset($tests['async']['page_cache']);
    return $tests;
}
add_filter('site_status_tests', 'my_disable_test_to_see_if_page_caching_is_enabled');

 WordPressのバージョンが6になってから管理者画面のサイトヘルスステータスに「永続オブジェクトキャッシュを使用してください」や「ページキャッシュは検出されませんでしたが、サーバーのレスポンスは良好です」が表示されるようになってしまいました。うざいので表示しないように設定しました。サーバ側のキャッシュはちゃんと効いているはずなので。

記事一覧ページ等のソート順の変更

// 各管理者画面のソート順を調整する。
function my_pre_get_posts_2($query) {
    // 管理者画面でなければ抜ける。
    if (!is_admin())
        return;
    // クエリストリングが存在していたら抜ける。
    if (count($_GET) > 0)
        return;
    // 投稿ページ一覧画面の場合。。。
    if ($query->get('post_type') === 'post') {
        // 投稿日の。。。
        if (empty($query->get('orderby')))
            $query->set('orderby', 'date');
        // 降順でソートする。
        if (empty($query->get('order')))
            $query->set('order', 'desc');
        // 抜ける。
        return;
    }
    // 固定ページ一覧画面の場合。。。
    if ($query->get('post_type') === 'page') {
        // タイトルの。。。
        if (empty($query->get('orderby')))
            $query->set('orderby', 'title');
        // 昇順でソートする。
        if (empty($query->get('order')))
            $query->set('order', 'asc');
        // 抜ける。
        return;
    }
    // グローバル変数を参照する。
    global $pagenow;
    // メディア一覧画面の場合。。。
    if ($pagenow === 'upload.php') {
        // ソート順が設定されていないなら。。。
        if (!array_key_exists('orderby', $_GET) && !array_key_exists('order', $_GET)) {
            // タイトルの降順でソートする。
            header('Location: ./upload.php?orderby=title&order=desc', true, 301);
            // 抜ける。
            return;
        }
    }
}
add_action('pre_get_posts', 'my_pre_get_posts_2');

 管理者画面において、記事一覧画面のソート順を「投稿日の降順」に、固定ページ一覧画面のソート順を「タイトルの昇順」に、メディアを「タイトルの降順」変更するためのコードです。「asc」を「desc」に変更するとソート順を降順にすることができます。

Contact Form 7とreCAPTCHAの無効化

// JavaScriptの読み込みを調整する。
function my_wp_dequeue_scripts() {
    // お問い合わせページ以外でContact Form 7を無効にする。
    if (!is_page(array('contact'))) {
        wp_dequeue_script('contact-form-7');
    }
    // お問い合わせページ以外でreCAPTCHAを無効にする。
    if (!is_page(array('contact'))) {
        wp_dequeue_script('wpcf7-recaptcha');
    }
}
add_action('wp_enqueue_scripts', 'my_wp_dequeue_scripts', 100);

 Lighthouse対策です。お問い合わせページ(スラッグは「contact」)以外でプラグイン「Contact Form 7」と「reCAPTCHA」の機能を無効化するコードです。各記事のコメント欄のスパム対策はプラグイン「SiteGuard WP Plugin」で行っているのでreCAPTCHAは不要との判断です。

// StyleSheetの読み込みを調整する。
function my_wp_dequeue_styles() {
    // お問い合わせページ以外でContact Form 7を無効にする。
    if (!is_page(array('contact'))) {
        wp_dequeue_style('contact-form-7');
    }
}
add_action('wp_enqueue_scripts', 'my_wp_dequeue_styles', 100);

 JavaScriptと同様StyleSheetも無効にします。

FancyBoxのJavaScriptの遅延ロード

// FancyBox関連のJavaScriptを遅延ロードする。
function my_script_loader_tag($tag, $handle, $src) {
    // FancyBox関連のJavaScriptなら。。。
    if (in_array($handle, array('fancybox-purify', 'jquery-fancybox', 'jquery-easing'))) {
        // <script>にdefer属性を付加する。
        $tag = preg_replace('/>/', ' defer>', $tag, 1);
    }
    return $tag;
}
add_filter('script_loader_tag', 'my_script_loader_tag', 10, 3);

 Lighthouse対策です。FancyBox関係のJavaScriptのロードタイミングをdeferにするためのコードです。Lighthouseでページを測定したときにFancyBoxのJavaScriptがページの読み込みをブロックしていると指摘されてしまったことに対する措置です。

FancyBoxのStyleSheetの遅延ロード

// FancyBox関連のStyleSheetを遅延ロードする。
function my_style_loader_tag($tag, $handle, $href, $media) {
    // FancyBox関連のStyleSheetなら。。。
    if (in_array($handle, array('fancybox'))) {
        $org = $tag;
        // media属性の値をprintとしておきロード後に本来の値に切り替える。
        if (preg_match('|([\s\S]*)<link\s+(.*?)\s+media=(["\'])(.*?)\3\s+(.*?)\s*/>([\s\S]*)|', $tag, $matches) === 1) {
            $tag = "{$matches[1]}<link {$matches[2]}";
            $tag .= $matches[5] === '' ? '' : " {$matches[5]}";
            $tag .= " media='print'";
            $tag .= ' onload="this.media=';
            $tag .= htmlspecialchars("'{$matches[4]}'");
            $tag .= '" />' . "{$matches[6]}";
            $tag .= '<noscript>' . trim($org) . '</noscript>' . "\n";
        }
    }
    return $tag;
}
add_filter('style_loader_tag', 'my_style_loader_tag', 10, 4);

 Lighthouse対策です。FancyBox関係のStyleSheetの適用をページのロード後にするためのコードです。Lighthouseでページを測定したときにFancyBoxのStyleSheetがページの読み込みをブロックしていると指摘されてしまったことに対する措置です。

メンテナンスモード

// ただいまメンテナンス中です・・・。
// function maintenance_mode() {
//     if (!current_user_can('manage_options')) {
//         wp_die('ただいまメンテナンス中です・・・。');
//     }
// }
// add_action('get_header', 'maintenance_mode');

 2行目以降のコメントを外すとサイトのどのページにアクセスしてもエラーメッセージ「ただいまメンテナンス中です・・・。」が表示されるようにするためのコードです。サイトに対してなにか大掛かりな改修を行う場合を想定し、普段からこのコードをコメントアウトした状態で追加してあります。

footer.php編

JavaScriptとStyleSheetの一覧

<!-- <?php
// 管理者としてログインしている場合にScriptとStyleの一覧を表示する。
if (is_user_logged_in() && current_user_can('manage_options')) {
    my_print_scripts_and_styles('Scripts', wp_scripts());
    my_print_scripts_and_styles('Styles', wp_styles());
}

// ScriptとStyleの一覧を表示する。
function my_print_scripts_and_styles($title, $resources) {
    echo '<p style="margin:10px 0 5px 0;padding:0;">*** ' . $title . ' ***</p>';
    echo '<ol style="margin:0;padding:0 0 0 30px;">';
    foreach ($resources->queue as $handle)
        my_print_scripts_and_styles_helper($resources->registered[$handle]);
    echo '</ol>';
}

// ScriptとStyleの一覧を表示するヘルパー関数。
function my_print_scripts_and_styles_helper($registered) {
    $li = '<li style="list-style-type:decimal;">';
    $li .= 'handle: ' . $registered->handle . '<br>';
    $li .= 'src: ' . $registered->src . '<br>';
    $li .= 'deps: ' . implode(", ", $registered->deps) . '<br>';
    $li .= 'args: '. $registered->args . '<br>';
    $li .= 'before: ' . (isset($registered->extra['before']) ? 'exists' : 'not exists') . '<br>';
    $li .= 'after: ' . (isset($registered->extra['after']) ? 'exists' : 'not exists') . '<br>';
    $li .= '</li>';
    echo $li;
}
?> -->

 管理者でログインしている場合に登録されているJavaScriptとStyleSheetのハンドル名などを一覧するコードです。必要なときにコメントを外すことでJavaScriptとStyleSheetのハンドル名をフッターに一覧表示することができます。JavaScriptやStyleSheetごとになにかカスタマイズ処理を行うときにハンドル名が必要になるので重宝すると思います。


 以上、「WordPressのカスタマイズ13選」でした。

コメント

コメントする

コメントは日本語で入力してください(スパム対策)。

CAPTCHA

目次