it-swarm.com.de

Fügen Sie jeder möglichen URL eine Sprache/einen Ländercode hinzu

Ich habe versucht, eine scheinbar einfache Anpassung der Permalink-Struktur zu erreichen, ohne Erfolg. Das Ziel ist es, immer /aa-bb/ vor jedem möglichen Permalink zu haben, wobei aa ein Sprachcode und bb ein Ländercode ist. Was danach kommt, sollte sich genau so verhalten, wie es normalerweise der Fall wäre. Wo Sie normalerweise /post-title/ haben, haben Sie anschließend /en-gb/post-title/ und dies führt zu demselben Beitrag (einschließlich aller Variationen wie Seiten, CPTs, Archive, Kategorien, Suchen usw.).

Der gesamte Ablauf:

  1. Ich erstelle eine Liste der gültigen Sprach-/Länderwerte = vollständig
  2. Ich rufe den Wert von der URL ab, um die Sprache/country = complete zu bestimmen.
  3. Während des Aktions-Hooks template_redirect leite ich in die Standardsprache/das Standardland um, wenn kein gültiger Wert vorhanden ist = complete
  4. Richten Sie eine Permalink-Umschreibestruktur ein, um diese URLs so zu verarbeiten, als ob der erste Teil nicht existiert hätte = mystery

Alle Methoden zum Umschreiben von WP -Permalinks scheinen etwas anderes zu bewirken als dieses Ziel. Ist das etwas, was mit htaccess besser gemacht werden könnte? WPML scheint es mit ihren Sprachcodes erfolgreich zu machen, aber ich bin mir nicht sicher, wie.

Die Verwendung von add_rewrite_rule funktioniert zwar, deckt jedoch immer nur einen Permalink-Typ ab, sodass ich Angst habe, zu kurz zu kommen, wenn ich alle Varianten manuell hinzufügen würde.

2
Berend

Ich arbeite gerade an einer ähnlichen Lösung - die Website muss in allen URLs (mit Ausnahme der Standardsprache) Sprachcodes enthalten, aber nur Seiten können so übersetzt werden, wie es WPML/Polylang-Plugins tun. Für Nachrichten (Blog) zeigen wir nur Beiträge in einer bestimmten Sprache an (sie sind getrennt, keine Übersetzungen voneinander). Alle anderen Inhalte sind in allen Sprachen gemischt. Die Benutzeroberfläche wird auch in einer von der URL festgelegten Sprache angezeigt.

Folgendes habe ich getan, um diese Umschreiberegeln mit vorangestellten Sprachcodes zu erhalten:

function prepend_default_rewrite_rules( $rules ) {

    // Prepare for new rules
    $new_rules = [];

    // Set up languages, except default one
    $language_slugs = ['ar', 'ku'];

    // Generate language slug regex
    $languages_slug = '(?:' . implode( '/|', $language_slugs ) . '/)?';


    // Set up the list of rules that don't need to be prefixed
    $whitelist = [
        '^wp-json/?$',
        '^wp-json/(.*)?',
        '^index.php/wp-json/?$',
        '^index.php/wp-json/(.*)?'
    ];

    // Set up the new rule for home page
    $new_rules['(?:' . implode( '/|', $language_slugs ) . ')/?$'] = 'index.php';

    // Loop through old rules and modify them
    foreach ( $rules as $key => $rule ) {

        // Re-add those whitelisted rules without modification
        if ( in_array( $key, $whitelist ) ) {

            $new_rules[ $key ] = $rule;

        // Update rules starting with ^ symbol
        } elseif ( substr( $key, 0, 1 ) === '^' ) { 

            $new_rules[ $languages_slug . substr( $key, 1 ) ] = $rule;


        // Update other rules
        } else {

            $new_rules[ $languages_slug . $key ] = $rule;

        }
    }


    // Return out new rules
    return $new_rules;
}
add_filter( 'rewrite_rules_array', 'prepend_default_rewrite_rules' );

Habe es nicht in vollem Umfang getestet - habe die Lösung erst nach dem Studium der WP_Rewrite-Klasse gefunden. Es ist also noch in Arbeit. Hoffe es hilft aber.

P.S .: Ich würde mich auch freuen, Ihre Lösung für "Ich rufe den Wert von der URL ab, um die Sprache/das Land zu bestimmen = vollständig" zu sehen - daran arbeite ich gerade :)

2
Ihor Vorotnov

Ich glaube, Sie könnten das polylang-Plugin verwenden. Ich habe eines meiner Projekte, wie Sie es erwähnt haben, mit diesem Plugin erstellt.

0
por