Не снимаются с публикации материалы созданные ранее определенной даты

Главные вкладки

Аватар пользователя Eugene1986 Eugene1986 25 января 2022 в 19:27

Доброго времени суток!
Подскажите пожалуйста как в 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);

После этого в поиске и на соответствующих страницах сайта, на которых они отображались в хронологическом порядке, материалы пропали - что мне и нужно, но не смотря на это материалы снятые с публикации все равно остаются доступными по прямой ссылки! Почему?

Подскажите как сделать чтоб неопубликованные материалы не были доступны по прямой ссылке?

Механизм снятия с публикации какой-то другой или все так и должно работать и нужно сделать что-то еще?
Заранее спасибо!

Комментарии

Аватар пользователя Eugene1986 Eugene1986 25 января 2022 в 19:53

И амину и анониму. (
Еще установлен модуль View Unpublished, но соответствующая галочка для анонима снята.
То есть моя цель чтобы для зарегистрированных пользователей и админа были видны все публикации, а для анонимов только опубликованные.

Аватар пользователя VasyOK VasyOK 25 января 2022 в 21:16

Создать вьюху, отфильтровать материалы по нужным параметрам и через views_bulk_operations депубликовать - не вариант?

Аватар пользователя Selpi Selpi 26 января 2022 в 11:30

Снятые с публикации материалы не видны анонимам. В вашем случае проблема наверняка в том, что снятые с публикации страницы напрямую запросом к БД остались в друпал кеше. Так что нужно просто сбросить кеш сайта.
Но вообще, прямые запросы к БД подобного рода лучше не делать, так как, во-первых, друпал/веб сервер/редис и т.п. о них не узнает до следующего обновления кеша, во-вторых потому, что можно поломать сайт некорректными изменениями.
В друпале есть как готовые инструменты для админки, чтобы производить подобные действия (Views+ Views_bulk_operations), так и апи для работы с базой (пишете простенький модуль и делаете все что нужно).

Аватар пользователя Eugene1986 Eugene1986 26 января 2022 в 23:54

Сделал Views с нужными параметрами и попытался снять с публикации используя Views_bulk_operations
но появилась такая ошибка:

Возникла AJAX HTTP ошибка. Полученный код HTTP: 500 Следует отладочная информация. Путь: /batch?id=7348&op=do_nojs&op=do СтатусТекстом ОтветТекстом: PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'base.changed' in 'field list': SELECT base.uid AS uid, base.name AS name, base.pass AS pass, base.mail AS mail, base.theme AS theme, base.signature AS signature, base.signature_format AS signature_format, base.created AS created, base.changed AS changed, base.access AS access, base.login AS login, base.status AS status, base.timezone AS timezone, base.language AS language, base.picture AS picture, base.init AS init, base.data AS data FROM {users} base WHERE (base.uid IN (:db_condition_placeholder_0)) ; Array ( [:db_condition_placeholder_0] => 1 ) в функции DrupalDefaultEntityController->load() (строка 198 в файле /home/mhgnis/domains/***/public_html/includes/entity.inc).

Сначала думал что это из-за большого количества строк, но уменьшение количества до 10 не помогло...

Аватар пользователя Selpi Selpi 27 января 2022 в 0:03

"То, о чем предупреждали большевики"...
Дело не в размере выборки. В тексте ошибки вам движок сообщает, что в таблице users из которой вы делаете выборку, отсутствует столбец changed. Т.е. кто-то этот столбец оттуда удалил манипуляциями с базой данных.

Так что вариантов у вас два: найти бекап, где шаловливые ручки еще не повредили БД, или вручную создать этот столбец и заполнить его произвольными таймстампами. Второй вариант плох тем, что это может быть не единственное повреждение БД, и где-то еще стерто что-то.

Аватар пользователя Selpi Selpi 27 января 2022 в 2:27

Не думаю что есть какие-то стандартные инструменты, впрочем, я никогда не искал.

В нормальных условиях руками в БД лазить не надо, а если полез, то нужны бекапы (они вообще всегда нужны).

В ситуации же потерь данных из-за, например, удаленного столбца таблицы, никто не мешает тебе вручную создать этот столбец и что-то адекватное туда записать, чтобы движок нормально работал.

В вышеприведенном случае можно просто таймстампы всем записать. Да, информация о том, когда юзверь менял профиль потеряна, но друпал будет корректно работать.

Аватар пользователя Eugene1986 Eugene1986 27 января 2022 в 17:57

Выяснил причину проблемы с отсутствием столбца - я откатил бэкап БД, а бэкап на диске оставил новый.
Откатил все к одной дате и все заработало.