web-dev-qa-db-ja.com

1ページだけの書き換え規則を追加する方法

私は、パーマリンクにベーススラッグを挿入するような特定のページ(すべてのページではない)だけに書き換えを追加したいと思います。これは、私たちがすべてのページ名を事前に知っていて、変更されないような、独特の状況です。

例えば:

sitename.com/pagetitle

sitename.com/service/pagetitle

私は "add_rewrite_rule"を使おうとしていますが、あまり運がありません。以下は私の繰り返しのうちの1つです、そして私はたくさん持っていました。どんなガイダンスもいただければ幸いです。

私はあなたがあなたの投稿とページのあなたのパーマリンクをあなたが望むものに完全に変えることを可能にするプラグインがあることを理解しています、しかし私がプログラム的にそれを自分でできることを願っています。

add_action( 'init', 'page_change' );
function page_change()
{
    add_rewrite_rule(
        '^pagenamehere/?',
        'index.php?post_type=service',
        'top' );
}

以下のコードを更新しました:

function new_rewrite_rule()
{
    add_rewrite_rule('^services/statictitle$', 'index.php?pagename=oldname', 'top');
}
add_action('init', 'new_rewrite_rule');

それで、このコードはリンクが 'services/statictitle'でアクセスできるようにします。ただし、古いリンクにはまだアクセス可能です。だから私は正しいやり方でこれについて取り組んでいるかどうかわからない.....どんな助けでも感謝されるでしょう。

ありがとう。

アップデート

これが私がより適しているかもしれないと思う代替方法です。ただし、これはすべてのページを対象としています。単にページ名またはIDをターゲティングする方法はありますか?

function custom_page_rules() {
  global $wp_rewrite;
  $wp_rewrite->page_structure = $wp_rewrite->root . 'services/%pagename%'; 
}
1

仮定: あなたはあなたのウェブサーバーとしてApacheを使用しています。

ページのスラグがすでにわかっていても変更されない場合は、それらを.htaccessファイルに追加するだけです。それはずっと速くそしてより少なく複雑になるでしょう。

次のRedirect行を.htaccessファイルの先頭に貼り付けます。

Redirect 301 /pagetitle/ /service/pagetitle/
Redirect 301 /pagetitle2/ /another-dir/pagetitle2/


# BEGIN WordPress
<IfModule mod_rewrite.c>
....
2
cowgill

以下のコードを見てください。

add_rewrite_rule( 'services/([^/]*)/?','index.php?post_type='.$post_type.'&name=$matches[1]','top');

書き換えAPIの理解を深めるには、 WP_REWRITE_API および WordPressでのカスタマイズされたURLの作成 を確認してください。

あなたのフィードバックを待っています!

それがあなたのために働くことを願っています!

0

このアプローチはもう少し柔軟かもしれません。

$basePageRewrite->add_rule( 'service', 'page-title' );

クラス定義の最後にbasepageを追加することができるはずです。 URLの書き換えは、追加したルールに対して動的に構築されます。 pageが直接呼び出されると、isは$base/$pageTitleにリダイレクトされます。

<?php

if ( ! class_exists( 'BasePageRewrite' ) ):

    class BasePageRewrite {

        const ENDPOINT_QUERY_PARAM_REDIRECT = '____base_page_rewrite__redirect';

        private static $_hash_map = array ();

        /**
         * BasePageRewrite constructor.
         */
        public function __construct() {
            add_filter( 'query_vars', array ( $this, 'add_query_vars' ), 0 );
            add_action( 'parse_request', array ( $this, 'sniff_requests' ), 0 );
            add_action( 'init', array ( $this, 'add_endpoint' ), 0 );
        }

        /**
         * Add rewrite rules here.
         *
         * @param string $base Base of URL
         * @param string $page Slug of page
         */
        public function add_rule( $base, $page ) {
            if ( ! array_key_exists( $base, static::$_hash_map ) ) {
                static::$_hash_map[ $base ] = array ();
            }

            if ( ! array_key_exists( $page, static::$_hash_map[ $base ] ) ) {
                static::$_hash_map[ $base ][ $page ] = 'name';
            }
        }

        /**
         * Add our custom query arg to check in `parse_request`.
         *
         * @param $vars
         *
         * @return array
         */
        public function add_query_vars( $vars ) {
            $vars[] = static::ENDPOINT_QUERY_PARAM_REDIRECT;

            return $vars;
        }

        /**
         * Add rewrite rules.
         *
         *      page --> base/page
         *
         *      base/page === page
         *
         * Note:
         *
         *      `flush_rewrite_rules()` is only added for testing.
         */
        public function add_endpoint() {

            foreach ( static::$_hash_map as $base => $pages ) {

                foreach ( $pages as $pageName => $param ) {

                    // page --> service/page

                    add_rewrite_rule( "^$pageName/", 'index.php?' . static::ENDPOINT_QUERY_PARAM_REDIRECT . "=/$base/$pageName/", 'top' );

                    // service/page === page

                    add_rewrite_rule( "^$base/$pageName/", "index.php?$param=$pageName", 'top' );
                }
            }

            //////////////////////////////////
            flush_rewrite_rules( true );  //// <---------- REMOVE THIS WHEN DONE TESTING
            //////////////////////////////////
        }

        /**
         * Redirect regular page to base/page,
         *
         * @param $wp_query
         */
        public function sniff_requests( $wp_query ) {

            global $wp;

            if ( isset( $wp->query_vars[ static::ENDPOINT_QUERY_PARAM_REDIRECT ] ) ) {

                // page --> service/page

                $redirect = $wp->query_vars[ static::ENDPOINT_QUERY_PARAM_REDIRECT ];
                $new_url  = site_url( $redirect );
                wp_redirect( $new_url, 301 );
                die();
            }
        }
    }

    // Create the class
    $basePageRewrite = new BasePageRewrite();

    // Add individual rules
    $basePageRewrite->add_rule( 'service', 'page-title' );
    $basePageRewrite->add_rule( 'another-service', 'another-page-title' );

