web-dev-qa-db-fra.com

Exclure automatiquement les catégories de metabox en fonction du titre

Je suis en train de concevoir un site Web qui sera utilisé comme système de sonorisation scolaire. Les utilisateurs publieront des entrées dans des catégories nommées pour des dates spécifiques correspondant à des assemblées d'école. Nous avons deux assemblées par semaine, ce qui signifie que mon site aura besoin de nombreuses catégories. Je veux seulement que les utilisateurs voient les catégories qui correspondent aux assemblées récentes/à venir. Comme notre page d'accueil est simplement une liste de catégories et que toutes nos catégories sont nommées au format mm/jj/aaaa, j'ai écrit le script suivant pour n'afficher que les assemblées récentes et non distantes (catégories).

echo '<ul>';
 $categories = get_categories($category_id);

 foreach ($categories as $cat) {
     $category_link = get_category_link($cat);
        if( strtotime($cat->cat_name) < strtotime('-3 days')) { }
        elseif( strtotime($cat->cat_name) > strtotime('+2 months')) { }
        else { echo '<li><a href="' .$category_link. '">' . $cat->cat_name . '</a></li>'; }
 }

 echo '</ul>';

Ce code fonctionne sur la page d'accueil de mon site et fonctionne parfaitement. Le problème est que je souhaite également exécuter un script similaire sur la boîte à méta-catégories de l’administrateur du site Wordpress afin que nos utilisateurs ne puissent publier que sur les assemblys à venir. A l'origine, j'espérais modifier la fonction wp_terms_checklist pour qu'elle fonctionne de la même manière que notre page d'accueil, mais je n'ai pas eu de chance. Récemment, j'ai découvert le code de MikeSchinkel ici . Je pense que sa méthode montre beaucoup de potentiel car elle a déjà la capacité d’exclure certaines catégories du metabox. J'ai essayé de modifier son code pour mes besoins, mais j'ai du mal à combiner les deux scripts. Voici le plus proche que j'ai été jusqu'à présent:

add_filter('list_terms_exclusions', 'yoursite_list_terms_exclusions', 10, 2);
function yoursite_list_terms_exclusions( $exclusions, $args) 
{
    global $pagenow;

    foreach (get_categories() as $category) 
    { 
        if( strtotime($category->cat_name) < strtotime('-3 days')) 
        {
            $category->slug = $oldassemblies;
        }
        elseif( strtotime($category->cat_name) > strtotime('+2 months')) 
        {
            $category->slug = $futureassemblies; 
        }
     }

    if (in_array( $pagenow, array('post.php','post-new.php') ) ) 
    {
        $exclusions = " {$exclusions} AND t.slug NOT IN ('$oldassemblies', '$futureassemblies')" ;
    }

    return $exclusions;  
}

Théoriquement, j’ai l’impression que ce code devrait fonctionner, mais l’instruction foreach et la fonction get_categories () perturbent les deux extrémités de mon site. J'ai réussi à remplacer les slugs de la catégorie exclue par des variables déclarées dans la même fonction, mais dès que j'essaie d'associer ces variables à mes règles, le site se trompe. J'apprends toujours PHP et j'ai essayé toutes les variantes possibles de combinaison du code auxquelles je pouvais penser mais que je rencontrais toujours. S'il vous plaît laissez-moi savoir si vous avez des suggestions.

Merci Jonathan

Remarque: les modifications apportées à une méta-boîte font partie d'une série de fonctions spéciales que je crée pour un thème d'administrateur. Toutes les fonctions sont placées dans une instruction if géante, de sorte qu'elles n'affectent que les utilisateurs ayant un accès contributeur. Par conséquent, mon code n'affectera pas les administrateurs de site.

1
user4308

Vous avez choisi de vous attaquer à un problème difficile pour un utilisateur si novateur en PHP. :-) Cela pourrait vous rapprocher de votre objectif:

global $wpdb;
if ( in_array( $pagenow, array('post.php', 'post-new.php') ) ) {
    foreach (get_categories() as $category) {
        $cat_time = strtotime($category->cat_name);
        if ( $cat_time < strtotime('-3 days') || $cat_time > strtotime('+2 months') )
            $exclude .= $wpdb->prepare( '%s,', $category->slug );
    }
    $exclude = substr( $exclude, 0, -1 );
    $exclusions = " ($exclusions) AND t.slug NOT IN ($exclude)" ;
}
1
Andy