Удивительно, но, похоже, не существует плагина или какого-либо другого «простого» способа поиска в ваших постах WordPress по определенным ключевым словам, шорткодам или тегам HTML. Однако, если вы когда-либо проходили миграцию тем, вы знаете, что стандартизация тегов и шорткодов HTML делает этот процесс гораздо менее болезненным. Если вы знаете, что ищете, это решение для поиска контента ваших постов может быть именно тем, что вам нужно.
Похоже, что плагины, которые мы нашли, сосредоточены на поиске и замене. Это было не то, что мы искали. Мы просто хотели найти способ идентифицировать посты, в которых определенные строки использовались в контенте.
К сожалению, то же самое верно для WP-CLI, иначе фантастической утилиты. Он также не имеет режима «только поиск».
Допустим, у нас нет phpMyAdmin на нашем сервере, в основном из соображений безопасности. Но у нас есть доступ по SSH. Это оставляет нас с инструментами командной строки «всякий раз, когда нам нужно сделать что-то, выходящее за рамки WordPress».
В этой статье предполагается, что вы можете использовать SSH на своем сервере и запускать команды MySQL.
Подключитесь к вашему экземпляру MySQL:
mysql -u root -p
Вам будет предложено ввести пароль базы данных root. После того, как вы ввели его успешно, вы можете запускать SQL-запросы, например, для вывода списка баз данных:
show databases;
Затем выберите базу данных WordPress (убедитесь, что вы используете правильное имя базы данных из списка выше):
use wordpress;
Следующие команды будут влиять на выбранную базу данных в WordPress.
Теперь мы можем искать сообщения по ключевым словам. Мы готовились к миграции и хотели перечислить посты, которые содержали определенные шорткоды, например «[andreyex]». Следующая команда выводит список всех постов, содержащих эту строку:
SELECT ID, POST_TITLE FROM wp_posts WHERE post_content LIKE '%[andreyex]%' AND post_status = 'publish';
Обратите внимание, что условие поиска заключено в знаки процента (подстановочный знак SQL). Также обратите внимание на проверку опубликованного статуса. Без последнего вы также получите ревизии.
Результат выглядит так:
mysql> SELECT ID, POST_TITLE FROM wp_posts WHERE post_content LIKE '%[quote]%' AND post_status = 'publish';
+-------+-------------------------------------------------------------------------------+
| ID | POST_TITLE |
+-------+-------------------------------------------------------------------------------+
| 59828 | Как установить и настроить Samba в CentOS 7 |
+-------+-------------------------------------------------------------------------------+
9 rows in set (0.03 sec)
Это уже очень хорошо, но было бы намного полезнее, если бы он включал URL каждого поста для легкого доступа. К сожалению, таблица wp_posts хранит только слаг, а не полный URL. Тем не менее, мы можем легко обойти это, объединяя базовый путь URL-адреса с фрагментом каждого поста следующим образом:
mysql> tee posts.txt
Logging to file 'posts.txt'
mysql> SELECT post_title, CONCAT('https://andreyex.ru/', post_name) AS URL FROM wp_posts WHERE post_content LIKE '%[andreyex]%' AND post_status = 'publish';
+-------------------------------------------------------------------------------+------------------------------------------------------------+
| post_title | URL |
+-------------------------------------------------------------------------------+------------------------------------------------------------+
| Как установить и настроить Samba в CentOS 7 | https://andreyex.ru/kak-ustanovit-i-nastroit-samba... |
+-------------------------------------------------------------------------------+------------------------------------------------------------+
9 rows in set (0.12 sec)
mysql> notee
Outfile disabled.
Обратите внимание на использование команды tee для копирования вывода в файл. Файл перезаписывается каждым оператором SQL, поэтому вы захотите отключить эту функцию с помощью команды notee.
И с этим у нас есть удобный текстовый файл, содержащий все URL в нашем блоге, где пост содержит указанное ключевое слово. Счастливой миграции!