web-dev-qa-db-de.com

Wie füge ich eine Rewrite-Regel für nur eine Seite hinzu?

Ich möchte nur für bestimmte Seiten (nicht für alle Seiten) eine Neuschreibung hinzufügen, die einen Basis-Slug in den Permalink einfügt. Dies ist eine einzigartige Situation, in der wir alle Seitennamen im Voraus kennen und sie sich nicht ändern.

Zum Beispiel:

sitename.com/pagetitle

zu

sitename.com/service/pagetitle

Ich versuche "add_rewrite_rule" zu benutzen, habe aber nicht viel Glück. Unten ist eine meiner Iterationen und ich habe viele gehabt. Jede Anleitung wäre dankbar.

Ich verstehe, dass es ein Plugin gibt, mit dem Sie Ihre Permalinks für Ihren Post und Ihre Seiten nach Belieben ändern können, aber ich hatte gehofft, ich könnte es programmgesteuert selbst tun.

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

Code unten aktualisiert:

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

Mit diesem Code kann auf den Link unter "services/statictitle" zugegriffen werden. Der alte Link ist jedoch weiterhin verfügbar. Ich bin mir also nicht sicher, ob ich das richtig mache. Jede Hilfe wäre willkommen.

Vielen Dank.

Update

Hier ist ein alternativer Weg, den ich für geeigneter halte. Dies gilt jedoch für alle Seiten. Gibt es eine Möglichkeit, nur den Seitennamen oder die ID als Ziel festzulegen?

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

Annahme: Sie verwenden Apache als Webserver.

Wenn Sie die Seitenbutzen bereits kennen und sie sich nicht ändern, fügen Sie sie einfach Ihrer .htaccess-Datei hinzu. Es wird viel schneller und weniger kompliziert sein.

Fügen Sie die folgenden Redirect-Zeilen oben in Ihre .htaccess-Datei ein.

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


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

Bitte werfen Sie einen Blick auf den folgenden Code:

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

Zum besseren Verständnis der Rewrite-API überprüfen Sie bitte die WP_REWRITE_API und Erstellung angepasster URLs in WordPress

Warte auf ihr Feedback!

Hoffe, es wird für Sie arbeiten!

0

Dieser Ansatz könnte etwas flexibler sein.

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

Am Ende der Klassendefinition sollten Sie eine base und eine page hinzufügen können. Die URL-Umschreibungen werden dynamisch für die von Ihnen hinzugefügten Regeln erstellt. Wenn eine page direkt aufgerufen wird, wird sie an den $base/$pageTitle weitergeleitet.

<?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

Der andere Teil, den Sie hier ausführen müssen, besteht darin, den Permalink der Seite mit dem page_link-Filter oder dem the_permalink-Filter zu ändern.

hier ist eine eigene Spiegelfrage - https://stackoverflow.com/questions/27432586/wordpress-page-link-filter

Dies führt die Weiterleitungen durch, da WordPress auf die kanonische Adresse umleitet, wenn die URL, auf die zugegriffen wird, nicht mit der kanonischen übereinstimmt und die kanonische URL für Posts und Seiten deren Permalink ist. Als zusätzlichen Bonus erhalten Sie alles andere, das auf die richtige URL verweist, ohne dass eine Umleitung erforderlich ist.

0
Mark Kaplun

Ich weiß, dass Sie speziell nach Umschreibregeln gefragt haben, aber was ist mit der Umleitung? Sie können das gleiche Endergebnis und die gleiche Benutzererfahrung erzielen. Sie können die Hierarchie Ihrer Seiten ändern, wenn Sie dies möchten

sitename.com/service/pagetitle

ist verfügbar und

sitename.com/pagetitle

ist etwas, das an die erste Adresse umgeleitet wird.

Dadurch wird der Einfachheit halber Ihr .htaccess übersprungen. Es sieht so aus, als ob Sie tatsächlich lernen möchten, wie dies als Umschreiberegel zu tun ist, was cool ist. Wenn Sie jedoch feststellen, dass es schwierig ist und Sie nur eine Lösung suchen, die funktioniert, unabhängig davon, ob Sie dies lernen oder nicht, gibt es einige andere Redirection-Plugins, die dies für Sie erledigen können. Mein persönlicher Favorit trägt den Titel "Umleitung" und kann mit Regex umgehen (mit ein wenig Übung). Außerdem zählt er, wie oft eine Umleitungsregel verwendet wird, damit Sie überwachen können, ob Sie sie überhaupt beibehalten müssen.

Zuletzt erwähnte ich am Anfang, dass Sie Ihre Seitenhierarchie ändern können, um zu reflektieren, wie Ihre URLs aussehen sollen, und Sie sollten dies wahrscheinlich so oder so tun, wenn Sie es noch nicht getan haben. Wenn nicht, befinden Sie sich möglicherweise in einer unendlichen Umleitungssituation. (Dies sollte auch beachtet werden, wenn Sie sich für das Redirect-Plugin entscheiden, und ich habe festgestellt, dass dies bei Benutzern mit vielen Redirects leicht möglich ist und sie einen neuen erstellen, der mit einem bereits vorhandenen in Konflikt steht.)

TLDR: außerhalb der Box Antwort. Es gibt ein oder mehrere Plugins, die diese Funktion ausführen können, ohne dass tatsächlich ein Neuschreiben durchgeführt wird.

0
KnightHawk

Ich bin auf eine sehr ähnliche Situation gestoßen, die Ihren Erwartungen zu entsprechen scheint.

Wir haben eine übergeordnete Seite "Unsere Dienste" (domain.com/services/) ...

Wir haben auch mehrere untergeordnete Seiten, die jeden Dienst darstellen, der unter der übergeordneten Seite "Unsere Dienste" bereitgestellt wird. Zum Beispiel: "Web Design" (domain.com/services/web-design/)

Jetzt haben wir auch ein "Portfolio". Anstatt einen vollständigen Abschnitt der obersten Ebene auf der Website für das Portfolio zu widmen, haben wir beschlossen, ihn unter dem Hauptabschnitt "Dienste" (domain.com/services/) zu platzieren.

So sollte sich beispielsweise der Hauptteil unseres Portfolios hier befinden: domain.com/services/portfolio/

Das Portfolio ist ein eigener benutzerdefinierter Beitragstyp, der einzelne Portfolioelemente enthält.

Die URL zu einem bestimmten Portfolioelement sah also folgendermaßen aus: domain.com/services/portfolio/sample-portfolio-item/.

Wenn Sie Ihren benutzerdefinierten Beitragstyp registrieren, gibt es einen konfigurierbaren Parameter für rewrite['slug']. Hier würden Sie $args['rewrite']['slug'] = 'services/portfolio'; angeben

Natürlich müssen Sie bei jeder Änderung der URL-Umschreiberegeln die Umschreiberegeln leeren. Programmatisch würden Sie flush_rewrite_rules(); verwenden, optional für schnelle Tests, Sie könnten immer einfach zu Dashboard -> Settings -> Permalinks navigieren, da dies automatisch die Umschreiberegeln für Sie löscht, einfach indem Sie diese Admin-Seite besuchen.

Hoffe, Sie (oder jemand) findet die Informationen in meiner Antwort nützlich und relevant.

0
Michael Ecklund