web-dev-qa-db-de.com

Verwenden von benutzerdefinierten/dynamischen "Slugs" für eine Seite

Ich habe eine benutzerdefinierte Seite, die eine Vorlage namens "Stores" http://example.com/stores/ verwendet. Diese Seite enthält eine Liste von Bundesstaaten und/oder Unternehmen als Kategorien. Für dieses System habe ich einen benutzerdefinierten Beitragstyp "Geschäft", der einer einzelnen Kategorie (entweder Staat oder Firma) zugeordnet werden kann.

Jedes Geschäft ist keine bestimmte Seite, sondern Kontaktinformationen, die in einer Art Telefonbuch-Layout für Bundesstaaten/Unternehmen angezeigt werden.

Das Problem, das ich jetzt habe, ist, wie kann ich zulassen, dass meine "Stores" -Vorlage URL-Anfragen von http://example.com/stores/california/ akzeptiert (ohne 404-Fehler auszulösen)?

California ist in diesem Sinne keine Seite, sondern eine Abfrage. Ich möchte auch nicht manuell eine Seite für jede dieser Kategorien erstellen (da diese aus der Datenbank abgerufen wird und automatisch). Ich könnte ?state=california für diesen Zweck verwenden, aber ich würde gerne erfahren, wie ich diese URL in WordPress zulasse.

Ist der richtige Weg, um die htaccess-Datei manuell zu bearbeiten? Wäre das nicht überschrieben, wenn Sie die Permalink-Struktur bearbeiten? Wie würde ich den htaccess formatieren?

4
Radley Sustaire

Erstellen Sie eine Seitenvorlage

Füge eine neue Seite hinzu und gib ihr den Slug stores

Fügen Sie eine öffentliche Abfragevariable hinzu

add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
    $vars[] = 'state';
    return $vars;
}

Fügen Sie eine Umschreiberegel hinzu

Dadurch wird Ihre Anfrage an Ihre stores Seite weitergeleitet.

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

In Ihrer Vorlage

Sie können wie folgt auf Ihre Statusvariable zugreifen:

 $state = get_query_var('state');

Flush deine Permalinks

Besuchen Sie Einstellungen-> Permalinks, um Ihre Permalinks zu löschen und Ihre Umschreiberegel dem Stapel hinzuzufügen.

11
Brian Fegter

Ich habe die Antwort auf der Wordpress-Website gefunden und die Lösung getestet: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule#Using_Custom_Templates_with_custom_querystring

Erstellen Sie eine Seitenvorlage

Erstellen Sie eine Seitenvorlage für Stores und wenden Sie diese auf eine Seite an.

$stores = get_query_var('stores');

Fügen Sie ein Rewrite-Tag hinzu

Fügen Sie in Ihrer functions.php ein Rewrite-Tag hinzu, mit dem Wordpress nach dem entsprechenden Tag suchen kann

function custom_rewrite_tag() {
  add_rewrite_tag('%stores%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);

Fügen Sie eine Rewrite-Regel hinzu

Um nun die URL zu formatieren und mit den vars auf die index.php zu verweisen, geben Sie Folgendes in Ihre functions.php ein. Hinweis: Sie müssen die page_id auf die page_id der Stores-Seite aktualisieren (in diesem Beispiel ist es 12).

  function custom_rewrite_rule() {
    add_rewrite_rule('^stores/([^/]*)/?','index.php?page_id=12&stores=$matches[1]','top');
  }
  add_action('init', 'custom_rewrite_rule', 10, 0);

Von dort aus können Sie nach/stores/south-dakota/navigieren. Die Variable $ stores in Ihrer Seitenvorlage lautet "south-dakota".

6
Jared Pomranky

Ich habe auch versucht, dasselbe zu tun und habe es schließlich auf folgende Weise getan.

Fügen Sie den folgenden Code zu Ihrer functions.php in Ihrem Theme hinzu.

add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
    $vars[] = 'state';
    return $vars;
}

add_rewrite_rule('^stores/([^/]+)/?$','index.php?pagename=stores&state=$matches[1]','top');

Rufen Sie in Ihrer Vorlage die Abfragevariable auf

$state = get_query_var('state');
1
Nayan