Mevcut bir yazı tipini değiştirmek için register_post_type () kullanın.


29

Bir temanın veya eklentinin yazı türünü kaydettiği ve değiştirmek istediğiniz birçok durum vardır. Orada elbette add_post_type_support()ve remove_post_type_support()ancak bu argümanlar tam listesine erişim vermeyin register_post_type()sürer. Özellikle, belki yazı tipi arşivini devre dışı bırakmak, yönetici kullanıcı arayüzünü gizlemek, aramadan gizlemek vb.

Kodeks sayfaregister_post_type() karşımda Dangles bu:

Açıklama

Bir gönderi türü oluşturun veya değiştirin.

Ama geçmişte, bunu yapmaya çalıştığımda, işe yaramadı. Bu işlev gerçekten yazı tiplerini değiştirmek için midir? Öyleyse, birkaç argümanı yeniden yazıp gerisini yalnız bırakabilir misiniz?

Bir deregister_post_type()fonksiyon bile olmadığını görünce nasıl yapılacağını anlamıyorum.

Yanıtlar:


18

Bu işlev gerçekten yazı tiplerini değiştirmek için mi?

Evet.

ve eğer öyleyse, birkaç argümanı yeniden ilan edip gerisini yalnız bırakabilir misiniz?

Hayır. Değişkenleri bir yazı türüne değiştirmek istiyorsanız get_post_type_object, yazı tipi nesnesini almak için kullanmanız , içinde istediğinizi değiştirin, sonra değiştirilmiş türünüzü new $ args parametresi olarak kullanarak yeniden kaydedin.


Değiştirilmiş argümanlarla aynı ardışık iki çağrı yapmak register_post_typedoğru olur mu? "Evet" inizle aynı fikirdeyim ve bu herhangi bir hataya neden olmuyor ve istenen etkiye sahip. Asıl durum bu cevapta
sunduğum

Evet, işe yarıyor, ancak sanki bunu yapmak zorundaysanız, aynı yazı tipini tekrar tekrar kaydetmek zorunda kalmamak için bazı filtreler veya başka bir şey eklemeniz gerekiyor. Temel olarak, argümanları önce sıralayın, ardından kaydedin.
Otto

Ben sadece eklenti hemen önce sağlanan kanca nedeniyle düşündüm register_post_type. Gerçekte, gerek yok. Bu bir "kayıtlar için" sorusuydu, geri bildiriminiz için teşekkürler.
brasofilo

34

Bazı araştırmalardan sonra bu cevapların hiçbirinin güncel olmadığını gördüm.

8 Aralık 2015'ten itibaren WordPress, register_post_type_argskayıtlı bir yazı tipinin argümanlarına bağlanmanızı sağlayan yeni bir filtre içerir .

function wp1482371_custom_post_type_args( $args, $post_type ) {
    if ( $post_type == "animal-species" ) {
        $args['rewrite'] = array(
            'slug' => 'animal'
        );
    }

    return $args;
}
add_filter( 'register_post_type_args', 'wp1482371_custom_post_type_args', 20, 2 );

6
Bunu şimdi yapmanın doğru yolu bu.
Dave Romsey

6
Bu kabul edilen cevap gerekir
klewis

Çalışma zamanında kaydedildikten sonra güncellemeniz gerekirse ne olur? Örn: sonrainit
Lucas Bustamante

@LucasBustamante Önemli değil. Eklenti / tema sırasında bir eylemde değil, 'add_filter' satırını çağırmanız yeterlidir. Filtre her register_post_typefonksiyon sırasında çağrılır . Kodumun çalışmadığı tek senaryo, posta türü doğru şekilde kaydedilmemişse. Tüm direk tipleri init kanca sırasında kaydedilmelidir. Kodeksten: "register_post_type 'init' den önce çağrılırsa çalışmaz ve yeni oluşturulan veya değiştirilen yazı türünün özellikleri daha sonra çağrılırsa yanlış çalışır." Hala yardıma ihtiyacınız varsa, yeni bir soruya daha fazla ayrıntı göndermenizi öneririm.
Radley Sustaire

8

