私は他のCMSからWordPressへの移行に取り組んでいます。古いサイトには、http://example.com?lid=1234
という形式の、SEOにとらわれないひどいURLがありました。
古いサイトからのすべての投稿をWordPressにインポートし、lid
をカスタムフィールドとして保存しています。
可能であればまだ古いURLを使用しても問題ありませんが、.htaccessを使用した約3,000の投稿があるため、問題外です。
だから私の質問は:URLからlid
値を抽出し、それをカスタムフィールドに含む投稿にリダイレクトする書き換えルールをどのように作成するのですか? (lid
の値は一意であるため、同じカスタムフィールド値を持つ複数の投稿についての心配はありません)
どうもありがとうサイモン
これがアイデアです。最初に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;
}
}
}
こんにちは@ Simon Blackbourn:
私が答えを書いている間に、投稿する前に@Bainternetも素晴らしい答えを出しました。彼はわずかに異なるアプローチを取りましたが、彼の作品は私の作品と同様に同じです。それでも、私が彼を見たときにすでに私のものを書いていたので、あなたが検討するための代替として私を提出します。
$post_id = $wpdb->get_var($sql)
私のソリューションは直接的なSQLを使用していますが、これは多くの場合最善のアプローチではありませんが、このSQLの単純さのためにここでは公平だと感じています(したがって将来的に壊れることはほとんどありません)そして、あなたのニーズはあなたの特定のサイトのために一回限りであるので、あなたのニーズのためにフックを処理するすべての必要性を持つ比較的重いget_posts()
を使用する利点がないので.
$_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または私のもの;使用する選択。