it-swarm.com.de

Zugriff auf dieselbe Seite über mehrere URLs (Platzhalter)

Ich möchte eine bestimmte Wordpress-Seite für mehrere URLs bereitstellen. Grundsätzlich möchte ich alle URLs in einem bestimmten Format auf eine bekannte Seite verweisen:

/some-prefix-* => /target-page

Wenn Sie auf /some-prefix-and-here-something zugreifen, sollte /target-page geladen werden.

Wie macht man das?

Hinweis: Ich möchte den Benutzer nicht umleiten, aber in der Lage sein, eine vorhandene Seite an mehrere URLs weiterzuleiten.

Der .htaccess sieht so aus:

# BEGIN s2Member GZIP exclusions
RewriteEngine On RewriteRule ^prefix-*$ some/path/to/directory-$1 [NC,L]
<IfModule rewrite_module>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{QUERY_STRING} (^|\?|&)s2member_file_download\=.+ [OR]
    RewriteCond %{QUERY_STRING} (^|\?|&)no-gzip\=1
    RewriteRule .* - [E=no-gzip:1]
</IfModule>
# END s2Member GZIP exclusions

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

DirectoryIndex index.php index.html

Ich dachte, durch das Hinzufügen von RewriteEngine On RewriteRule ^prefix-*$ some/path/to/directory-$1 [NC,L] wird /prefix-* von some/path/to/directory-$1 geliefert. Zum Beispiel: Wenn Sie auf example.com/prefix-foo zugreifen, sollte dies mit example.com/some/path/to/directory-foo identisch sein (was in example.com/some/path/to/directory-foo/index.html aufgelöst wird).

Wenn es bereits eine Wordpress-Seite mit dem Namen prefix-bar gibt, sollte /prefix-bar nicht example.com/some/path/to/directory-bar/index.html laden.

6
Ionică Bizău

Sie können template_include verwenden, aber bevor Sie sich an diesen Filter binden, müssen Sie die folgenden Schritte ausführen:

  1. Seitenvorlage erstellen. z. B .: page-target.php

    <?php
    /**
     * Template Name: Page Target
     */
    ...
    
  2. Fragen Sie den Inhalt von target-page in der page-target.php-Vorlage manuell ab, da der globale $post auf Ihre some-prefix-*-Seite verweist.

  3. (Optional): Bearbeiten Sie die Seitenvorlage Page Target und wenden Sie sie über die Seitenattribute auf Ihren /target-page an

Fügen Sie dann Folgendes zu Ihrer functions.php-Datei hinzu

add_filter('template_include', function($template) {
    global $post;

    $prefix = 'some-prefix-'; // Your prefix
    $prefixExist = strpos($post->post_name, $prefix) !== false;

    if ($prefixExist) {
        return locate_template('page-target.php'); //Your template
    }

    return $template;
});

Über dem Filter wird die Vorlage mit page-target.php überschrieben, wenn die Bedingung erfüllt ist, andernfalls mit default

Bearbeiten:

Ich glaube, ich habe einen besseren Weg gefunden, dies mit add_rewrite_rule zu lösen.

function custom_rewrite_basic() {
  $page_id = 123; //Your serve page id
  add_rewrite_rule('^some-prefix-.*', 'index.php?page_id=' . $page_id, 'top');
}
add_action('init', 'custom_rewrite_basic');

WICHTIG: Vergessen Sie nicht, nach dem Ändern der Regeln die Datenbank mit den Umschreiberegeln zu leeren und neu zu generieren. Wählen Sie in den WordPress-Administrationsbildschirmen Einstellungen -> Permalinks und klicken Sie auf Änderungen speichern, ohne Änderungen vorzunehmen.

9
Rahil Wazir

Hinweis dass Suchmaschinen möglicherweise nicht mehrere Pfade zu demselben Inhalt mag!

Hier nehme ich an, Sie möchten z.

example.tld/some/path/to/painting-orange
example.tld/painting-blue
example.tld/painting-red
example.tld/painting-yellow

sich so zu verhalten, als wäre es diese Seite:

example.tld/paintings

aber nicht so für Pfade wie:

example.tld/painting-white/painting-brown/large
example.tld/painting-brown/small

Hier gilt die Regel, das Präfix auf der linken Seite von basename( $path ) abzugleichen.

Hier ist ein kleiner Hack mit dem Filter request, um zu überprüfen, ob der aktuelle Seitenname korrekt vorangestellt ist:

<?php
/** 
 * Plugin Name: Wildcard Pages
 */
add_filter( 'request', function( $qv )
{
    // Edit to your needs
    $prefix = 'painting-';
    $target = 'paintings';

    // Check if the current page name is prefixed
    if(    isset( $qv['pagename'] )
        && $prefix === substr( basename( $qv['pagename'] ), 0, strlen( $prefix ) ) 
    )
        $qv['pagename'] = $target;

    return $qv;
} );

Passen Sie dies an Ihre Bedürfnisse an. Dann erstelle die Plugin-Datei /wp-content/plugins/wpse-wildcard-pages/wpse-wildcard-pages.php und aktiviere das Plugin über das Backend.

Wir könnten auch ein Häkchen mit get_page_by_path() auf der Zielseite einfügen, um sicherzustellen, dass es existiert. Möglicherweise möchten wir dies auch auf bestimmte Beitragstypen beschränken.

4
birgire

Erstellen Sie einen Hook für init und wp_redirect, wenn der Slug des aktuellen Posts mit Ihrem Präfix beginnt.

function wp_init() {

    global $post;
    $slug = $post->post_name;
    $prefix = 'foobar';
    if (substr($slug, 0 strlen($prefix))==$prefix) {
        wp_redirect(123); // your page id
    }

}
add_action('init', 'wp_init');
0
Fleuv