Criando um termo de taxonomia não removível

4

Existe uma maneira, sem modificar o núcleo, de criar um termo para uma taxonomia personalizada programaticamente que não seja deletável?

"Não categorizado" é um exemplo, mas, no meu caso, não precisa ser o termo padrão se uma postagem não estiver anexada a um termo, mas sim, será um termo padrão sempre existente nessa taxonomia personalizada.

EDITAR:

Por não removível, principalmente, quero dizer no front-end. Ou seja, a caixa de seleção Excluir link e Ação em massa não será exibida, assim como "Sem categoria".

    
por karbuncle 22.08.2014 / 16:45

3 respostas

3

Atualizar

De fato, existe uma maneira de definir um termo por taxonomia como termo padrão, o que o torna não deletável da GUI de administração.

WP_Terms_List_Table procura uma opção get_option( 'default_' . $this->screen->taxonomy ) .

Portanto, se você tiver uma taxonomia personalizada chamada genre , terá que definir uma opção default_genre com o ID de termo do termo que deseja proteger de ser excluído por meio da GUI de administração:

$taxonomy = 'genre';
$key = get_option( 'default_' . $taxonomy );
$term = get_term_by( 'name', 'Your default genre term', $taxonomy );
if ( empty( $key ) && $term )
     update_option( $key, $term->term_id );

tl; dr Na minha primeira resposta, perdi esse recurso. Mas a descrição do manuseio de recursos ainda é válida.

primeira resposta

Neste ponto, isso não é possível. Isso porque, em WP_Terms_List_Table , todas as verificações de capacidade são feitas assim:

current_user_can( $tax->cap->delete_terms );

Isso significa que todas as verificações de exibição são, se o usuário tiver o privilégio de excluir termos dessa categoria como um todo. Seria possível, se a chamada de função se parecesse com isso:

current_user_can( $tax->cap->delete_terms, $tag )

onde $tag seria o objeto do termo.

Nesse caso, você pode filtrar facilmente map_meta_cap (onde a verificação de capacidade e o segundo parâmetro são passados) para revogar o privilégio de excluir um termo específico.

A propósito, esse é o comportamento padrão em WP_Posts_List_Table , portanto, é possível verificar os recursos de cada postagem única.

A única maneira que vejo no momento é registrar uma taxonomia sem os elementos padrão da interface do usuário do administrador e criar uma página de administração personalizada para gerenciar os termos de acordo com suas necessidades.

    
por David 22.08.2014 / 18:05
1

Não sei se você pode parar a remoção de um termo, mas você pode garantir que ele sempre exista. Apenas jogue isso no seu functions.php (ou plugin):

if ( !term_exists('locked-term', 'category' ) )
  wp_insert_term('Locked Term', 'category', array('slug' => 'locked-term'));

Então, para ser claro, tecnicamente eles podem remover o termo, mas na próxima vez que o site for recarregado, o termo será restaurado. Isso está efetivamente bloqueando o termo.

    
por Jason 22.08.2014 / 17:23
1

Para fazer isso de uma maneira inicial, você pode remover a ação de exclusão usando um filtro e (como não parece haver um filtro para fazer isso), desative & esconder a caixa de seleção usando jquery:

define( 'PROTECTED_TERM_ID', 2 );
define( 'CUSTOM_TAX', 'genres' );
function wpse158784_custom_tax_row_actions( $actions, $tag ) {
    if ( $tag->term_id == PROTECTED_TERM_ID ) unset( $actions['delete'] );
    return $actions;
}
function wpse158784_admin_footer_edit_tags_php() {
    if ( ! isset( $_GET['taxonomy'] ) || $_GET['taxonomy'] != CUSTOM_TAX ) return;
    ?>
    <script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery('input#cb-select-<?php echo PROTECTED_TERM_ID; ?>').prop('disabled', true).hide();
    });
    </script>
    <?php
}
if ( is_admin() ) {
    add_filter( CUSTOM_TAX . '_row_actions', 'wpse158784_custom_tax_row_actions', 10, 2 );
    add_action( 'admin_footer-edit-tags.php', 'wpse158784_admin_footer_edit_tags_php' );
}
    
por bonger 22.08.2014 / 20:09