Creando un término de taxonomía no removible

4

¿Hay una manera, sin modificar el núcleo, de crear un término para una taxonomía personalizada programáticamente que no se pueda eliminar?

"Sin categoría" es un ejemplo, pero en mi caso, no tiene que ser el término predeterminado si una publicación no está asociada a un término, pero sí, será un término predeterminado siempre existente en esa taxonomía personalizada.

EDIT:

Por no extraíble, principalmente me refiero en la parte delantera. Es decir, la casilla de verificación eliminar enlace y acción masiva no se mostrará, como "Sin categoría".

    
pregunta karbuncle 22.08.2014 - 16:45

3 respuestas

3

Actualizar

De hecho, hay una manera de definir un término por taxonomía como término predeterminado que hace que no se pueda eliminar de la GUI del administrador.

WP_Terms_List_Table busca una opción get_option( 'default_' . $this->screen->taxonomy ) .

Entonces, si tiene una taxonomía personalizada llamada genre , debe configurar una opción default_genre con el término-id del término que desea proteger para que no se elimine a través de la GUI del administrador:

$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 En mi primera respuesta me perdí esta función. Pero la descripción del manejo de la capacidad sigue siendo válida.

primera respuesta

En este punto, no es posible. Esto se debe a que en WP_Terms_List_Table todas las comprobaciones de capacidad se realizan de esta forma:

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

Eso significa que todas las comprobaciones de vista son, si el usuario tiene el privilegio de eliminar términos en esta categoría en general. Sería posible, si la llamada a la función se ve así:

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

donde $tag sería el término objeto.

En este caso, podría filtrar fácilmente map_meta_cap (donde se pasa la verificación de capacidad y el segundo parámetro) para revocar el privilegio de eliminar un término específico.

Por cierto, este es el comportamiento predeterminado en WP_Posts_List_Table , por lo que es posible verificar las capacidades de cada publicación.

La única forma que veo en este momento es registrar una taxonomía sin los elementos de la IU de administrador predeterminados y crear una página de administración personalizada para administrar los términos según sus necesidades.

    
respondido por el David 22.08.2014 - 18:05
1

No estoy seguro de si puede detener que se elimine un término, pero puede asegurarse de que siempre exista. Simplemente coloque esto en su functions.php (o plugin):

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

Entonces, para ser claros, técnicamente pueden eliminar el término, pero la próxima vez que el sitio se vuelva a cargar, el término se restaurará. Esto está efectivamente bloqueando el término.

    
respondido por el Jason 22.08.2014 - 17:23
1

Para hacerlo solo de forma frontal, puede eliminar la acción de eliminar utilizando un filtro y (ya que no parece haber un filtro para hacer esto) deshabilitar & ocultar la casilla de verificación utilizando 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' );
}
    
respondido por el bonger 22.08.2014 - 20:09

Lea otras preguntas en las etiquetas