it-swarm.com.de

Wie überprüfe ich, ob das letzte uri-Segment ein benutzerdefinierter Beitragstyp oder ein Taxonomiebegriff ist?

Nachdem Sie Jeffs Vorschlag zu diesem Thread gefolgt haben, um verschachtelte Taxonomiebegriffe für Eltern und Kinder in einem Permalink wie ... zu erstellen.

url.com/custom-post-type/taxonomy-parent/taxonomy-child/cpt-entry

Meistens funktioniert es bis auf ein Problem.

Bevor ich fortfahre, sollte ich erwähnen, dass ich einen benutzerdefinierten Beitragstyp namensgalleryund eine Taxonomie namensgallery_cathabe.


ARBEITEN

/gallery/ - archive-gallery.php
/gallery/wedding-cakes/ - parent taxonomy - taxonomy-gallery_cat.php     
/gallery/wedding-cakes/chocolate/ - child taxonomy - taxonomy-gallery_cat.php      
/gallery/wedding-cakes/chocolate/cpt-entry/ - CPT entry under child taxonomy - single-gallery.php

FUNKTIONIERT NICHT

/gallery/wedding-cakes/cpt-entry/ - CPT entry under parent taxonomy


Hier ist mein Code in functions.php:

// ADD A GALLERY CUSTOM POST TYPE WITH GALLERY_CAT TAXONOMY
add_action('init', 'create_gallery_post_type');

function create_gallery_post_type() {

register_taxonomy(
    'gallery_cat',
    'gallery',
     array(
        'label' => 'Categories',
        'singular_label' => 'Category',
        'hierarchical' => true,
        'query_var' => true,
        'rewrite' => array('slug' => 'gallery', 'hierarchical' => true ),
    )
);

$labels = array(
    'name' => _x('Gallery', 'post type general name'),
    'singular_name' => _x('Photo', 'post type singular name'),
'add_new' => _x('Add New', 'gallery'),
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'query_var' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'excerpt', 'author', 'comments'),
    'rewrite' => array(
        'slug' => 'gallery/%gallery_cat%',
        'with_front' => false
    ),
    'has_archive' => 'gallery',
    'menu_icon' => get_bloginfo('template_directory') . '/images/gallery-icon.png' //16x16 png if you want an icon
); 

register_post_type( 'gallery' , $args );
}



function filter_post_type_link($link, $post) {
if ($post->post_type != 'gallery')
    return $link;
if ($cats = get_the_terms($post->ID, 'gallery_cat')) {
    $link = str_replace('%gallery_cat%', rtrim(get_taxonomy_parents(array_pop($cats)->term_id, 'gallery_cat', false, '/', true),"/"), $link); // see custom function defined below
}
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);


// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {    
$chain = '';   
$parent = &get_term($id, $taxonomy);

if (is_wp_error($parent)) {
    return $parent;
}

if ($nicename)    
    $name = $parent -> slug;        
else    
    $name = $parent -> name;

if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
    $visited[] = $parent -> parent;    
    $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);
}
if ($link) {
    // nothing, can't get this working :(
} else    
    $chain .= $name . $separator;
return $chain;    
}


//Rewrite rules
add_filter('rewrite_rules_array', 'gallery_rewrite_rules');
function gallery_rewrite_rules($rules) {
$newRules  = array();

$newRules['gallery/(.+)/(.+)/(.+)/?$'] = 'index.php?gallery=$matches[3]';   
$newRules['gallery/(.+)/(.+)/?$'] = 'index.php?gallery_cat=$matches[2]'; 
$newRules['gallery/(.+)/?$']      = 'index.php?gallery_cat=$matches[1]';

return array_merge($newRules, $rules);
}

Nun, ich denke, das Problem ist, wo ich die folgende Zeile zum Array mit den Umschreiberegeln hinzufügen muss:

$newRules['gallery/(.+)/(.+)/?$'] = 'index.php?gallery=$matches[2]';

weil meine benutzerdefinierte Struktur nicht immer den Post-Namen als 3. URI-Segment hat, weil, wenn die CPT nur einer übergeordneten Taxonomie unterliegt, sie sich im 2. URI-Segment befindet.

Aber wenn ich das hinzufüge, bricht es die Dinge. Ich vermute, dass es mit dieser Zeile kollidiert ...

$newRules['gallery/(.+)/(.+)/?$'] = 'index.php?gallery_cat=$matches[2]';

Jeff, der mir geholfen hat, es so weit weg von diesem Thread zu schaffen, sagte Folgendes ...

Wenn Sie unterschiedliche Ebenen von verschachtelten Begriffen haben, müssen Sie eine Funktion schreiben, um zu überprüfen, ob das letzte URI-Segment ein benutzerdefinierter Beitragstyp oder ein Taxonomiebegriff ist, um zu wissen, welche Regel hinzugefügt werden muss

Weiß jemand, wie dies erreicht werden kann?

Vielen Dank

1
serks

Lesen Sie die Seite Abfrageüberblick-Codex , insbesondere den AbschnittWelche Plugins können geändert werden?:

Ändern Sie die Abfragespezifikation, nachdem Variablenwerte gespeichert wurden (request-Filter oder parse_request-Aktion; wenn Sie Tests mit bedingtem Tag verwenden möchten, verwenden Sie die Aktion parse_query oder pre_get_posts, da diese ausgeführt werden, nachdem die is_-Variablen festgelegt wurden).

In diesem Fall möchten wir request filtern. Hierbei handelt es sich um ein Array der Abfragevariablen, die mit der Methode parse_request DER KLASSE WP festgelegt wurden. (Scrollen Sie zum Ende dieser Funktion, um festzustellen, wo der Filter angewendet wird.) .

In unserem Filter prüfen wir, ob gallery_cat gesetzt ist und ob der angeforderte Begriff tatsächlich ein vorhandener gallery_cat-Begriff ist. Wenn dies nicht der Fall ist, gehen wir davon aus, dass es sich um einen gallery-Beitrag handelt, und setzen die Abfragevariablen zurück, damit WordPress anstelle des Begriffs nach dem Beitrag fragt. Dazu müssen 3 verschiedene Abfragevarianten festgelegt werden: gallery, name und post_type.

function wpd_gallery_request_filter( $request ){
    if( array_key_exists( 'gallery_cat' , $request )
        && ! get_term_by( 'slug', $request['gallery_cat'], 'gallery_cat' ) ){
            $request['gallery'] = $request['gallery_cat'];
            $request['name'] = $request['gallery_cat'];
            $request['post_type'] = 'gallery';
            unset( $request['gallery_cat'] );
    }
    return $request;
}
add_filter( 'request', 'wpd_gallery_request_filter' );
4
Milo