user
  • 0
Гуру

Автоматически исключать категории из метабокса на основе названия

  • 0

Я разрабатываю веб-сайт, который будет использоваться в качестве школьной системы громкой связи. Пользователи будут размещать записи в категориях, названных в честь определенных дат, которые соответствуют школьным собраниям. У нас две сборки в неделю, а значит, моему сайту понадобится много категорий. Я хочу, чтобы пользователи видели только те категории, которые соответствуют недавним/предстоящим сборкам. Так как наша домашняя страница представляет собой просто список категорий, а все наши категории названы в формате мм/дд/гггг, я написал следующий скрипт, чтобы отображать только последние и не слишком удаленные сборки (категории).

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

Этот код работает на главной странице моего сайта и работает отлично. Проблема в том, что я также хочу запустить аналогичный скрипт в мета-поле категории в панели администратора сайта WordPress, чтобы наши пользователи могли публиковать сообщения только в предстоящих сборках. Первоначально я надеялся изменить функцию wp_terms_checklist, чтобы она работала аналогично нашей домашней странице, но мне не повезло. Недавно я обнаружил здесь код MikeSchinkel. Я думаю, что его метод обладает большим потенциалом, поскольку он уже позволяет исключить определенные категории из метабокса. Я попытался изменить его код для своих целей, но у меня возникли проблемы с объединением двух сценариев. Вот самое близкое, что я был до сих пор:

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

Теоретически я чувствую, что этот код должен работать, но оператор foreach и функция get_categories() нарушают работу как внешнего, так и внутреннего интерфейса моего сайта. Мне удалось заменить слаги исключенных категорий переменными, объявленными в той же функции, но как только я пытаюсь связать эти переменные со своими правилами, возникают ошибки сайта. Я все еще изучаю PHP и перепробовал все возможные варианты комбинации кода, о которых только мог подумать, но у меня все еще есть проблемы. Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения.

Спасибо, Джонатан

Примечание: изменения в мета-поле являются частью серии специальных функций, которые я создаю для темы администратора. Все функции размещены внутри гигантского оператора if, поэтому они влияют только на пользователей с доступом участника, поэтому мой код не повлияет на администраторов сайта.

Share
  1. Я просмотрел основные файлы, но не смог найти list_terms_exclusions фильтр. Не могли бы вы указать мне там?

    • 0
    • Это упоминается в taxonomy.php, хотя мне кажется, что это странное определение. Эта часть скрипта на самом деле взята из кода Майка Шинкеля, я никогда бы не стал ее использовать. Тем не менее, кажется, что он успешно исключает категории.

      • 0
    • Фильтр list_terms_exclusions находится в taxonomy.php строке 1245.

      • 0
    • Привет Энди, большое спасибо за ваш ответ. Я попробовал ваш код, и, к сожалению, он не совсем сработал. Я думаю, что это определенно ближе, и я постараюсь пересмотреть его в будущем. Спасибо за начало!

      • 0
    • Извините, это не сработало. Я написал это здесь без какого-либо тестирования и не предоставил много контекста. Я обновил его с отсутствующим global . Вы должны использовать его внутри той же функции фильтра, с которой вы начали. Вы должны попробовать сбросить переменные, чтобы увидеть, что в них.

      • 0
    • Привет еще раз, извините, что не ответил раньше — я сосредоточился на других частях сайта. Я играл с этим кодом часами и часами, и я до сих пор не могу заставить его работать правильно. Кажется, что функция get_categories() не может быть вызвана так, как внутри этой функции. Я пробовал альтернативы, но пока безуспешно. Мне может понадобиться использовать версию get_taxonomy() или get_the_term_list(). Пожалуйста, дайте мне знать, если у вас есть еще идеи. Спасибо!

      • 0
  2. Вы решили решить сложную проблему для новичка в PHP. 🙂 Это может приблизить вас к вашей цели:

    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)" ;
    }
    
    • 0

Оставить ответ

You must login to add an answer.