it-swarm.com.de

Kategorien basierend auf dem Titel automatisch aus der Metabox ausschließen

Ich entwerfe eine Website, die als Beschallungssystem für Schulen verwendet wird. Die Benutzer veröffentlichen Einträge in Kategorien, die nach bestimmten Daten benannt sind, die den Schulversammlungen entsprechen. Wir haben zwei Versammlungen pro Woche, was bedeutet, dass meine Site viele Kategorien benötigt. Ich möchte nur, dass Benutzer die Kategorien sehen, die den letzten/kommenden Baugruppen entsprechen. Da unsere Homepage nur eine Liste von Kategorien ist und alle unsere Kategorien im Format MM/TT/JJJJ benannt sind, habe ich das folgende Skript geschrieben, um nur aktuelle und nicht entfernte Assemblys (Kategorien) anzuzeigen.

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>';

Dieser Code läuft auf meiner Homepage und funktioniert einwandfrei. Das Problem ist, ich möchte auch ein ähnliches Skript für die Kategorie-Meta-Box in der Wordpress-Site-Administration ausführen, sodass unsere Benutzer nur auf bevorstehende Assemblys posten können. Ursprünglich hatte ich gehofft, die Funktion wp_terms_checklist so zu ändern, dass sie unserer Homepage ähnelt, hatte aber kein Glück. Kürzlich habe ich MikeSchinkels Code hier entdeckt. Ich denke, seine Methode zeigt viel Potenzial, da sie bereits die Fähigkeit besitzt, bestimmte Kategorien aus der Metabox auszuschließen. Ich habe versucht, seinen Code für meine Zwecke zu ändern, habe jedoch Probleme beim Kombinieren der beiden Skripte. Hier ist der nächste, den ich bisher gesehen habe:

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;  
}

Theoretisch sollte dieser Code funktionieren, aber die foreach-Anweisung und die get_categories () -Funktion stören sowohl das Front-End als auch das Back-End meiner Site. Ich hatte Erfolg beim Ersetzen der ausgeschlossenen Kategorie-Slugs durch Variablen, die in derselben Funktion deklariert wurden, aber sobald ich versuche, diese Variablen mit meinen Regeln zu verknüpfen, werden die Site-Fehler angezeigt. Ich lerne noch PHP und habe jede mögliche Variation der Codekombination ausprobiert, die mir einfällt, habe aber immer noch Probleme. Bitte lassen Sie mich wissen, wenn Sie Vorschläge haben.

Danke, Jonathan

Hinweis: Die Änderungen an einer Meta-Box sind Teil einer Reihe von Sonderfunktionen, die ich für ein Admin-Thema erstelle. Alle Funktionen befinden sich in einer riesigen if-Anweisung, sodass sie nur Benutzer mit Autorenzugriff betreffen, sodass mein Code keine Auswirkungen auf Site-Administratoren hat.

1
user4308

Sie haben sich entschieden, ein schwieriges Problem für ein neues PHP-Programm anzugehen. :-) Das könnte dich näher an dein Ziel bringen:

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