web-dev-qa-db-fra.com

Problème avec get_theme_mod renvoyant une valeur vide à la place de la valeur enregistrée

J'ai ce qui semble être un problème plutôt troublant avec la fonction get_theme_mod dans la dernière version de Wordpress. Seulement sur des serveurs particuliers (qui répondent à toutes les exigences de Wordpress), la fonction ne renverra pas la valeur enregistrée que je peux voir stockée dans la base de données. Cependant, si je spécifie une valeur par défaut pour la fonction, elle renverra toujours la valeur par défaut à partir du deuxième argument.

Je suis vraiment désemparé ici car les serveurs utilisent tous PHP 5.3 et plus que les versions requises de MySQL. Tous les environnements sont PHP et Apache avec rien d’avant ou entre les deux. Cela ne semble pas être une erreur constante, cela semble se produire uniquement sur des serveurs particuliers.

J'utilise l'API de personnalisation de thème Wordpress dans mon projet et les serveurs incriminés ont remarqué les choses suivantes:

  • Les modifications apportées dans le volet d'aperçu de l'API de personnalisation de thème sont reflétées. Cependant, naviguez vers une autre partie du site dans le volet de visualisation (en cliquant sur un lien ou autre) pour revenir à sa valeur par défaut. Frapper rafraîchir remet également tout à ses valeurs par défaut.
  • L'inspection de la demande AJAX via l'onglet "Réseau" des outils pour les développeurs Chrome indique que les données sont correctement envoyées et que le serveur renvoie un code de réponse de 200 si tout se passe bien.
  • Le fait d’inspecter la ligne appropriée de la table de la base de données qui stocke les données sérialisées qui ont été enregistrées montre qu’elles sont effectivement enregistrées correctement, mais lors de l’utilisation de la fonction get_theme_mod (), elles ne sont pas renvoyées.
  • J'ai essayé de vider le contenu de la fonction "Get_theme_mods ()" pour voir ce qu'il retournerait et je ne reçois rien (absolument rien n'est retourné). Cette opération sur un serveur en service renvoie toutefois le contenu approprié.
  • Toutes les valeurs de l'API de personnalisation de thème sont définies conformément à la documentation suggérée et j'ai même essayé de définir le type de paramètre sur "theme_mod", mais en vain (bien que theme_mod soit par défaut).
  • Lorsque j'essaie d'appeler get_theme_mod () si j'ajoute set_theme_mod avant l'appel de la fonction et que je définis moi-même une valeur manuellement, la sauvegarde est effectuée et la fonction get_theme_mod obtient la valeur enregistrée juste avant. Cela signifie que les modifications semblent agir comme si elles n'étaient que temporairement enregistrées (même si la base de données dit le contraire).

De plus, aucun plug-in n'est installé ou activé, ce qui pourrait écraser les options du thème ou les empêcher de revenir. Ma seule conclusion est que cela se rapporte à une sorte de mise en cache de niveau hôte Web (APC peut-être) ou peut-être que Wordpress lui-même met en cache les options (je suppose que get_theme_mod) est mis en cache de la même manière que la fonction get_option est ailleurs.

Si vous avez besoin de code, faites le moi savoir ce que vous avez besoin (car je ne suis pas sûr).

Modifier **

J'ai fait un var_dump sur le contenu des fonctions get_theme_mod appelées et j'ai obtenu ce qui suit (je l'ai fait pendant un certain nombre de cas, mais pas tous). Les étiquettes devant les deux points servent à indiquer quelle valeur correspond à quoi.

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

Par frustration, j’ai aussi essayé le code suivant et rien n’est retourné:

$options = get_option("theme_mods_aphrodite");

var_dump($options);

Le résultat que j'en tire est bool (false).

Une autre chose que j'ai essayée était d'utiliser le personnalisateur de thème par défaut Twenty Twelve et cela a fonctionné. Quelque chose dans mon thème détruit la ligne d'options et l'empêche de fonctionner. Mais ce qui est étrange, c’est que le thème avec lequel je rencontre des problèmes fonctionne généralement bien sur les autres serveurs que j’essaie, c’est seulement des incidents isolés et la table de base de données est intacte.

Edit # 2 **

Comme suggéré ci-dessous, j'ai collé le code de personnalisation de mon thème dans un autre thème (j'ai choisi Twenty Twelve car il fonctionne immédiatement) et il semble que mon code de registre casse le personnalisateur et je ne comprends pas pourquoi.

4
Dwayne Charrington

J'ai eu le même problème .. en utilisant type=option et ensuite get_option ne fonctionne pas non plus.

Tester avec un autre élément d'option et fonctionne .. et tester avec MYTHEMENAME_THEME_OPTION sans le support pour l'élément et obtenu un tableau, donc je suppose que c'est la bonne façon.

Donc, juste un conseil pour ceux qui ont trouvé ce post mais qui ont toujours une valeur vide .. quand vous utilisez ce code:

$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]',  ));

alors pour obtenir du travail, vous devez utiliser chaque paramètre comme valeur individuelle,

$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, then n'est plus un tableau (avant wasmytheme[mytext]), ressemble maintenant à un élément/valeur unique, une chaîne. Continuez et utilisez la fonction get_option() pour utiliser la valeur comme vous le souhaitez.

3
user39067

Je n'ai jamais compris pourquoi get_theme_mod ne fonctionnait pas, mais j'ai néanmoins trouvé un petit correctif astucieux pour résoudre ce problème de bogue ennuyeux au cas où quelqu'un d'autre se retrouverait dans une situation similaire.

Vous devez changer tous vos paramètres pour taper => 'option', vous ne pourrez plus utiliser get_theme_mod et vous devrez utiliser get_option (pour autant que je sache). Trouver et remplacer sur get_theme_mod pour get_option ne devrait pas faire de mal. Cela a fonctionné pour moi.

Je mettrai à jour ceci si je trouve un meilleur moyen.

2
Dwayne Charrington

Si vous utilisez ce code:

$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]',  ));

Vous pouvez récupérer la valeur en exécutant simplement get_option('mytheme')['mytext']

0