WordPress : Comment vérifier si un categoryID existe dans une page d’options de thème

Publié par Jean-Michel le

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, $ine 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 explodeune 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 keys du tableau – les $is – 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 $valuepas le $i. Le $iest 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 $iquand 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.

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *