it-swarm.com.de

Hinzufügen von Kategorien zu benutzerdefinierten Beitragstypen in Permalink

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 die Schnecke 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,
    )
);
22
hash

Es gibt zwei Angriffspunkte, die behandelt werden müssen, wenn Sie benutzerdefinierte Umschreiberegeln für Beitragstypen hinzufügen:

Regeln umschreiben

Dies geschieht, wenn die Umschreiberegeln in wp-includes/rewrite.php in WP_Rewrite::rewrite_rules() generiert werden. 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_rules sehen, sollte der Teil posttype der Name Ihres benutzerdefinierten Beitragstyps sein. Alternativ können Sie den post_rewrite_rules-Filter 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, z. B. wenn Ihr Permastrukt ein gieriges Match hat, z. Für /%category%/%postname%/ und Walk-Verzeichnisse werden Überschreibungsregeln für /%category%/%postname%/ UND /%category%/ ausgegeben, 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 eine Permastruktur (z. B. '/% year% /% monthnum% /% postname% /') in eine tatsächliche URL konvertiert.

Der nächste Teil ist ein einfaches Beispiel für eine Version der Funktion get_permalink() in wp-includes/link-template.php. Benutzerdefinierte Post-Permalinks werden von get_post_permalink() generiert, einer stark verwässerten Version von get_permalink(). get_post_permalink() wird nach post_type_link gefiltert, sodass wir damit eine benutzerdefinierte Permastruktur 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 hierbei 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 Ihnen 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 %category% in der Permalink-Struktur für Beiträge verwenden können, unterstützt mein Plugin %custom_taxonomy_name% für alle benutzerdefinierten Taxonomien, die Sie auch haben, wobei custom_taxonomy_name der Name Ihrer Taxonomie ist, z. %club%.

Es funktioniert wie erwartet mit hierarchischen/nicht hierarchischen Taxonomien.

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

16
sanchothefat

Ich habe eine LÖSUNG gefunden !!!

(Nach endloser Recherche 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;
}
1
T.Todua

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 Hilfezentrum

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');

Mit dieser Zeile funktioniert Ihr Permalink

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

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

Vergiss nicht, die Permalinks aus dem Dashboard zu entfernen.

1
Varsha Dhadge