Доброго времени суток!
Подскажите пожалуйста как в Drupal 7 снять с публикации материалы созданные ранее определенной даты?
Я сделал это через SQL запрос (там еще накладывались определенные условия по типу статьи):
UPDATE node SET status = 0 WHERE nid IN (SELECT nid FROM taxonomy_index WHERE tid=8 OR tid=7 OR tid=9) AND created < 1609448399;
UPDATE node SET status = 0 WHERE type='news' AND created < 1609448399;
и еще перенес маркеры статуса на таблицу node_revision в соответствии с таблицей node:
UPDATE node_revision SET status = 0 WHERE nid IN (SELECT nid FROM node WHERE status=0);
После этого в поиске и на соответствующих страницах сайта, на которых они отображались в хронологическом порядке, материалы пропали - что мне и нужно, но не смотря на это материалы снятые с публикации все равно остаются доступными по прямой ссылки! Почему?
Подскажите как сделать чтоб неопубликованные материалы не были доступны по прямой ссылке?
Механизм снятия с публикации какой-то другой или все так и должно работать и нужно сделать что-то еще?
Заранее спасибо!
Комментарии
Кому доступны? Админу или анониму?
И амину и анониму. (
Еще установлен модуль View Unpublished, но соответствующая галочка для анонима снята.
То есть моя цель чтобы для зарегистрированных пользователей и админа были видны все публикации, а для анонимов только опубликованные.
Создать вьюху, отфильтровать материалы по нужным параметрам и через views_bulk_operations депубликовать - не вариант?
Спасибо попробую.
Но почему не сработали прямые запросы в БД?
Не знаю. Это не принято выполнять запросами к БД.
Снятые с публикации материалы не видны анонимам. В вашем случае проблема наверняка в том, что снятые с публикации страницы напрямую запросом к БД остались в друпал кеше. Так что нужно просто сбросить кеш сайта.
Но вообще, прямые запросы к БД подобного рода лучше не делать, так как, во-первых, друпал/веб сервер/редис и т.п. о них не узнает до следующего обновления кеша, во-вторых потому, что можно поломать сайт некорректными изменениями.
В друпале есть как готовые инструменты для админки, чтобы производить подобные действия (Views+ Views_bulk_operations), так и апи для работы с базой (пишете простенький модуль и делаете все что нужно).
Спасибо.
Кэш я сбрасывал, но это не помогало.
Буду пробовать указанные Вами модули.
Сделал Views с нужными параметрами и попытался снять с публикации используя Views_bulk_operations
но появилась такая ошибка:
Сначала думал что это из-за большого количества строк, но уменьшение количества до 10 не помогло...
"То, о чем предупреждали большевики"...
Дело не в размере выборки. В тексте ошибки вам движок сообщает, что в таблице users из которой вы делаете выборку, отсутствует столбец changed. Т.е. кто-то этот столбец оттуда удалил манипуляциями с базой данных.
Так что вариантов у вас два: найти бекап, где шаловливые ручки еще не повредили БД, или вручную создать этот столбец и заполнить его произвольными таймстампами. Второй вариант плох тем, что это может быть не единственное повреждение БД, и где-то еще стерто что-то.
а можно как-то БД-у перестроить?
Не думаю что есть какие-то стандартные инструменты, впрочем, я никогда не искал.
В нормальных условиях руками в БД лазить не надо, а если полез, то нужны бекапы (они вообще всегда нужны).
В ситуации же потерь данных из-за, например, удаленного столбца таблицы, никто не мешает тебе вручную создать этот столбец и что-то адекватное туда записать, чтобы движок нормально работал.
В вышеприведенном случае можно просто таймстампы всем записать. Да, информация о том, когда юзверь менял профиль потеряна, но друпал будет корректно работать.
Выяснил причину проблемы с отсутствием столбца - я откатил бэкап БД, а бэкап на диске оставил новый.
Откатил все к одной дате и все заработало.
Тогда остается только поздравить. Наличие актуальных бэкапов- уже успех