Я работаю над миграцией с другой CMS на WordPress. На старом сайте были ужасные неблагоприятные для SEO URL-адреса в формате http://example.com?lid=1234
.
Мы импортировали все сообщения со старого сайта в WordPress и сохранили их lid
как настраиваемое поле.
Мы хотели бы, чтобы старые URL-адреса по-прежнему работали, если это возможно, но поскольку существует около 3000 сообщений с использованием.htaccess, об этом не может быть и речи.
Итак, мой вопрос: как мне создать правило перезаписи, которое извлекает lid
значение из URL-адреса и перенаправляет на сообщение, содержащее его в пользовательском поле? ( lid
значение уникально, поэтому можно не беспокоиться о более чем одном сообщении с одинаковым значением настраиваемого поля)
Большое спасибо Саймон
вот идея, сначала добавьте
lid
в query_vars:затем используйте
parse_request
хук, чтобы создать перенаправлениебольшое спасибо, это делает работу отлично. один вопрос: нужно ли мне очищать исходящие данные
query_vars
или WordPress уже сделал это? (т.е. если бы я использовал$_GET['lid']
, я бы пропустил егоabsint
перед использованием)Бесконечно благодарен. У меня было другое требование, но фильтр query_vars был именно тем, что мне было нужно.
привет майк — мне тоже нравится этот ответ, как вы говорите, что это гораздо более эффективный запрос, чем
get_posts
(который требует объединения в этом случае, потому что мы запрашиваем две таблицы).@Simon Blackbourn — рад, что смог помочь.
Этот тоже работал на меня. Теперь мне просто нужно добавить правило перезаписи.
Это отлично сработало для меня при переходе с Drupal на WordPress и сохранении идентификатора узла в пользовательском поле. Однако вместо использования $_GET я использовал $nodePath = Explosion(‘/’, $_SERVER[«REQUEST_URI»]); и изменил предложение IF на $nodePath[1] == ‘node’, чтобы затем я мог использовать идентификатор в $nodePath[2]. Вы серьезно только что сэкономили мне часы работы, выполняя это вручную или с кучей экспорта данных и vlookups. Спасибо!
Привет @Simon Blackbourn:
Пока я писал свой ответ, но прежде чем я смог его опубликовать, @Bainternet тоже подскочил с отличным ответом. Он использовал несколько иной подход, но его работы такие же, как и мои. Тем не менее, поскольку я уже написал свой, когда увидел его, я представлю свой в качестве альтернативы для вашего рассмотрения.
Использует прямой SQL:
$post_id = $wpdb->get_var($sql)
В моем решении используется прямой SQL, который часто является не лучшим подходом, но я считаю, что здесь это справедливо из-за простоты этого SQL (и, следовательно, вряд ли он сломается в будущем), а также потому, что для ваших нужд нет никакой пользы от использования сравнительно тяжелого
get_posts()
с все, что нужно для обработки хуков, поскольку ваши потребности уникальны для вашего конкретного сайта.Использует параметры прямого URL:
$_GET['lid']
Кроме того, я решил использовать прямой доступ
$_GET['lid']
вместо предварительного создания,query_var
потому что переменные запроса являются частью стандартной архитектуры запросов WordPress, которая используется базовой системой перезаписи URL-адресов, и для вашего варианта использования вы явно не используете архитектуру запросов WordPress. Вместо этого вам нужно зафиксировать фактический параметр запроса, переданный по URL-адресу, поэтому я думаю, что на самом деле нет необходимости в накладных расходах на добавление переменной запроса (хотя, по правде говоря, использование переменной запроса не повредит, и он тоже отлично работает.)Использует
'parse_request'
крюкНаконец, мне понравилось использование
'parse_request'
хука @Bainternet; он запускается перед запросом MySQL по умолчанию WordPress, поэтому вам не нужно запускать запрос MySQL, который вы просто выбросите, но он запускается после'init'
хука, что означает, что (большинство) хуков, которые позволяют плагинам изменять постоянные ссылки, будут добавлены, что даст вам правильные URL-адреса для ваших перенаправлений.Установить в
functions.php
Вы можете поместить следующий код в
functions.php
файл вашей темы:Опять же, любое решение будет работать; @ Bainternet или мой; ваш выбор, что использовать.