web-dev-qa-db-ja.com

保存された値の代わりに空白の値を返すget_theme_modの問題

私は、最新バージョンのWordpressのget_theme_mod関数に関して、かなり厄介な問題と思われるものがあります。特定のサーバー(Wordpressのすべての要件を満たしているサーバー)でのみ、関数がデータベースに保存されているのを確認できる保存された値を返しません。ただし、関数にデフォルト値を指定した場合は、常に2番目の引数からデフォルト値が返されます。

サーバーはすべてPHP 5.3以上、および必要なMySQLバージョン以上を実行しているので、ここでは本当に困惑しています。すべての環境はPHPとApacheで、内部にも中間にも何もありません。これは一貫したエラーではないようです、それはこれが起こっているように思われる特定のサーバーでのみです。

私は自分のプロジェクトと問題のあるサーバーでWordpressテーマカスタマイズAPIを利用していますが、次のことに気付いています。

  • テーマカスタマイズAPIプレビューペインで変更を加えると、それらが反映されます。ただし、プレビューウィンドウでサイトの別の部分に移動すると(リンクをクリックするなどして)、デフォルト値に戻ります。更新を押すと、すべてがデフォルト値に戻ります。
  • Chromeデベロッパーツールの[ネットワーク]タブでAJAXリクエストを確認すると、データが正しく送信され、サーバーから200のレスポンスコードが返信されていることがわかります。
  • 保存されたシリアル化されたデータを格納する適切なデータベーステーブル行を調べると、実際には正しく保存されていることがわかりますが、get_theme_mod()関数を使用した場合は返されません。
  • 何が返されるのかを確認するために、関数 "Get_theme_mods()"から内容をダンプしようとしましたが、何も得られません(絶対に何も返されません)。ただし、これを稼働中のサーバーで実行すると、適切な内容が返されます。
  • すべてのテーマカスタマイズAPIの値は、ドキュメントが示唆するとおりに定義されており、設定タイプを "theme_mod"に設定することはできません(とにかくtheme_modがデフォルトです)。
  • 関数呼び出しの前にset_theme_modを追加して手動で値を設定した場合にget_theme_mod()を呼び出そうとすると、それは保存され、get_theme_mod関数はその直前に保存された値を取得します。これは、変更が一時的に保存されているだけのように動作しているように見えることを意味します(たとえDBが別の言い方をしても)。

また、テーマオプションのいずれかを上書きしたり、それらが返されないようにしたりする可能性のあるプラグインもインストールもアクティブ化もしていません。私の唯一の結論は、get_option関数が他の場所にあるのと同じように、それが何らかのWebホストレベルキャッシング(おそらくAPC)またはおそらくWordpress自身がオプションをキャッシングすること(私はget_theme_modと思う)に関連するということです。

コードが必要な場合は、必要なものをお知らせください(よくわかりません)。

編集**

呼び出されているget_theme_mod関数の内容に対してvar_dumpを実行したところ、次のようになりました(全部ではなく、かなりの数で実行されました)。コロンの前のラベルは、どんな値が何であるかを示すためのものです。

Texture: string(4) "none" 
Background Color: string(0) "" 
Theme Color: string(7) "#FF0000" 
Body Font: string(0) "" 
Heading Font: string(0) "" 

欲求不満のために、私は以下のコードも試しました、そして、何も返されません:

$options = get_option("theme_mods_aphrodite");

var_dump($options);

この結果得られる結果はブール値です(false)。

私が試したもう一つのことは、デフォルトのTwenty Twelveテーマカスタマイザを使用してそれがうまくいったということでした、それで私のテーマのどこかで何かオプション行を破壊してそれが機能しないようにすることです。しかし、それを奇妙にしているのは、私が問題としているテーマは、私が試した他のサーバーでもうまく機能するということです。それは、特定の孤立したインシデントのみで、データベーステーブルは完全です。

編集#2 **

以下で示唆されるように、私は私のテーマカスタマイズコードを別のテーマに貼り付けました(それは箱から出してうまくいくのでTwenty Twelveを選びました)そしてそれは私のレジスタコードがカスタマイザを壊しているように見えます。

4

私は同じ問題を抱えていました。type=optionを使用してからget_optionを使用しても動作しません。

別のオプション項目でテストして動作します。そしてitemの括弧なしでMYTHEMENAME_THEME_OPTIONでテストして配列を取得したので正しい方法だと思います。

だから、この記事を見つけたがそれでも空白の値を得た人のためのちょっとしたヒント..あなたがこのコードを使うとき:

$wp_customize->add_setting('mytheme[mytext]', array(
    'default'        => 'some value you want default',
    'capability'     => 'edit_theme_options',
    'type'           => 'option',
));

$wp_customize->add_control('textControl', array(
    'label'      => __('LabelText', 'mytheme'),
    'section'    => 'parameters_thrive',
    'settings'   => 'mytheme[mytext]',  ));

それから仕事を得るためにあなたは個々の値として各設定を使う必要があります、

$wp_customize->add_setting('mytext', array(
    'default'        => 'some value you want default',
    'capability'     => 'edit_theme_options',
    'type'           => 'option',
));

$wp_customize->add_control('textControl', array(
    'label'      => __('LabelText', 'mytheme'),
    'section'    => 'parameters_thrive',
    'settings'   => 'mytext',   ));

ここでsetting = myTextは配列ではなく(wasmytheme[mytext]より前)は単一の項目/値、文字列のようになりました。先に進み、get_option()関数を使用して、必要な値を使用してください。

3
user39067

私は決してget_theme_modがうまくいかなかった理由を解明しませんでした、しかし私は他の誰かが同様の状況で自分自身を見つけた場合にこの迷惑なバグを解決するために気の利いた小さな修正を見つけました。

あなたはすべての設定をtype => 'option'に変更しなければならなくなり、それからもうget_theme_modを使うことはできず、代わりにget_optionを使う必要があります(私の知る限り)。 get_theme_modをget_optionに置き換えて検索しても問題ありません。それは私のために働きました。

もっと良い方法があれば、これを更新します。

2

あなたがこのコードを使うならば:

$wp_customize->add_setting('mytheme[mytext]', array(
    'default'        => 'some value you want default',
    'capability'     => 'edit_theme_options',
    'type'           => 'option',
));

$wp_customize->add_control('textControl', array(
    'label'      => __('LabelText', 'mytheme'),
    'section'    => 'parameters_thrive',
    'settings'   => 'mytheme[mytext]',  ));

get_option('mytheme')['mytext']を実行するだけで値を取得できます