【PHP】WordPressのupdate_optionとトランジェントAPI

WordPressの保存回りの覚書です。

目次

WordPressのsubmit_button

保存ボタン(エラーError: The myplugin_settings options page is not in the allowed options list.)

何も設定しないと

submit_button();

save changesというボタンが表示されました。

submit_button('保存');

しかし、表示上は問題ありませんが、保存ボタンをおすとエラーがでます。

Error: The myplugin_settings options page is not in the allowed options list.

この問題は第2引数を指定すると解決します。

submit_button(__('保存', 'myplugin'));
// submit_button();

submit_button() 関数の第1引数にボタンに表示するテキストを指定することで、ボタンのラベルを変更できます。ただ、翻訳も考えると次のようになるようです。

submit_button(__('保存', 'your-plugin-textdomain'));

__() 関数は、WordPress の翻訳関数です。第1引数にテキストを指定し、第2引数にプラグインのテキストドメインを指定します。これにより、WordPress の言語設定に基づいて適切な翻訳が行われます。

プラグインのテキストドメインは、一般的にプラグインのフォルダ名(ディレクトリ名)と同じにするのが慣例となっています。

保存データの確認方法

localを使っています。loccalのDatabaseのタブから開くだけです。

wp_options > データ > 検索

から検索で、myplugin_textというフィールドIDをいれます。

【PHP】get_option、update_optionは使わず更新できる!?

WordPressのupdate_optionは少々ややこしかったので覚書です。プログラマならすぐこう理解するでしょう。

  • get_optionは値の取得
  • update_optionは値の更新

ただ、update_optionを使わずとも更新できるのです…。WordPressの特性の理解しないとハマるかも。

/**
 * プラグインの設定を登録
 */
function myplugin_register_settings() {
    // 'myplugin'ページに新しい設定セクション'myplugin_section'を追加
    add_settings_section(
        'myplugin_section',  // セクションのID
        '設定',              // セクションのタイトル
        null,                // セクションの説明を出力する関数。nullの場合、説明は表示されない。
        'myplugin'           // この設定セクションが属するページのスラッグ
    );

    // 'myplugin_section'セクションに新しい設定フィールド'myplugin_text'を追加
    add_settings_field(
        'myplugin_text',           // フィールドのID
        'テキスト',                // フィールドのラベル
        'myplugin_text_callback',  // フィールドのHTMLを出力する関数
        'myplugin',                // このフィールドが属するページのスラッグ
        'myplugin_section'         // このフィールドが属するセクションのID
    );

    // 'myplugin_settings'オプショングループに'myplugin_text'オプションを登録
    register_setting('myplugin_settings', 'myplugin_text');
}

// 'admin_init'アクションフックに'myplugin_register_settings'関数を登録
// これにより、WordPressは管理画面を初期化する際に'myplugin_register_settings'関数を呼び出す
add_action('admin_init', 'myplugin_register_settings');

/**
 * テキスト設定のHTMLを出力
 */
function myplugin_text_callback() {
    // 'myplugin_text'オプションの現在の値を取得。オプションが存在しない場合、デフォルト値として空文字列を使用。
    $text = get_option('myplugin_text', '');
    ?>
    <!-- テキスト入力フィールドを出力。nameは'myplugin_text'、valueは現在の設定値、スタイルは幅100% -->
    <input type="text" name="myplugin_text" value="<?php echo esc_attr($text); ?>" style="width:100%;">
    <?php
}

update_optionは直接使用されていませんが、WordPressの設定APIが裏でupdate_optionを使っています。

具体的には、register_setting('myplugin_settings', 'myplugin_text');という行が重要です。この行は、myplugin_textという設定項目をmyplugin_settingsという設定グループに登録します。これにより、WordPressは自動的にこの設定項目の値を保存・読み込みするためのロジックを生成します。

設定ページのフォームが送信されると(submit_buttonが押されると)、WordPressはoptions.phpページを呼び出します。このページは、登録された設定項目の値を自動的に検証し、update_optionを使って新しい値をデータベースに保存します。

そのため、プラグイン開発者はget_optionを使って設定値を読み込むことはしますが、update_optionを直接使う必要はありません。WordPressの設定APIがupdate_optionの役割を果たしているのです。

register_settingのデータはどこで受け渡されているのだろうと疑問に思うでしょう。簡単に理解するとこうです。

  1. register_settingで登録しておく
  2. options.phpが呼び出されると、コールバック関数でその登録先が呼び出されて登録データがすべて登録できる
  3. options.phpがupdate_optionを使ってデータベースに保存する

もう少し詳しく書くとこうです。

register_settingで設定項目を登録する

  • プラグインの初期化時(通常はadmin_initアクションフック)に、register_settingを使って設定項目を WordPress に登録します。
  • これにより、WordPress は設定項目の名前、デフォルト値、データベースのオプション名、検証用コールバック関数(オプション)を知ることができます。

