管理メニュー

PHP

【WordPress】opttionsテーブルの自動読み込み(autoload)をオフにする方法

更新日:2023/03/30

WordPressの管理画面で設定した項目はoptionsテーブルに保存されます。
そしてWebページの表示時に全ての項目が自動的に読み込まれます。
複数の項目を一つ一つロードするのは非効率なので、理にかなっていますね。

しかし例えばサイトマップページやカテゴリページなど、あまりアクセスが無いページで使用する項目は除外して欲しいです。

そこで今回は、optionsテーブルの個別のレコード毎に自動読み込み機能をオフにする方法をお伝えします。

 

autoload機能をオフにするコード

opttionsテーブルの自動読み込み機能は、次のコードでオフにできます。

add_action("add_option_{$id}",function( $option , $value){
        set_option_autoload( $option , 'no');
},10,2);

add_action("update_option_{$id}",function($old_value, $value, $option){
        set_option_autoload( $option , 'no');
},10,3);

function set_option_autoload( $option_name , $autoload){
	global $wpdb;
	$wpdb->update( $wpdb->options, array('autoload'=>$autoload), array( 'option_name' => $option_name ) );
}

$idはオプション名です。

一連の管理画面追加コードに上記のコードを組みこむと、次のようになります。

add_action('admin_menu', function(){
    add_menu_page( 'myメニュー' , 'myメニュー' , 'manage_options' , 'my_menu'
			  , 'echo_my_menu' , '' , 3 );
});

add_action( 'admin_init', function(){
    $id = 'my_option_1';
    register_setting( 'my_option_group' , $id );
	
    add_action("add_option_{$id}",function( $option , $value){
        set_option_autoload( $option , 'no');
    },10,2);

    add_action("update_option_{$id}",function($old_value, $value, $option){
        set_option_autoload( $option , 'no');
    },10,3);
});

function set_option_autoload( $option_name , $autoload){
    global $wpdb;
    $wpdb->update( $wpdb->options, array('autoload'=>$autoload), array( 'option_name' => $option_name ) );
}

function echo_my_menu() {
    ?>
    <div class="wrap">
        <h2>myメニュー</h2>
        <form method="post" action="options.php">
    <?php 
        settings_fields( 'my_option_group' );
    ?>
    <table class="form-table">
        <tr><th scope="row" >項目1</th>
        <td>
        <?php $value = esc_textarea( get_option('my_option_1','') ); ?>
        <textarea id="my_option_1" name="my_option_1" cols="160" rows="7"><?= $value ?></textarea>
        </td></tr>
        </table>
        <?php submit_button(); ?>
        </form>
    </div>
<?php
}

このコードを適用すると、次のような管理画面がWordPressに追加されます。

作成した管理画面

 

解説

WordPressは管理画面を作成するための関数が用意されていて、独自の設定項目を簡単に追加できます。

作成方法は次のページを読んでみてください
【WordPress】管理画面に自作管理メニューとサブメニューを追加する方法

この方法で追加された設定項目はoptionsテーブルに登録されます。
その際、autoloadフィールドに'yes'という値がセットされます。

autoloadフィールドに'yes'がセットされた様子

そして、Webページの表示時にautoloadフィールドの値が'yes'がセットされている全てのレコードが読み込まれます。
つまりautoloadフィールドの値を'yes'以外の文字列にセットしておけば、自動的に読み込まれないのです。

しかし、レコード登録時のautoloadフィールド値を設定できるような仕様になっていません。
そこで、レコードが登録された後に呼び出されるアクションフックで、autoloadを上書きします。

"add_option_{$id}": レコード追加後に呼び出されるフック
"update_option_{$id}": レコード上書き後に呼び出されるフック

autoloadを上書きは、autoloadフィールドを変更する関数が用意されていないので$wpdbオブジェクトでおこないます。

これらを適用すると、次のようにautoloadフィールドに'no'をセットできます。

autoloadフィールドの値を'no'に変更した結果

これで、自動的に読み込まれなくなります。

WordPressはHTMやCSSの知識も必要。総合的な知識を身につけよう。

更新日:2023/03/30

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。