Folosește register_post_type() pentru a modifica un tip de postare existent

13 sept. 2012, 19:12:15
Vizualizări: 32.8K
Voturi: 39

Există multe situații în care o temă sau un plugin înregistrează un tip de postare și dorești să îl modifici. Există, desigur, add_post_type_support() și remove_post_type_support(), dar acestea nu oferă acces la lista completă de argumente pe care le acceptă register_post_type(). În special, poate doresc să dezactivez arhiva unui tip de postare, să ascund interfața de administrare, să ascund din căutare etc., păstrând în același timp restul setărilor tipului de postare.

Pagina Codex pentru register_post_type() ne prezintă următoarele:

Descriere

Creează sau modifică un tip de postare.

Dar în trecut, când am încercat să fac acest lucru, nu părea să funcționeze. Este această funcție într-adevăr pentru modificarea tipurilor de postare și, dacă da, poți pur și simplu să redeclari câteva argumente și să le lași pe celelalte neschimbate?

Văzând că nici măcar nu există o funcție deregister_post_type(), nu înțeleg cum poate fi făcut acest lucru.

0
Toate răspunsurile la întrebare 6
7
57

După o cercetare am descoperit că niciunul dintre aceste răspunsuri nu este actualizat.

Începând cu 8 decembrie 2015, WordPress include un nou filtru, register_post_type_args, care vă permite să interveniți în argumentele unui tip de postare înregistrat.

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 );
21 iun. 2016 01:32:19
Comentarii

Aceasta este acum modalitatea corectă de a face acest lucru.

Dave Romsey Dave Romsey
16 sept. 2016 02:47:46

Acesta ar trebui să fie răspunsul acceptat

klewis klewis
18 nov. 2016 16:20:00

Ce se întâmplă dacă trebuie să îl actualizezi după ce a fost înregistrat în timpul execuției? De exemplu: după init

Lucas Bustamante Lucas Bustamante
27 iun. 2019 22:40:46

@LucasBustamante Nu contează. Doar apelează linia 'add_filter' în cadrul plugin-ului/temei tale, nu într-o acțiune. Filtrul va fi apelat la fiecare apelare a funcției register_post_type. Singurul scenariu în care codul meu nu va funcționa este dacă tipul de postare nu este înregistrat corect. Toate tipurile de postare ar trebui să fie înregistrate în timpul hook-ului init. Din codex: "register_post_type nu va funcționa dacă este apelat înainte de 'init', iar aspectele noului tip de postare creat sau modificate vor funcționa incorect dacă sunt apelate mai târziu." Dacă mai ai nevoie de ajutor, sugerez să postezi mai multe detalii într-o întrebare nouă.

Radley Sustaire Radley Sustaire
28 iun. 2019 05:57:14

deci, acest cod va schimba 'slug-of-post', ca în 'sitename/proiecte/slug-of-post' ??

Krys Krys
16 oct. 2020 09:24:02

@Krys Nu sunt sigur ce vrei să spui, dar pentru clarificare: Dacă ai "example.org/specii-animale/slug-of-post", îți permite să schimbi "specii-animale" în simplul "animal", astfel încât URL-ul va deveni "example.org/animal/slug-of-post" iar pagina de arhivă, dacă este activată, va fi "example.org/animal/". Fără a fi nevoie să schimbi numele tipului de postare.

Radley Sustaire Radley Sustaire
16 oct. 2020 20:51:58

Mulțumesc pentru clarificare

Krys Krys
18 oct. 2020 10:54:44
Arată celelalte 2 comentarii
3
21

Este această funcție într-adevăr pentru modificarea tipurilor de postări

Da.

și dacă da, poți pur și simplu să redeclari câteva argumente și să lași restul neschimbate?

Nu. Dacă dorești să modifici argumentele unui tip de postare, trebuie să folosești get_post_type_object pentru a obține obiectul tipului de postare, să modifici ceea ce dorești în el, apoi să-l înregistrezi din nou folosind tipul tău modificat ca noul parametru $args.

13 sept. 2012 21:59:55
Comentarii

Ar fi corect să faci două apeluri consecutive cu argumente modificate la același register_post_type? Presupun că da prin răspunsul tău "Da.", și nu generează erori și are efectul dorit. Cazul real este a doua opțiune pe care o prezint în acest răspuns: http://wordpress.stackexchange.com/a/74331/12615

brasofilo brasofilo
29 nov. 2012 16:54:30

Da, funcționează, dar pare că dacă trebuie să faci asta, atunci ar trebui să adaugi niște filtre sau altceva pentru a evita să înregistrezi același tip de postare în mod repetat. Practic, rezolvă mai întâi argumentele, apoi înregistrează.

