Переписывание URL на основе настраиваемого значения поля

Я работаю над миграцией из другой CMS в WordPress. На старом сайте были ужасные SEO-недружественные URL-адреса в формате http://example.com?lid=1234 .

Мы импортировали все сообщения из старого сайта в WordPress и сохраняем lid в качестве настраиваемого поля.

Нам бы очень хотелось, чтобы старые URL-адреса по-прежнему работали, но, как есть, около 3000 сообщений с использованием .htaccess не могут быть и речи.

Поэтому мой вопрос: как мне создать правило перезаписи, которое извлекает значение lid из URL-адреса и перенаправляет на сообщение, которое содержит его в настраиваемом поле? (значение lid уникально, поэтому нет беспокойства о более чем одном сообщении с одинаковым значением поля)

Большое спасибо Саймон

Solutions Collecting From Web of "Переписывание URL на основе настраиваемого значения поля"

вот идея, сначала добавьте lid в query_vars:

 add_filter('query_vars', 'lid_query_vars'); function lid_query_vars($vars) { // add lid to the valid list of variables $new_vars = array('lid'); $vars = $new_vars + $vars; return $vars; } 

затем используйте parse_request hook для создания вашего перенаправления

 add_action('parse_request', 'lid_parse_request'); function lid_parse_request($wp) { // only process requests with "lid" if (array_key_exists('lid', $wp->query_vars) && $wp->query_vars['lid'] != '') { $args = array('meta_key' => 'lid', 'meta_value' => $wp->query_vars['lid']); $redirect_to_post = get_posts($args); foreach($redirect_to_post as $p){ $link = get_permalink($p->ID); wp_redirect( $link , 301 ); exit; } } } 

Привет @Simon Blackbourn:

Пока я писал свой ответ, но прежде чем я смог опубликовать его, @Bainternet тоже вскочил с большим ответом. Он принял несколько иной подход, но его работы одинаково, как и мои. Тем не менее, так как я уже написал свое, когда увидел его, я буду представлять свою альтернативу для вас.

Использует прямой SQL: $post_id = $wpdb->get_var($sql)

Мое решение использует прямой SQL, который часто не самый лучший подход, но я считаю, что это справедливо здесь из-за простоты SQL (и, следовательно, вряд ли это произойдет в будущем), и потому что для ваших нужд нет пользы для использования сравнительно тяжелых get_posts() при этом необходимо обработать перехваты, так как ваши потребности разобщены для вашего конкретного сайта.

Использует прямые URL-параметры: $_GET['lid']

Кроме того, я решил использовать прямой доступ к $_GET['lid'] вместо того, чтобы сначала создавать query_var потому что запросы vars являются частью стандартной архитектуры запросов WordPress, которая используется базовой системой перезаписи URL-адресов, и для вашего случая использования вы явно не используя архитектуру запросов WordPress. Вместо этого вам нужно зафиксировать фактический параметр запроса, переданный по URL-адресу, поэтому я думаю, что на самом деле нет необходимости в накладных расходах на добавление запроса var (хотя правду сказать с использованием запроса var не повредит, и он отлично работает .)

Использует 'parse_request' Hook

Наконец, мне понравилось использовать @Bainternet для использования 'parse_request' ; он запускается до запроса WordPress по умолчанию MySQL, поэтому вам не нужно запускать запрос MySQL, который вы просто выбросите, но он запускается после того 'init' крюк 'init' что означает (большинство) крючков, которые позволяют плагинам изменять постоянные ссылки, будет добавлен тем самым давая вам правильные URL-адреса для ваших перенаправлений.

Место в functions.php

Вы можете поместить следующий код в файл functions.php вашей темы:

 add_action('parse_request','oldsite_redirect',0); // 0=before (most) 'parse_request' calls function oldsite_redirect() { if (isset($_GET['lid'])) { global $wpdb; $sql = "SELECT post_id FROM {$wpdb->postmeta} " . "WHERE meta_key='lid' AND meta_value='%s'"; $sql = $wpdb->prepare($sql,$_GET['lid']); $post_id = $wpdb->get_var($sql); if ($post_id) { $permalink = get_permalink($post_id); if ($permalink) { wp_safe_redirect($permalink,301); exit; } } } } 

Опять же, любое решение будет работать; @ Bainternet или моя; ваш выбор, который использовать.