simonblackbourn
  • 0
Учитель

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

  • 0

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

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

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

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

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

Share
  1. вот идея, сначала добавьте 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 хук, чтобы создать перенаправление

    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;
            }
        }
    }
    
    • 0
  2. Привет @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 файл вашей темы:

    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 или мой; ваш выбор, что использовать.

    • 0

Оставить ответ

You must login to add an answer.