Bir Eklentinin Özel Gönderi Tipini Yeniden İşaretle / Değiştir


28

Bir eklentinin mevcut özel yazı tipinin sümüklüböceklerini yeniden tanımlamak / değiştirmek mümkün mü (sadece eklentiyi düzenlemeden)?

Diğer bir deyişle, Eklenti X, slug / uncookedtoast / ile özel bir yazı tipi yaratırsa, sümük / ekmek / 'ye değiştiren işlevler.php (veya benzeri bir şeye) filtre eklemek mümkündür.


Ben de aynı sorunu, 20 önceliğine init yaparak ve sonra aynı yazı tipi için yeniden register_post_type'yi arayarak çözdüm. Bunun yolun aşağısında herhangi bir sıkıntıya neden olup olmayacağını bilen var mı?
Dustin

Yanıtlar:


24

Evet, bu mümkündür, ancak eklenti rewrite => array('slug' => 'post_type')parametresini kullanarak özel bir gönderi türü oluşturuyorsa , fişi değiştirebilecek olmanız mümkün değildir .

Özel gönderi türleri oluşturulduğunda, URL yeniden yazma kuralları veritabanına yazılır. Hangi eylemin özel yazı türünün oluşturulmasını tetiklediğine bağlı olarak (örneğin init eylemi gibi), WordPress hangi değişiklikleri yapmaya çalıştığınıza bakılmaksızın yeniden yazma kurallarını siler ve özel yazı türünün sümüklerini geri yükler.

Bu, özel yazı tipleri için özel sümüklü böcek sağlayabilir. Aşağıdaki örnek, özel bir gönderi türünüz olduğunu moviesve /movies/bilgiyi değiştirmeye çalıştığınızı varsayar /films/.

Tamamlanmak üzere, işte moviesözel yazı türünü tanımlamak için kullanılan temel işlev . Başvurduğunuz eklenti şöyle bir şey yapıyor olmalı:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

Mevcut gönderi türüne göre kendi özel kurallarınızı belirleyerek seçenekler tablosunu değiştirebilirsiniz.

Temel olarak, bunu yapacağız:

  • Mevcut kurallara uyun ve sonra kendi sümüklü böceklerimizle kendimiz yazın
  • Yeni kurala, özel gönderi türünün öbeğinden daha yüksek bir öncelik verin

İşte bunu nasıl yapabilirsiniz:

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

Şimdi, filmlerinize erişmek için iki yönteminiz olacak:

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

Çok sık ateşleyeceği add_custom_rewrite_ruleiçin initeyleme takılmayı tavsiye etmediğimi unutmayın . Bu sadece bir örnek. İşlevi uygulamak için daha iyi bir yer tema etkinleştirme, eklenti etkinleştirme, belki de save_post eylemi, vb. Olabilir. Ne yapmanız gerektiğine bağlı olarak, yalnızca bir veya birkaç kez ateşlemeniz gerekebilir.

Bu noktada, /movies/sümüklü böcek kullanmak için özel yazı tipi için kalıcı bağlantıların güncellenmesini düşünebilirsiniz . Örneğin, /films/gezinirseniz, tüm filmlerin bir listesini görürsünüz, ancak başlığın üzerine /movies/gelindiğinde, sümüklü böcek hala kullanılmakta olduğunu ortaya çıkarır .

Bir adım daha ileri gitmek /movies/için, /films/meslektaşlarına yönlendirme yapmak üzere tüm bağlantıları yakalamak için teknik olarak 301 yönlendirmesini yerleştirebilirsiniz , ancak bu, ne yapmaya çalıştığınıza bağlıdır.


Güzel çalıştı! Kalıcı bağlantıların güncellenmesi için beni doğru yöne işaret edebilir misiniz?
Edbury

1
Temanıza bağlı olarak, bunu şablon düzeyinde yapabilirsiniz. 'The_title ()' çağrısını gördüğünüzde, bunu $ title = get_the_title () ile değiştirebilir, daha sonra '/ films /' ile $ başlığındaki '/ movies /' dizesini değiştirebilirsiniz.
Tom

Peki değiştirmek istediğiniz sümüklü böcek, geçerli gönderinin meta değeri tarafından dinamik olarak yaratılmışsa? Ben kullanabilmek için gereken $postde add_custom_rewrite_rule()işlevi ancak 'sivil nesnenin özelliğini almaya çalışırken' diyerek WP Yönetici hataları atıyor. Meta değeri almak için $ post nasıl alabilirim?
Lee

6

Bu kod çocuğumun teması için iyi çalıştı. "Program" slug "place" olarak değiştirilmesi gerekiyordu.

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );

Mükemmel çalışıyor, ben de göreceli kuralı ekleyen etiketler için kullandım, ayarlar sayfasından bir kayıt yürüterek permalinkleri güncellemek gerekiyor> permalink. Teşekkür ederim!
Lorenzo Magon

Diğerleri de değiştirmek için mükemmel çalışıyor, ayarlamam gerekiyordu $args['has_archive'] = falseve bu işe yaradı.
Mere Geliştirme
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.