Deregistrare i tipi di post personalizzati
Qualcuno conosce un modo per deregistrare i tipi di post personalizzati?
Esiste un equivalente di register_post_type()
?

A partire da WordPress 4.5 esiste una funzione per farlo, unregister_post_type
. Esempio:-
function delete_post_type(){
unregister_post_type( 'blocks' );
}
add_action('init','delete_post_type');

questo deve avere una priorità più alta rispetto a quella usata per registrare il post type altrimenti non funzionerà

@Dhinju Divakaran non sta eliminando il vecchio post type dal database che non sto più usando ora.

funziona, assicurati di dare una priorità più alta a questa azione rispetto all'azione usata per registrare il post type.

Vale la pena menzionare che unregister_post_type()
non elimina nulla dal database. Previene solo la registrazione del tipo di contenuto.

Questa soluzione ha funzionato perfettamente per me, ma tieni presente che dovrai informare WordPress del cambiamento ri-salvando la struttura dei Permalink nella pagina di amministrazione Impostazioni -> Permalink. Altrimenti, le pagine con permalink in conflitto non funzioneranno correttamente.

Attualmente non esiste una funzione per deregistrare un tipo di post, ma il processo è piuttosto semplice.
Andrew Nacin ha fornito del codice su trac, disponibile qui e riportato di seguito.
if ( ! function_exists( 'unregister_post_type' ) ) :
function unregister_post_type( $post_type ) {
global $wp_post_types;
if ( isset( $wp_post_types[ $post_type ] ) ) {
unset( $wp_post_types[ $post_type ] );
return true;
}
return false;
}
endif;
Deregistrare un tipo di post integrato in WordPress potrebbe avere effetti imprevedibili, quindi procedete a vostro rischio. Deregistrare un tipo di post personalizzato dovrebbe essere perfettamente sicuro, ma naturalmente non effettua alcuna pulizia nell'installazione (ad esempio, deregistrare un tipo di post non equivale alla rimozione dei dati dal database).
Posso immaginare alcuni scenari in cui questo potrebbe essere necessario, ma l'approccio più sensato (quando possibile) sarebbe semplicemente evitare di registrare il tipo di post in primo luogo se non è desiderato.

Prego.. :) Se stai aggiungendo i tuoi tipi di post tramite codice, la soluzione più semplice sarebbe semplicemente rimuovere la funzione/codice che li aggiunge. Inoltre, nota che rimuovere i tipi di post non li elimina dalla tabella dei post, quindi potresti avere voci ridondanti in quella tabella.

@anu: L'unica cosa che rimane "permanente" se non esegui register_post_type()
ad ogni caricamento di pagina (init
) è probabilmente la struttura dei permalink (aggiornala e sparirà), e i post nel database, che puoi rimuovere eseguendo DELETE FROM wp_posts WHERE post_type = '[your custom post type]'
.

Curiosamente, ho rimosso il codice register_post_type per quel custom_post_type, e non avevo aggiunto alcun post a quel cpt, ma non ha rimosso l'interfaccia di amministrazione.

Ovviamente, ora che riprovo, funziona come avete descritto - cioè l'interfaccia di amministrazione per il nuovo CPT è sparita. Probabilmente sono stato un po' tonto :) Comunque informazioni utili, grazie.

Aggiornamento a febbraio 2016 - questa funzione è stata incorporata nel core per WP 4.5.0 (che verrà rilasciato ad aprile).

Potrebbe essere utile dare un'occhiata al codice effettivo (piuttosto breve) utilizzato per la funzione che è stata inclusa nel core, qui: https://developer.wordpress.org/reference/functions/unregister_post_type/. Fa un po' più di questa funzione, anche se non sono sicuro di quando siano state introdotte le funzioni aggiuntive su cui si basa.

Questo ha funzionato per me, come ha detto Rarst, usando il remove_action() quando possibile.
add_action( 'after_setup_theme','remove_foundation_options', 100 );
function remove_foundation_options() {
remove_action( 'init', 'Orbit');
}

Come ha notato t31os, è facile rimuovere un tipo di post dalla variabile globale.
Ma se intendi un tipo di post non standard (non-core), sarebbe meglio cercare il codice che lo registra e rimuoverlo con remove_action()
(se il codice è ben scritto dovrebbe essere agganciato tramite hook piuttosto che eseguito direttamente).

register_post_type()
non è una funzione che si presta facilmente all'aggancio. Il modo normale per registrare un post type è eseguire la funzione direttamente in una funzione agganciata a init. Rimuovere quell'azione potrebbe avere effetti indesiderati, poiché spesso verrà rimossa anche altra funzionalità insieme a quella funzione.