'registered_post_type'Filtrenin başka bir eklentideki yazı tipini değiştirmek için nasıl kullanılacağına bir örnek .

Kullandığım bir eklenti, tanımında bir menu_icon içermiyordu, bu yüzden kendimden bir tane eklemek istedim.

<?php
/**
 * Add a menu icon to the WP-VeriteCo Timeline CPT
 *
 * The timeline plugin doesn't have a menu icon, so we hook into 'registered_post_type'
 * and add our own.
 *
 * @param  string $post_type the name of the post type
 * @param  object $args the post type args
 */
function wpse_65075_modify_timeline_menu_icon( $post_type, $args ) {
    // Make sure we're only editing the post type we want
    if ( 'timeline' != $post_type )
        return;

    // Set menu icon
    $args->menu_icon = get_stylesheet_directory_uri() . '/img/admin/menu-timeline.png';

    // Modify post type object
    global $wp_post_types;
    $wp_post_types[$post_type] = $args;
}
add_action( 'registered_post_type', 'wpse_65075_modify_timeline_menu_icon', 10, 2 );

Bu, çoğu durumda yapmak için daha temiz bir yoldur; bununla birlikte, bu filtrenin yeniden yazılanlar tarafından alınamayacak kadar geç olduğu, bu nedenle kabul edilen cevabın bu durumlarda kullanılması gerektiği unutulmamalıdır.
mrwweb

4

'registered_post_type'Diğer kod kaydedildikten sonra bağlanın . Bunun sonunda denir register_post_type(). İki argüman alırsınız: $post_typeve $args.
Şimdi bu gönderi türü için her şeyi değiştirebilirsiniz. Kontrol $GLOBALS['wp_post_types']bazı seçenekleri için.


Beni o kancaya yönlendirdiğin için teşekkürler. Bu, bir gönderi türünü nasıl değiştireceğiniz hakkındaki (daha önemli) soruyu yanıtlar , ancak bunun açıklaması register_post_type()"değiştir" i de içerir. Bu sadece yanlış mı? İnternet atamı atlayıp bu anı Codex'ten yok etmeli miyim?
mrwweb

2
$wp_post_types[$post_type] = $args;… Özellikleri değiştirebilmenizi önerir. Arızalı kodun bir örneğini sorunuza ekleyin.
fuxia

0

Aynı şey The Events Calendar eklentisi ile de karşılaştım.

Tribe_organizer yazı tipini değiştirmek için aşağıdaki kodu function.php dosyasına ekledim.

function tribe_modify_organizer() {
 //New arguments
    $tribe_organizer_args = get_post_type_object('tribe_organizer'); // get the post type to modify
    $tribe_organizer_args-> taxonomies = array('post_tag' , 'tribe_events_cat'); // add taxonomies support
    $tribe_organizer_args-> exclude_from_search = false; // show in search result
 //re-register the same post type includeing the new args
    register_post_type( 'tribe_organizer', $tribe_organizer_args );
}
add_action( 'init', 'tribe_modify_organizer', 100 );

0

Bunun çirkin olup olmadığını bilmiyorum, ama ne GLOBALzaman tek bir argüman düzenlemeye ihtiyaç duyuyorsanız "anında" yer tutucuyu değiştirebilirsiniz . Bu, contentsyönetici menüsünde kabul edilebilir olmak için herkese açık olmayan bir yazı türünü kullanmamızdır. Menü hazırlandıktan sonra kapanıp kapanıyoruz:

function entex_theme_make_contents_public(){
    $GLOBALS['wp_post_types']['contents']->public = true;
}
add_action('admin_menu', 'entex_theme_make_contents_public', 10);

function entex_theme_make_contents_private_again(){
    $GLOBALS['wp_post_types']['contents']->public = '';
}
add_action('admin_menu', 'entex_theme_make_contents_private_again', 12);

Bizim durumumuzda, biz Yönetici Menüsü Yayın Listesi dedikleri gibi bizim sonrası türünü kabul etmek eklentisi istediğiniz return get_post_types(array('public' => true));önceliği 11 ile kanca iç ...

Geliştiriciler -Bu herhangi bir konuyu gündeme getirebilirse, lütfen yorum yapın.

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.