設定ページのフォームからoptions.phpが呼び出される

  • 設定ページのフォームのaction属性がoptions.phpになっているため、フォームがサブミットされるとoptions.phpページが呼び出されます。
  • options.phpは、POSTデータから設定グループの名前を取得し、その設定グループに属する設定項目の情報を WordPress のオプションAPIから取得します。

options.phpが設定項目の新しい値を取得し、検証する

  • options.phpは、POSTデータから各設定項目の新しい値を取得します。
  • 次に、register_settingで登録された検証用コールバック関数(もしあれば)を使って、新しい値を検証します。

options.phpupdate_optionを使って新しい値をデータベースに保存する

  • 検証に合格した新しい値は、update_option関数を使ってデータベースに保存されます。
  • この際、register_settingで指定されたデータベースのオプション名が使われます。

WordPressのトランジェントAPIで一時保存!

トランジェントAPIはとても便利です。

トランジェントAPIの基礎知識:

  1. トランジェントは一時的なデータを保存するためのWordPressの機能です。
  2. キーと値のペアで保存され、有効期限を設定できます。
  3. 主な関数は以下の3つです:
    • set_transient($key, $value, $expiration): トランジェントを設定
    • get_transient($key): トランジェントを取得
    • delete_transient($key): トランジェントを削除

delete_thumbnail_transient関数の発火タイミング: この関数は以下のアクションフックに接続されています。

phpCopyadd_action('edit_post', 'delete_thumbnail_transient', 10, 1);
add_action('save_post', 'delete_thumbnail_transient', 10, 1);

これにより、以下のタイミングで発火します:

  1. 投稿が編集されたとき(edit_post
  2. 投稿が保存されたとき(save_post

つまり、投稿のタイトルが変更されたり、内容が更新されたりするたびに、この関数が呼び出されます。

set_transientとupdate_optionと の違い

  1. update_option:
    • データベースの wp_options テーブルにデータを永続的に保存します。
    • 有効期限がなく、明示的に削除されるまでデータは保持されます。
    • サイト全体で共有される設定やデータの保存に適しています。
    • 使用例:サイト設定、プラグイン設定など。
  2. set_transient:
    • 一時的なデータを保存するためのAPIです。
    • デフォルトではデータベースに保存されますが、オブジェクトキャッシュを使用している場合はメモリに保存されることもあります。
    • 有効期限を設定でき、期限が切れると自動的に削除されます。
    • 頻繁に変更される可能性のある一時的なデータの保存に適しています。
    • 使用例:API呼び出しの結果のキャッシュ、一時的な計算結果など。

主な違い:

  • 永続性:update_option は永続的、set_transient は一時的。
  • 有効期限:update_option にはなし、set_transient にはあり。
  • 用途:update_option は長期的な設定に、set_transient は短期的なキャッシュに適しています。
  • パフォーマンス:set_transient はキャッシュとして機能するため、頻繁なアクセスがある場合はより高速です。

update_post_meta

update_post_meta はデータベースに保存する関数です。具体的な仕様を説明します:

  1. 機能: update_post_meta は特定の投稿(ポスト、ページ、カスタム投稿タイプ)に関連するメタデータを更新または追加します。
  2. データベースの操作:
    • WordPress の wp_postmeta テーブルにデータを保存します。
    • 既存のメタキーが存在する場合は更新し、存在しない場合は新しく追加します。
  3. パラメータ: phpCopyupdate_post_meta($post_id, $meta_key, $meta_value, $prev_value = '')
    • $post_id: メタデータを関連付ける投稿のID
    • $meta_key: メタデータの識別子(キー)
    • $meta_value: 保存する値
    • $prev_value: (オプション)更新前の値。指定すると、その値と一致する場合のみ更新します。
  4. 戻り値:
    • 成功時は true
    • 失敗時は false
  5. 特徴:
    • 投稿固有のデータを保存するのに適しています。
    • 同じ $meta_key で複数の値を持つことができます(配列として保存)。

update_post_metaとupdate_optionの違い

  1. データの範囲:
    • update_post_meta: 特定の投稿に関連するデータを保存
    • update_option: サイト全体の設定やグローバルなデータを保存
  2. データベーステーブル:
    • update_post_meta: wp_postmeta テーブルを使用
    • update_option: wp_options テーブルを使用
  3. 使用例:
    • update_post_meta: 投稿固有の設定、カスタムフィールドの値など
    • update_option: サイト全体の設定、プラグインの設定値など
  4. データの取得:
    • update_post_meta で保存したデータは get_post_meta で取得
    • update_option で保存したデータは get_option で取得
  5. 複数値の扱い:
    • update_post_meta は同じキーで複数の値を持てる
    • update_option は通常、キーごとに1つの値のみ

これらの違いを理解することで、適切な場面で適切な関数を使用できます。投稿固有のデータには update_post_meta を、サイト全体の設定には update_option を使用するのが一般的です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次