Hinzufügen von Kategorien zu benutzerdefinierten Beitragstypen in Permalink

22

Ich weiß, die Leute haben das schon einmal gefragt und sind so weit gegangen, den benutzerdefinierten Post-Typ hinzuzufügen und für den Permalink umzuschreiben.

Das Problem ist, dass ich 340 vorhandene Kategorien habe, die ich weiterhin verwenden möchte. Früher konnte ich / category / subcategory / postname sehen

Jetzt habe ich den Slug von customposttype / postname. Das Auswählen der Kategorie wird nicht mehr im Permalink angezeigt ... Ich habe die Permalink-Einstellung in admin nicht in etwas anderes geändert.

Gibt es etwas, das mir fehlt oder das ich diesem Code hinzufügen muss?

function jcj_club_post_types() {
    register_post_type( 'jcj_club', array(
        'labels' => array(
            'name' => __( 'Jazz Clubs' ),
            'singular_name' => __( 'Jazz Club' ),
            'add_new' => __( 'Add New' ),
            'add_new_item' => __( 'Add New Jazz Club' ),
            'edit' => __( 'Edit' ),
            'edit_item' => __( 'Edit Jazz Clubs' ),
            'new_item' => __( 'New Jazz Club' ),
            'view' => __( 'View Jazz Club' ),
            'view_item' => __( 'View Jazz Club' ),
            'search_items' => __( 'Search Jazz Clubs' ),
            'not_found' => __( 'No jazz clubs found' ),
            'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
            'parent' => __( 'Parent Jazz Club' ),
        ),
        'public' => true,
        'show_ui' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'menu_position' => 5,
        'query_var' => true,
        'supports' => array( 
            'title',
            'editor',
            'comments',
            'revisions',
            'trackbacks',
            'author',
            'excerpt',
            'thumbnail',
            'custom-fields',
        ),
        'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
        'taxonomies' => array( 'category','post_tag'),
        'can_export' => true,
    )
);
hash
quelle
2
Dies mag eine dumme Frage sein, aber haben Sie Ihre Umschreibungen gespült?
Kristina Childs
Vor kurzem stehe ich vor diesem Problem. Gelöst! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare

Antworten:

16

Es gibt zwei Angriffspunkte, die beim Hinzufügen benutzerdefinierter Umschreiberegeln für Beitragstypen abgedeckt werden müssen:

Regeln umschreiben

Dies geschieht, wenn die Umschreiberegeln in wp-includes/rewrite.phpin generiert werden WP_Rewrite::rewrite_rules(). Mit WordPress können Sie die Umschreiberegeln für bestimmte Elemente wie Beiträge, Seiten und verschiedene Arten von Archiven filtern. Wo Sie posttype_rewrite_rulesdas posttypeTeil sehen, sollte der Name Ihres benutzerdefinierten Beitragstyps sein. Alternativ können Sie den post_rewrite_rulesFilter verwenden, solange Sie nicht auch die Standard-Post-Regeln außer Kraft setzen.

Als nächstes benötigen wir die Funktion, um die Umschreiberegeln zu generieren:

// add our new permastruct to the rewrite rules
add_filter( 'posttype_rewrite_rules', 'add_permastruct' );

function add_permastruct( $rules ) {
    global $wp_rewrite;

    // set your desired permalink structure here
    $struct = '/%category%/%year%/%monthnum%/%postname%/';

    // use the WP rewrite rule generating function
    $rules = $wp_rewrite->generate_rewrite_rules(
        $struct,       // the permalink structure
        EP_PERMALINK,  // Endpoint mask: adds rewrite rules for single post endpoints like comments pages etc...
        false,         // Paged: add rewrite rules for paging eg. for archives (not needed here)
        true,          // Feed: add rewrite rules for feed endpoints
        true,          // For comments: whether the feed rules should be for post comments - on a singular page adds endpoints for comments feed
        false,         // Walk directories: whether to generate rules for each segment of the permastruct delimited by '/'. Always set to false otherwise custom rewrite rules will be too greedy, they appear at the top of the rules
        true           // Add custom endpoints
    );

    return $rules;
}

Die wichtigste Sache, auf die Sie achten sollten, wenn Sie herumspielen möchten, ist der Boolesche Wert "Walk directorys". Es generiert Überschreibungsregeln für jedes Segment einer Permastruktur und kann Überschreibungsregelinkongruenzen verursachen. Wenn eine WordPress-URL angefordert wird, wird das Array mit den Umschreiberegeln von oben nach unten überprüft. Sobald ein Match gefunden wird, wird es geladen, was auch immer es gefunden hat, zum Beispiel wenn Ihr Permastruct ein gieriges Match hat, z. for- /%category%/%postname%/und walk-Verzeichnisse geben Umschreibregeln für /%category%/%postname%/UND aus, /%category%/die mit allen übereinstimmen. Wenn das zu früh passiert, bist du fertig.

Permalinks

Dies ist die Funktion, die die Permalinks des Post-Typs analysiert und ein Permastruct (z. B. '/% year% /% monthnum% /% postname% /') in eine tatsächliche URL konvertiert.

Der nächste Teil ist ein einfaches Beispiel für eine Version der get_permalink()Funktion in wp-includes/link-template.php. Es werden benutzerdefinierte Post-Permalinks generiert, von get_post_permalink()denen eine stark verwässerte Version von ist get_permalink(). get_post_permalink()wird durch gefiltert, post_type_linkso dass wir das verwenden, um eine benutzerdefinierte Permastruktur zu erstellen.

// parse the generated links
add_filter( 'post_type_link', 'custom_post_permalink', 10, 4 );

function custom_post_permalink( $permalink, $post, $leavename, $sample ) {

    // only do our stuff if we're using pretty permalinks
    // and if it's our target post type
    if ( $post->post_type == 'posttype' && get_option( 'permalink_structure' ) ) {

        // remember our desired permalink structure here
        // we need to generate the equivalent with real data
        // to match the rewrite rules set up from before

        $struct = '/%category%/%year%/%monthnum%/%postname%/';

        $rewritecodes = array(
            '%category%',
            '%year%',
            '%monthnum%',
            '%postname%'
        );

        // setup data
        $terms = get_the_terms($post->ID, 'category');
        $unixtime = strtotime( $post->post_date );

        // this code is from get_permalink()
        $category = '';
        if ( strpos($permalink, '%category%') !== false ) {
            $cats = get_the_category($post->ID);
            if ( $cats ) {
                usort($cats, '_usort_terms_by_ID'); // order by ID
                $category = $cats[0]->slug;
                if ( $parent = $cats[0]->parent )
                    $category = get_category_parents($parent, false, '/', true) . $category;
            }
            // show default category in permalinks, without
            // having to assign it explicitly
            if ( empty($category) ) {
                $default_category = get_category( get_option( 'default_category' ) );
                $category = is_wp_error( $default_category ) ? '' : $default_category->slug;
            }
        }

        $replacements = array(
            $category,
            date( 'Y', $unixtime ),
            date( 'm', $unixtime ),
            $post->post_name
        );

        // finish off the permalink
        $permalink = home_url( str_replace( $rewritecodes, $replacements, $struct ) );
        $permalink = user_trailingslashit($permalink, 'single');
    }

    return $permalink;
}

Wie bereits erwähnt, handelt es sich um einen sehr vereinfachten Fall zum Generieren eines benutzerdefinierten Regelsatzes und von Permalinks für das Neuschreiben. Er ist nicht besonders flexibel, sollte jedoch ausreichen, um den Einstieg zu erleichtern.

Betrug

Ich habe ein Plugin geschrieben, mit dem Sie Permastrukturen für jeden benutzerdefinierten Beitragstyp definieren können, aber wie Sie es %category%in der Permalink-Struktur für Beiträge verwenden können, die mein Plugin %custom_taxonomy_name%für alle benutzerdefinierten Taxonomien unterstützt, die Sie auch haben, wobei custom_taxonomy_nameder Name Ihrer Taxonomie z. %club%.

Es funktioniert wie erwartet mit hierarchischen / nicht hierarchischen Taxonomien.

http://wordpress.org/extend/plugins/wp-permastructure/

sanchothefat
quelle
1
Das Plugin ist großartig, aber können Sie erklären, wie Sie das Problem in der Frage ohne Ihr Plugin beheben können?
Eugene Manuilov
Ich bin damit einverstanden, dass es ein großartiges Plugin gibt, um es zu beheben (ich habe es mit einem Lesezeichen versehen und es ist das erste, woran ich bei diesem Q gedacht habe), aber die Antwort würde von einer kurzen Zusammenfassung des Problems und der Art und Weise, wie das Plugin es erobert hat, profitieren. :)
Rarst
@EugeneManuilov Okay, es tut mir leid, es ist eine lange Antwort. Das ist, wenn ich es auch auf das Wesentliche reduziere!
sanchothefat
Es sieht so aus, als würde der erste $permalink = home_url(...von überschrieben $permalink = user_trailingslashit(...und nie benutzt. Oder vermisse ich etwas? $post_linkist nicht einmal definiert. War es sein soll $permalink = user_trailingslashit( $permalink, 'single' );?
Ian Dunn
Guter Fang sollte es $permalinknicht sein $post_link. Prost :)
sanchothefat
1

Habe die Lösung!

Um hierarchische Permalinks für benutzerdefinierten Post-Typ zu erhalten, installieren Sie das Plugin für benutzerdefinierte Post-Typ-Permalinks ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Aktualisieren Sie den Typ des registrierten Beitrags. Ich habe den Namen des Beitragstyps als Hilfezentrale

function help_centre_post_type(){
    register_post_type('helpcentre', array( 
        'labels'            =>  array(
            'name'          =>      __('Help Center'),
            'singular_name' =>      __('Help Center'),
            'all_items'     =>      __('View Posts'),
            'add_new'       =>      __('New Post'),
            'add_new_item'  =>      __('New Help Center'),
            'edit_item'     =>      __('Edit Help Center'),
            'view_item'     =>      __('View Help Center'),
            'search_items'  =>      __('Search Help Center'),
            'no_found'      =>      __('No Help Center Post Found'),
            'not_found_in_trash' => __('No Help Center Post in Trash')
                                ),
        'public'            =>  true,
        'publicly_queryable'=>  true,
        'show_ui'           =>  true, 
        'query_var'         =>  true,
        'show_in_nav_menus' =>  false,
        'capability_type'   =>  'page',
        'hierarchical'      =>  true,
        'rewrite'=> [
            'slug' => 'help-center',
            "with_front" => false
        ],
        "cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
        'menu_position'     =>  21,
        'supports'          =>  array('title','editor', 'thumbnail'),
        'has_archive'       =>  true
    ));
    flush_rewrite_rules();
}
add_action('init', 'help_centre_post_type');

Und hier ist Taxonomie registriert

function themes_taxonomy() {  
    register_taxonomy(  
        'help_centre_category',  
        'helpcentre',        
        array(
            'label' => __( 'Categories' ),
            'rewrite'=> [
                'slug' => 'help-center',
                "with_front" => false
            ],
            "cptp_permalink_structure" => "/%help_centre_category%/",
            'hierarchical'               => true,
            'public'                     => true,
            'show_ui'                    => true,
            'show_admin_column'          => true,
            'show_in_nav_menus'          => true,
            'query_var' => true
        ) 
    );  
}  
add_action( 'init', 'themes_taxonomy');

Diese Zeile bewirkt, dass Ihr Permalink funktioniert

"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",

Sie können entfernen %post_id%und behalten/%help_centre_category%/%postname%/"

Vergessen Sie nicht, die Permalinks aus dem Dashboard zu entfernen.

Varsha Dhadge
quelle
+1 Die einfachste Lösung ist, einfach dieses Plugin zu verwenden: wordpress.org/plugins/custom-post-type-permalinks funktioniert perfekt
Jules
Ja, aber das ist die Lösung, wenn Sie einen einzelnen benutzerdefinierten Beitragstyp haben, aber wenn Sie mehrere benutzerdefinierte Beitragstypen in einem einzigen Thema haben. Darüber hinaus ändert es auch Ihre Kategorie-Slug genauso wie Ihre Post-Typ-Slug.
Varsha Dhadge
1

Ich habe eine LÖSUNG gefunden !!!

(Nach endlosen Recherchen ... kann ich CUSTOM POST TYPE Permalinks haben wie:
example.com/category/sub_category/my-post-name

hier der code (in functions.php oder plugin):

//===STEP 1 (affect only these CUSTOM POST TYPES)
$GLOBALS['my_post_typesss__MLSS'] = array('my_product1','....');

//===STEP 2  (create desired PERMALINKS)
add_filter('post_type_link', 'my_func88888', 6, 4 );

function my_func88888( $post_link, $post, $sdsd){
    if (!empty($post->post_type) && in_array($post->post_type, $GLOBALS['my_post_typesss']) ) {  
        $SLUGG = $post->post_name;
        $post_cats = get_the_category($id);     
        if (!empty($post_cats[0])){ $target_CAT= $post_cats[0];
            while(!empty($target_CAT->slug)){
                $SLUGG =  $target_CAT->slug .'/'.$SLUGG; 
                if  (!empty($target_CAT->parent)) {$target_CAT = get_term( $target_CAT->parent, 'category');}   else {break;}
            }
            $post_link= get_option('home').'/'. urldecode($SLUGG);
        }
    }
    return  $post_link;
}

// STEP 3  (by default, while accessing:  "EXAMPLE.COM/category/postname"
// WP thinks, that a standard post is requested. So, we are adding CUSTOM POST
// TYPE into that query.
add_action('pre_get_posts', 'my_func4444',  12); 

function my_func4444($q){     
    if ($q->is_main_query() && !is_admin() && $q->is_single){
        $q->set( 'post_type',  array_merge(array('post'), $GLOBALS['my_post_typesss'] )   );
    }
    return $q;
}
T.Todua
quelle
-2

Sie haben mehrere Fehler mit Ihrem Code. Ich habe Ihren vorhandenen Code aufgeräumt:

<?php
function jcj_club_post_types() {
  $labels = array(
    'name' => __( 'Jazz Clubs' ),
    'singular_name' => __( 'Jazz Club' ),
    'add_new' => __( 'Add New' ),
    'add_new_item' => __( 'Add New Jazz Club' ),
    'edit' => __( 'Edit' ),
    'edit_item' => __( 'Edit Jazz Clubs' ),
    'new_item' => __( 'New Jazz Club' ),
    'view' => __( 'View Jazz Club' ),
    'view_item' => __( 'View Jazz Club' ),
    'search_items' => __( 'Search Jazz Clubs' ),
    'not_found' => __( 'No jazz clubs found' ),
    'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
    'parent' => __( 'Parent Jazz Club' ),
    );
  $args = array(
    'public' => true,
    'show_ui' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'menu_position' => 5,
    'query_var' => true,
    'supports' => array( 'title','editor','comments','revisions','trackbacks','author','excerpt','thumbnail','custom-fields' ),
    'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
    'has_archive' => true
    );
  register_post_type( 'jcj_club', $args );
  }
add_action( 'init','jcj_club_post_types' );
?>

Ersetzen Sie Ihren Code durch den obigen Code und prüfen Sie, ob er funktioniert. Antworte mir, wenn du weitere Fragen hast und ich versuche zu helfen.

BEARBEITEN:

Mir ist aufgefallen, dass ich ausgelassen habe 'has_archive' => true.

Jeremy Jared
quelle