endif; // BasePageRewrite
0
jgraup

あなたがここでする必要がある他の部分、それはpage_link filterかthe_permalink filterでページのパーマリンクを変えることです。

ここにあなた自身への鏡の質問があります - https://stackoverflow.com/questions/27432586/wordpress-page-link-filter

アクセスされているURLが正規のURLと異なる場合、wordpressは正規のアドレスにリダイレクトし、投稿やページの正規のURLはパーマリンクになっているため、これでリダイレクトが行われます。追加のボーナスとして、リダイレクトを必要とせずに、他のすべてのものが正しいURLを指すようになります。

0
Mark Kaplun

私はあなたが具体的に書き換え規則を要求したことを知っていますが、リダイレクトについてはどうですか?同じ結果と同じユーザーエクスペリエンスを実現できます。必要に応じてページの階層を変更できます。

sitename.com/service/pagetitle

利用可能です

sitename.com/pagetitle

最初のアドレスにリダイレクトされるものです。

これはあなたの.htaccessを単純にスキップします。書き換え規則としてこれを行う方法を実際に学びたいのですが、それはクールですが、それが困難であると判断し、これを習得したかどうかに関係なく解決するソリューションが必要な場合これを処理できるリダイレクトプラグイン私の個人的なお気に入りは "Redirection"というタイトルで、(少し慣れているが)regexを処理することができます。また、リダイレクトルールが使用されている回数をカウントするので、必要に応じて監視できます。

最後に、最初に、ページの階層を変更してURLの外観を反映させることができると述べました。まだ行っていない場合は、どちらかの方法でこれを実行する必要があります。そうでない場合は、あなたは無限のリダイレクト状況に自分自身を見つけるかもしれません。 (これは、リダイレクトプラグインを使用する場合や、リダイレクトが多数存在し、既存のものと競合する新しいものを作成する場合に簡単に発生することがわかりました。)

_ tldr _ :ボックスの外側に答えます。実際に書き換えることなくこの機能を実現できるプラグインが1つ以上あります。

0
KnightHawk

私はあなたの期待と思われる状況と非常によく似た状況に遭遇しました。

親ページ "Our Services"(domain.com/services/)があります...

また、親ページ「Our Services」の下に提供される各サービスを表す複数の子ページもあります。例:「Webデザイン」(domain.com/services/web-design/

現在、「ポートフォリオ」もあります。 Webサイトの最上位セクション全体をポートフォリオ専用にする代わりに、メインの「サービス」セクション(domain.com/services/)の下に配置することにしました。

したがって、たとえば、ポートフォリオのメインセクションは次の場所にあります。domain.com/services/portfolio/

ポートフォリオは、個別のポートフォリオアイテムを含む独自のカスタムポストタイプです。

したがって、特定のポートフォリオアイテムへのURLはdomain.com/services/portfolio/sample-portfolio-item/のようになりました。

カスタム投稿タイプを登録すると、rewrite['slug']の構成可能なパラメーターがあります。これは、$args['rewrite']['slug'] = 'services/portfolio';を指定する場所です

もちろん、URL書き換えルールに変更を加えるときはいつでも、書き換えルールをフラッシュする必要があります。プログラムでflush_rewrite_rules();オプションを使用してクイックテストを行うこともできます。これは、単に[admin]ページにアクセスするだけで、自動的に書き換えルールをフラッシュするため、常にDashboard -> Settings -> Permalinksに移動できます。

あなた(または誰か)が私の答えの情報が有用で関連性があることを願っています。

0
Michael Ecklund