WordPress : Comment vérifier si un categoryID existe dans une page d’options de thème
J’ai essayé de créer une page d’options de thème (en commençant par un exemple de page d’options de thème de themeshaper) et je souhaite vérifier si une liste de catégories séparées par des virgules est valide. Supprimez les doublons, supprimez les catégories inexistantes, mais cela ne fonctionne pas. 🙁
Il supprime la dernière valeur si je vérifie avec empty() :
function theme_options_validate( $input ) {
if ($input['slidercats'] != '') {
$slidercats = $input['slidercats'];
$slidercats_array = explode( ',', $slidercats );
$slidercats_array = array_unique( $slidercats_array );
$slidercats_array = array_map('intval', $slidercats_array );
foreach($slidercats_array AS $i => $value)
{
$cat = get_category($i); // cat_ID
if ( empty( $cat ) )
unset($slidercats_array[$i]);
}
$input['slidercats'] = implode(",", $slidercats_array);
}
return $input;
}
http://pastebin.com/xR1aq6mD
Et il supprime toutes les valeurs sauf une avecterm_exists(id, 'category');
function theme_options_validate( $input ) {
// global $select_options, $radio_options;
// Change to integer
$input['slidercount'] = (int)$input['slidercount'];
if ($input['slidercount'] < 1 || $input['slidercount'] > 50)
$input['slidercount'] = 10;
// Make array from string, remove duplicates, change all values to integer, remove non existing categories, make string from array
if ($input['slidercats'] != '') {
$slidercats = $input['slidercats'];
$slidercats_array = explode( ',', $slidercats );
$slidercats_array = array_unique( $slidercats_array );
$slidercats_array = array_map('intval', $slidercats_array );
foreach($slidercats_array AS $i => $value)
{
$cat = term_exists($i, 'category'); // cat_ID
if ( ! $cat )
unset($slidercats_array[$i]);
}
$input['slidercats'] = implode(",", $slidercats_array);
}
return $input;
}
http://pastebin.com/edx8F1YZ
Le problème est le foreach
, mais je suis bloqué et aucun gourou php. Peut-être que quelqu’un pourrait m’indiquer comment résoudre ce problème…
Solution n°1 trouvée
Dans le code suivant, $i
ne sera pas votre identifiant de catégorie.
foreach($slidercats_array AS $i => $value)
{
$cat = get_category($i); // cat_ID
if ( empty( $cat ) )
unset($slidercats_array[$i]);
}
Du moins, je ne vois pas comment cela pourrait être. Si vous avez explode
une chaîne, les clés du tableau résultant sont numériques et générées séquentiellement à partir de 0. Je suppose que votre chaîne d’origine est une liste d’identifiants de catégorie séparés par des virgules. Cela signifierait que les key
s du tableau – les $i
s – n’auront aucun rapport avec vos identifiants de catégorie. Par exemple:
$arr = '9,8,7,6,5,4'; // assume these to be category IDs
print_r(explode(',',$arr));
/* Returns
Array
(
[0] => 9
[1] => 8
[2] => 7
[3] => 6
[4] => 5
[5] => 4
) */
Vous voulez utiliser le $value
pas le $i
. Le $i
est le [0],[1],[2]
, etc. Vous voulez la seconde moitié – le $value
– lorsque vous vérifiez la catégorie (ou le terme).
$cat = get_category($value); // cat_ID
Vous voulez toujours le $i
quand vous le pensez unset
.
Vous semblez également faire la même erreur dans le deuxième bloc et je suis à peu près sûr que l’utilisation incorrecte des clés du tableau est à l’origine du problème.
0 commentaire