【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'という値がセットされます。
そして、Webページの表示時にautoloadフィールドの値が'yes'がセットされている全てのレコードが読み込まれます。
つまりautoloadフィールドの値を'yes'以外の文字列にセットしておけば、自動的に読み込まれないのです。
しかし、レコード登録時のautoloadフィールド値を設定できるような仕様になっていません。
そこで、レコードが登録された後に呼び出されるアクションフックで、autoloadを上書きします。
"update_option_{$id}": レコード上書き後に呼び出されるフック
autoloadを上書きは、autoloadフィールドを変更する関数が用意されていないので$wpdbオブジェクトでおこないます。
これらを適用すると、次のようにautoloadフィールドに'no'をセットできます。
これで、自動的に読み込まれなくなります。
更新日:2023/03/30
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。