web-dev-qa-db-ja.com

カスタムフィールド値に基づくURL書き換え

私は他のCMSからWordPressへの移行に取り組んでいます。古いサイトには、http://example.com?lid=1234という形式の、SEOにとらわれないひどいURLがありました。

古いサイトからのすべての投稿をWordPressにインポートし、lidをカスタムフィールドとして保存しています。

可能であればまだ古いURLを使用しても問題ありませんが、.htaccessを使用した約3,000の投稿があるため、問題外です。

だから私の質問は:URLからlid値を抽出し、それをカスタムフィールドに含む投稿にリダイレクトする書き換えルールをどのように作成するのですか? (lidの値は一意であるため、同じカスタムフィールド値を持つ複数の投稿についての心配はありません)

どうもありがとうサイモン

4

これがアイデアです。最初にquery_varsにlidを追加します。

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;
        }
    }
}
7
Bainternet

こんにちは@ Simon Blackbourn:

私が答えを書いている間に、投稿する前に@Bainternetも素晴らしい答えを出しました。彼はわずかに異なるアプローチを取りましたが、彼の作品は私の作品と同様に同じです。それでも、私が彼を見たときにすでに私のものを書いていたので、あなたが検討するための代替として私を提出します。

ダイレクトSQLを使用:$post_id = $wpdb->get_var($sql)

私のソリューションは直接的なSQLを使用していますが、これは多くの場合最善のアプローチではありませんが、このSQLの単純さのためにここでは公平だと感じています(したがって将来的に壊れることはほとんどありません)そして、あなたのニーズはあなたの特定のサイトのために一回限りであるので、あなたのニーズのためにフックを処理するすべての必要性を持つ比較的重いget_posts()を使用する利点がないので.

直接URLパラメーターを使用:$_GET['lid']

さらに、最初に$_GET['lid']を作成する代わりにquery_varへの直接アクセスを使用することを選択しました。なぜなら、クエリ変数は、基になるURL書き換えシステムで使用される標準WordPressユースケースでは、明示的にWordPressクエリアーキテクチャを活用していません。代わりに、URLに渡された実際のクエリパラメータをキャプチャする必要があるため、クエリ変数を追加するオーバーヘッドは実際には必要ないと思います(ただし、クエリ変数痛くはありません、それもうまく動作します。)

'parse_request'フックを使用します

最後に、@ Bainternetが'parse_request'フックを使用することを好みました。 WordPressのデフォルトのMySQLクエリの前に実行されるため、単に破棄する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または私のもの;使用する選択。

3
MikeSchinkel