Otto Otto
29 nov. 2012 21:13:08

M-am gândit la asta din cauza hook-ului furnizat chiar înainte de register_post_type al plugin-ului. În realitate, nu este nevoie. A fost o întrebare "pentru referință", mulțumesc pentru feedback.

brasofilo brasofilo
29 nov. 2012 21:22:44
1

Iată un exemplu de utilizare a filtrului 'registered_post_type' pentru a modifica un tip de postare într-un alt plugin.

Un plugin pe care îl foloseam nu includea un menu_icon în definiția sa, așa că am vrut să adaug unul propriu.

<?php
/**
 * Adaugă o pictogramă de meniu la CPT-ul WP-VeriteCo Timeline
 *
 * Plugin-ul de timeline nu are o pictogramă de meniu, așa că folosim hook-ul 'registered_post_type'
 * pentru a adăuga una personalizată.
 *
 * @param  string $post_type numele tipului de postare
 * @param  object $args argumentele tipului de postare
 */
function wpse_65075_modify_timeline_menu_icon( $post_type, $args ) {
    // Asigură-te că modificăm doar tipul de postare dorit
    if ( 'timeline' != $post_type )
        return;

    // Setează pictograma de meniu
    $args->menu_icon = get_stylesheet_directory_uri() . '/img/admin/menu-timeline.png';

    // Modifică obiectul tipului de postare
    global $wp_post_types;
    $wp_post_types[$post_type] = $args;
}
add_action( 'registered_post_type', 'wpse_65075_modify_timeline_menu_icon', 10, 2 );
24 aug. 2013 02:49:20
Comentarii

Aceasta este o metodă mult mai curată în majoritatea cazurilor; totuși, trebuie menționat că acest filtru este prea târziu pentru a fi preluat de rescrieri, așa că în acele situații trebuie utilizat răspunsul acceptat.

mrwweb mrwweb
18 mar. 2015 00:44:16
2

Conectează-te la 'registered_post_type' după ce celălalt cod l-a înregistrat. Acesta este apelat la sfârșitul funcției register_post_type(). Primești doi parametri: $post_type și $args.
Acum poți modifica orice pentru acest tip de post. Inspectează $GLOBALS['wp_post_types'] pentru unele opțiuni.

13 sept. 2012 19:19:08
Comentarii

Mulțumesc că m-ai îndreptat spre acel hook. Asta răspunde la întrebarea (mai importantă) despre cum să modifici un tip de postare, dar cum rămâne cu descrierea din register_post_type() care include "modificare?" E doar greșită? Ar trebui să mă urc pe calul meu internet și să o înlătur din Codex în clipa asta?

mrwweb mrwweb
13 sept. 2012 19:32:41

$wp_post_types[$post_type] = $args; … sugerează că ar trebui să poți schimba proprietățile. Adaugă un exemplu al codului care nu funcționează la întrebarea ta.

fuxia fuxia
13 sept. 2012 19:36:45
1

Am întâmpinat aceeași problemă cu plugin-ul The Events Calendar.

Am adăugat codul de mai jos în functions.php pentru a modifica tipul de post tribe_organizer:

function tribe_modify_organizer() {
 // Argumente noi
    $tribe_organizer_args = get_post_type_object('tribe_organizer'); // obține tipul de post de modificat
    $tribe_organizer_args-> taxonomies = array('post_tag' , 'tribe_events_cat'); // adaugă suport pentru taxonomii
    $tribe_organizer_args-> exclude_from_search = false; // afișează în rezultatele de căutare
 // Reînregistrează același tip de post includând noile argumente
    register_post_type( 'tribe_organizer', $tribe_organizer_args );
}
add_action( 'init', 'tribe_modify_organizer', 100 );
12 feb. 2017 22:26:01
Comentarii

Excelent exemplu, mulțumesc!

Philipp Philipp
25 aug. 2020 14:25:59
0

Nu știu dacă acest lucru este urât, dar ai putea modifica placeholder-ul GLOBAL "pe loc" ori de câte ori ai nevoie să manipulezi un singur argument. Iată cum folosim un tip de postare ne-public contents pentru a fi acceptabil în meniul de administrare. Conectăm funcțiile imediat înainte și imediat după randarea meniului:

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

În cazul nostru, dorim ca plugin-ul Admin Menu Post List să accepte tipul nostru de postare, deoarece ei apelează return get_post_types(array('public' => true)); în interiorul hook-ului lor cu prioritatea 11...

Dezvoltatori - Vă rugăm să comentați dacă acest lucru ar putea cauza probleme.

19 sept. 2018 01:42:00