Permalink'teki özel yazı tipine kategori ekleme


22

İnsanların bunu daha önce sorduğunu ve özel yazı tipi eklemeye kadar gittiğini ve kalıcı bağlantı için yeniden yazdıklarını biliyorum.

Sorun şu ki, kullanmaya devam etmek istediğim 340 mevcut kategorim var. / Category / subcategory / postname 'i görebildim

Şimdi ben customposttype / postname bir parçası var. Kategori seçmek artık kalıcı bağlantıda görünmüyor ... Yönetici içindeki kalıcı bağlantı ayarını farklı bir şeye değiştirmedim.

Kaybettiğim veya bu koda eklemem gereken bir şey var mı?

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

2
bu aptalca bir soru olabilir, ancak yeniden yazdıklarınızı temizlediniz mi?
kristina

Son zamanlarda bu sorunla karşılaştım. Çözüldü! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare

Yanıtlar:


16

Özel yazı tipi yeniden yazma kuralları eklediğinizde ele alınacak 2 saldırı noktası vardır:

Kuralları yeniden yaz

Yeniden yazma kuralları içinde üretiliyor ortaya çıkar wp-includes/rewrite.phpiçinde WP_Rewrite::rewrite_rules(). WordPress, yazılar, sayfalar ve çeşitli arşiv türleri gibi belirli öğeler için yeniden yazma kurallarını filtrelemenize izin verir. Gördüğünüz nerede parçası özel mesaj türünün adı olmalıdır. Alternatif olarak , filtreyi standart posta kurallarını da yok etmediğiniz sürece kullanabilirsiniz .posttype_rewrite_rulesposttypepost_rewrite_rules

Daha sonra, yeniden yazma kurallarını gerçekten oluşturma fonksiyonuna ihtiyacımız var:

// 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;
}

Oynamaya karar verirseniz, burada dikkat etmeniz gereken en önemli şey 'Walk dizinleri' olmaktır. Bir permastruct'ın her bölümü için yeniden yazma kuralları oluşturur ve yeniden yazma kuralı uyumsuzluklarına neden olabilir. Bir WordPress URL'si istendiğinde, yeniden yazma kuralları dizisi üstten alta kontrol edilir. Bir eşleşme bulunur bulunmaz karşılaştığı her şeyi yükler, örneğin permastructınızın açgözlü bir eşleşmesi varsa, örneğin; için /%category%/%postname%/dizinleri ve yürüyüş her ikisi için çıkış yeniden yazma kuralları olacaktır üzerinde olduğu /%category%/%postname%/VE /%category%/hangi bir şey eşleşir. Bu çok erken olursa, sen berbat olursun.

Kalıcı

Bu, post tipini kalıcı olarak ayrıştırıp permastruct'ı (örneğin, '/% year% /% monthnum% /% postname% /') gerçek bir URL’ye dönüştüren işlevdir.

Bir sonraki kısım idealde bulunan get_permalink()fonksiyonun bir versiyonunun ne olacağına dair basit bir örnektir wp-includes/link-template.php. Özel post permalink'ler get_post_permalink()çok sulanan bir versiyonu ile üretilir get_permalink(). get_post_permalink()filtrelendiğinden post_type_linkbunu özel bir permastructure yapmak için kullanıyoruz.

// 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;
}

Bu belirtildiği gibi, özel bir yeniden yazma kural kümesi ve kalıcı bağlantılar oluşturmak için çok basitleştirilmiş bir durumdur ve özellikle esnek değildir, ancak başlamanız için yeterli olmalıdır.

Hile

Herhangi bir özel gönderi türü için permastruct tanımlamanıza izin veren bir eklenti yazdım, ancak %category%eklentilerim için permalink yapısında kullanabileceğiniz gibi, eklentim benim %custom_taxonomy_name%taksonominizin custom_taxonomy_nameadının olduğu özel taksonomiler için desteklediğiniz herhangi bir özel taksonomide kullanılabiliyor . %club%.

Hiyerarşik / hiyerarşik olmayan taksonomilerle beklediğiniz gibi çalışacaktır.

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


1
Eklenti harika, ancak söz konusu sorunun eklentiniz olmadan nasıl çözüleceğini açıklayabilir misiniz?
Eugene Manuilov

Buna hitap etmek için bir eklenti bulunmasının harika olduğu konusunda hemfikirim (yer imini işaretledim ve ilk önce bu soru için aklıma geldi), ancak cevap sorunun ne olduğuna ve eklentinin nasıl ele alındığına dair kısa bir özetden fayda görecektir. :)
Rarst

@EugeneManuilov Tamam, üzgünüm bu uzun bir cevap. Bu benimle de temelleri bulmaktır!
sanchothefat

İlki $permalink = home_url(...geçersiz kılınmış $permalink = user_trailingslashit(...ve hiç kullanılmamış gibi görünüyor . Yoksa bir şey mi kaçırıyorum? $post_linktanımlanmadı bile. Olması $permalink = user_trailingslashit( $permalink, 'single' );mı gerekiyordu ?
Ian Dunn

Yakalamak İyi, olması gerektiği $permalinkdeğil $post_link. Şerefe :)
sanchothefat

1

Çözümü aldım!

Özel gönderi türü için hiyerarşik bağlantılara sahip olmak için Özel Posta Türü Permalinkleri ( https://wordpress.org/plugins/custom-post-type-permalinks/ ) eklentisini yükleyin .

Kayıtlı yayın türünü güncelleyin. Yazı tipi adı yardım merkezi olarak var

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

Ve burada kayıtlı taksonomi

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

Bu çizgi, kalıcı bağlantınızın çalışmasını sağlar

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

kaldırabilir %post_id%ve tutabilirsiniz/%help_centre_category%/%postname%/"

Permalinkleri gösterge panelinden yıkamayı unutma.


+1 en basit çözüm bu eklentiyi kullanmaktır: wordpress.org/plugins/custom-post-type-permalinks mükemmel çalışıyor
Jules

Evet, ancak bunun için tek bir özel yazı türünüz varsa, ancak tek temada birden fazla özel yazı türünüz varsa, çözüm yukarıdadır. Üstelik kategori sümüklü böceklerinizi, yazı tipi sümüklü böceklerinizle aynı şekilde değiştirir.
Varsha Dhadge

1

Bir ÇÖZÜM buldum !!!

(Sonsuz bir araştırmadan sonra ... Gibi ÖZEL POST TİPİ :
example.com/category/sub_category/my-post-name

burada kod (Fonksiyonlar.php veya eklenti):

//===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;
}

-2

Kodunuzla ilgili birkaç hata var. Mevcut kodunuzu temizledim:

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

Kodunuzu yukarıdaki kodla değiştirin ve çalışıp çalışmadığını kontrol edin. Başka sorularınız varsa cevap verin, ben de yardım etmeye çalışacağım.

DÜZENLE:

Ayrıldığımı fark ettim 'has_archive' => true.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.