it-swarm.com.de

Rewrite-Regeln leiten VARs um und leiten sie nicht weiter

Ich habe den folgenden Code in meiner functions.php-Datei.

<?php
add_action('init', 'flush_rewrite_rules');

function custom_add_rewrite_rules( $wp_rewrite ) {
    $new_rules = array( 
        'insurance-leads-types/auto-insurance-leads/([^/\.]+)/?$' => 'index.php?pagename=auto-insurance-leads&state=' . $wp_rewrite->preg_index(1),
        'insurance-leads-types/home-insurance-leads/([^/\.]+)/?$' => 'index.php?pagename=home-insurance-leads&state=' . $wp_rewrite->preg_index(1)
    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'custom_add_rewrite_rules');

function add_query_vars( $query_vars ) {
  $query_vars[] = 'state';
  return $query_vars;
}
add_filter( 'query_vars', 'add_query_vars' ); 

Wenn ich auf die Seite/Insurance-Leads-Types/Auto-Insurance-Leads/STATENAME gehe, wird die URL weitergeleitet zu/Insurance-Leads-Types/Auto-Insurance-Leads/ohne den nachfolgenden STATENAME/und die Variable wird nicht übergeben zu $ query_vars.

Ich habe den Rewrite Analyzer von Monkeyman verwendet und alles sieht gut aus:

seitenname: Auto-Versicherung führt

zustand: (. [^ /] +)

Irgendwelche Ideen, warum die URL umleitet?

1

Ich würde dies mit der Funktion add_rewrite_endpoint() angehen.

Es kümmert sich um das Hinzufügen von Abfragevariablen und ist viel einfacher einzurichten. Außerdem müssen Sie sich keine Gedanken mehr über das Ändern von Seiten-Slugs usw. machen.

Der Code wäre:

// in functions.php
add_action( 'init', 'wpse42604_add_endpoints' );
function wpse42604_add_endpoints() {
   add_rewrite_endpoint( 'state', EP_PAGES );
}

// in template file eg. page.php   
if ( '' != get_query_var( 'state' ) ) {
    // ... do stuff with the state query var
}

Der einzige Nachteil (je nachdem, wie Sie es sehen) ist, dass Sie nicht die genauen URLs erhalten, die Sie oben angegeben haben. Sie sehen dann so aus:

insurance-leads-types/auto-insurance-leads/state/tx/

Aber es ist eine robustere und flexiblere Lösung, und die URL sieht immer noch gut aus und ist lesbar.

Das Problem, das Sie sehen, ist eines, auf das ich zuvor gestoßen bin, weil WordPress die Umschreiberegeln verarbeitet und eine kanonische Umleitung durchführt, bevor ich mir die Umschreibungen anschaue. Leider ist es eine Weile her, dass ich mich nicht mehr an Details erinnern kann, aber es ist die Funktion redirect_canonical() in wp-includes/canonical.php, die mir ein ähnliches Problem bereitet hat.

1
sanchothefat

Sie sollten wahrscheinlich die eingebauten Funktionen rewrite api verwenden, anstatt den Filter generate_rewrite_rules zu verwenden. Es gibt einige Probleme mit Ihrem rewrite regulären Ausdruck. Sie müssen jeweils mit einer Möhre ^ beginnen, um WP anzuweisen, dass die Übereinstimmung am Anfang der URL beginnt.

Ich bin mir nicht sicher, was Sie mit dem ([^/\.]+) erreichen wollen. Etwas, das kein Schrägstrich oder eine Periode ist? Wenn das der Fall ist, wird es wahrscheinlich nicht so funktionieren, wie Sie es erwarten. Jemand könnte insurance-leads-types/auto-insurance-leads/tx.state/ eingeben und es würde nicht abgeglichen werden, da Ihre Regex das Zeug nach dem Punkt nicht berücksichtigt.

Hier ist eine Arbeitsversion, die mit allem übereinstimmt, was in der letzten Gruppe kein Schrägstrich ist.

<?php
add_action( 'init', 'wpse42604_add_rewrite' );
function wpse42604_add_rewrite()
{
    add_rewrite_rule(
        '^insurance-leads-types/auto-insurance-leads/([^/]+)/?$',
        'index.php?pagename=auto-insurance-leads&state=$matches[1]',
        'top'
    );
    add_rewrite_rule(
        '^insurance-leads-types/home-insurance-leads/([^/]+)/?$',
        'index.php?pagename=home-insurance-leads&state=$matches[1]',
        'top'
    );
}

Der ganze Code als Plugin . Ich habe ein wirklich umfangreiches Tutorial über die Rewrite-API geschrieben, das einen Blick wert ist.

Bearbeiten: Es kann auch zu unvorhersehbarem Verhalten beim Löschen von Umschreiberegeln kommen, wenn eine Seite geladen wird, wie es Ihr Code tut.

1
chrisguitarguy