Я разрабатываю веб-сайт, который будет использоваться в качестве школьной системы громкой связи. Пользователи будут размещать записи в категориях, названных в честь определенных дат, которые соответствуют школьным собраниям. У нас две сборки в неделю, а значит, моему сайту понадобится много категорий. Я хочу, чтобы пользователи видели только те категории, которые соответствуют недавним/предстоящим сборкам. Так как наша домашняя страница представляет собой просто список категорий, а все наши категории названы в формате мм/дд/гггг, я написал следующий скрипт, чтобы отображать только последние и не слишком удаленные сборки (категории).
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, поэтому они влияют только на пользователей с доступом участника, поэтому мой код не повлияет на администраторов сайта.
Я просмотрел основные файлы, но не смог найти
list_terms_exclusions
фильтр. Не могли бы вы указать мне там?Это упоминается в taxonomy.php, хотя мне кажется, что это странное определение. Эта часть скрипта на самом деле взята из кода Майка Шинкеля, я никогда бы не стал ее использовать. Тем не менее, кажется, что он успешно исключает категории.
Фильтр
list_terms_exclusions
находится вtaxonomy.php
строке 1245.Привет Энди, большое спасибо за ваш ответ. Я попробовал ваш код, и, к сожалению, он не совсем сработал. Я думаю, что это определенно ближе, и я постараюсь пересмотреть его в будущем. Спасибо за начало!
Извините, это не сработало. Я написал это здесь без какого-либо тестирования и не предоставил много контекста. Я обновил его с отсутствующим
global
. Вы должны использовать его внутри той же функции фильтра, с которой вы начали. Вы должны попробовать сбросить переменные, чтобы увидеть, что в них.Привет еще раз, извините, что не ответил раньше — я сосредоточился на других частях сайта. Я играл с этим кодом часами и часами, и я до сих пор не могу заставить его работать правильно. Кажется, что функция get_categories() не может быть вызвана так, как внутри этой функции. Я пробовал альтернативы, но пока безуспешно. Мне может понадобиться использовать версию get_taxonomy() или get_the_term_list(). Пожалуйста, дайте мне знать, если у вас есть еще идеи. Спасибо!
Вы решили решить сложную проблему для новичка в PHP. 🙂 Это может приблизить вас к вашей цели: