テーマカスタマイズ API

$wp_customize(WP_Customize_Managerのインスタンス)のadd_settingでtypeをtheme_modに設定した場合、wp_optionsテーブルのoption_name列にtheme_mods_が、option_value列にはその値がシリアライズされて格納される(下記例ではtheme_mods_にsampleおよびsample2の値がまとめてシリアライズされて格納される)。

$wp_customize->add_setting(
    'sample',
    array(
        'default'           => 'default value',
        'type'              => 'theme_mod', // theme_modを指定した場合、wp_optionsのoption_nameがtheme_mods_のoption_valueにシリアライズして格納される
        'transport'         => 'refresh',
        'sanitize_callback' => '',
    )
);
// ...
$wp_customize->add_setting(
    'sample2',
    array(
        'default'           => 'default value',
        'type'              => 'theme_mod', // theme_modを指定した場合、wp_optionsのoption_nameがtheme_mods_のoption_valueにシリアライズして格納される
        'transport'         => 'refresh',
        'sanitize_callback' => '',
    )
);

Customizerのチェックボックス

  • チェックあり => 文字列'1'
  • チェックなし => 空文字''

シリアライズした値をMySQLから取り出す

$ mysql -u  -p -A  -h  -e 'select option_value from wp_options where option_name = "theme_mods_";' > theme_mods.txt
unserialize(  );

改行されたテキストがシリアライズされているときの対策

改行を含む文字列をそのままシリアライズしている場合、文字列長のカウントがずれてunserialize関数でエラーが発生することがある。

以下のサイトを参考に、いったんシリアライズし直してからunserializeする。

引用元: https://keruuweb.com/php-unserialize-error/

$data = preg_replace_callback( '!s:(\d+):"([\s\S]*?)";!', function ( $m ) {
    return 's:' . strlen( $m[2] ) . ':"' . $m[2] . '";';
}, $data );