it-swarm.com.de

Mehrere benutzerdefinierte Beitragstypen mit derselben Taxonomie = URL-Frustrationen

Ich habe zwei benutzerdefinierte Beitragstypen:

  • Veranstaltungen
  • Unternehmen

Ich habe eine neue Taxonomie, die diese beiden CTPs gemeinsam haben:

  • Standorte

Wenn ich zu "domain.com/events/" gehe, sehe ich ein Archiv aller Ereignisse, und wenn ich zu "domain.com/businesses/" gehe, sehe ich ein Archiv aller Geschäfte. So weit, ist es gut.

Wenn ich zu "domain.com/locations/" gehe, sehe ich ein Archiv aller Ereignisse UND Geschäfte, das in Ordnung ist.

Wie kann ich jedoch nur die Veranstaltungsorte anzeigen? "domain.com/locations/events" oder "domain.com/events/locations" funktionieren nicht.

Muss ich die Umschreibungseinstellungen für die Standorttaxonomie oder die CPT ändern? Es scheint, ich stecke fest!

3
pixelkicks

Sie müssen einige neue Umschreiberegeln hinzufügen, zum Glück macht es WordPress mit ein paar Funktionsaufrufen ziemlich einfach.

// use the init action to modify rewrite rules
add_action( 'init', function() {
    global $wp_rewrite;

    // add rewrite tag for the post type
    // - %posttype% is a new tag that will be replaced with the regex in the actual query
    // - the regex will extract the post_type name from the URL and use it in the query
    add_rewrite_tag( '%posttype%', '([^/]+)', 'post_type=' );

    // create the new permastruct by combining the post type & taxonomy permastructs
    // - custom taxonomies and post types are added to the extra_permastructs array in WP_Rewrite
    // - change 'category' to desired taxonomy
    // - output will be '%posttype%/category/%category%'
    $types_and_cats_permastruct = '%posttype%' . $wp_rewrite->get_extra_permastruct( 'category' );

    // add the permastruct for post type & taxonomy
    add_permastruct( 'post_type_and_category', $types_and_cats_permastruct, array(
        'with_front' => true,           //  - with_front (bool) - Should the structure be prepended with WP_Rewrite::$front? Default is true.
        'ep_mask' => EP_ALL_ARCHIVES,   //  - ep_mask (int) - Endpoint mask defining what endpoints are added to the structure. Default is EP_NONE.
        'paged' => true,                //  - paged (bool) - Should archive pagination rules be added for the structure? Default is true.
        'feed' => true,                 //  - feed (bool) - Should feed rewrite rules be added for the structure? Default is true.
        'forcomments' => false,         //  - forcomments (bool) - Should the feed rules be a query for a comments feed? Default is false.
        'walk_dirs' => false,           //  - walk_dirs (bool) - Should the 'directories' making up the structure be walked over and rewrite
                                        //    rules built for each in turn? Default is true.
        'endpoints' => true             //  - endpoints (bool) - Should endpoints be applied to the generated rewrite rules? Default is true.
    ) );

} );

Um zu erklären, was ich oben mache:

  1. Hinzufügen eines Umschreibetags mit add_rewrite_tag() , damit der Name des benutzerdefinierten Beitragstyps in der URL (z. B./events/location/uk /) durch den regulären Ausdruck und die resultierende Abfrage WP Runs würden post_type=events enthalten
  2. Erstellen Sie eine neue Permastruktur, um Regeln für die Verwendung des gerade hinzugefügten Tags und der vorhandenen Taxonomie-Permastruktur zu generieren. In Ihrem Fall ist dies der Ort, an dem /event/location/uk Ereignisse in Großbritannien und /business/location/uk Unternehmen in Großbritannien anzeigt
  3. Hinzufügen der neuen Permastruktur mit add_permastruct() , sodass WP die neuen Umschreiberegeln generiert, wenn Permalinks aktualisiert werden. Im 3. Parameter ist es sehr wichtig, dass walk_dirs auf false gesetzt ist, da Sie einige unerwünschte aggressive Umschreibregeln mit Archiven für /%posttype%/category/ und /%posttype%/ erhalten.

Fallstricke

  • Generieren von Links - Wenn Sie the_terms() verwenden möchten, um Standortlinks für ein Unternehmen oder Ereignis auszugeben, das nur den ursprünglichen Beitragstyp anzeigt, müssen Sie die URLs filtern oder eine benutzerdefinierte Funktion schreiben, um URLs entsprechend Ihrer Permastruktur auszugeben
  • Wenn Sie niemals ein Archiv haben möchten, in dem sowohl Ereignisse als auch Unternehmen aufgelistet sind, sind zwei separate Taxonomien besser geeignet, da Sie leichter erkennen können, ob in einem Begriff Beiträge enthalten sind, z. beim Erzeugen von Links und beim Entscheiden, ob ein Link in ein leeres Archiv ausgegeben werden soll oder nicht. In diesem Fall ist @ richard-howarths Antwort richtig
3
sanchothefat

Sie können den in den Argumenten zu verwendenden Slug angeben, wenn Sie die Funktion register_taxonomy mit 'rewrite' aufrufen.

Sie hätten also ungefähr Folgendes:

$args = array(
    'labels' => $labels,
    'rewrite' => array( 'slug'=>'events/locations' )
);
register_taxonomy( 'event_location_tax_name', 'event_location_cpt_name', $args );

Und dann für Unternehmen replizieren:

$args = array(
    'labels' => $labels,
    'rewrite' => array( 'slug'=>'businesses/locations' )
);
register_taxonomy( 'business_location_tax_name', 'business_location_cpt_name', $args );

Hoffentlich hilft das?!

Vielen Dank, Rik

0
Richard Howarth