drewgourley
  • 0
Мастер

Есть ли способ «заблокировать» таксономию?

  • 0

Мне было интересно, есть ли способ предотвратить добавление новых категорий в таксономию, по сути, «заблокировав» таксономию.

Я программно регистрирую таксономию и заполняю ее терминами через functions.php и хотел бы, чтобы вы больше не могли добавлять в нее.

Видение, РЕАЛИЗОВАННОЕ…

Вот как в итоге выглядело мое решение, и оно отлично работает! СПАСИБО всем кто помог. Голоса повсюду прямо вам в лицо!

// some stuff happens before this...
    $labels = array(
        'name' => _x( 'Attendees', 'taxonomy general name' ),
        'singular_name' => _x( 'Attendee', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Attendees' ),
        'all_items' => __( 'All Attendees' ),
        'edit_item' => __( 'Edit Attendee' ), 
        'update_item' => __( 'Update Attendee' ),
        'add_new_item' => __( 'Add New Attendee' ),
        'new_item_name' => __( 'New Attendee Name' ),
        'menu_name' => __( 'Attendees' )
    );
    $rewrite = array(
        'slug' => 'attendee'
    );
    $capabilities = array(
        'manage_terms' => 'nobody',
        'edit_terms' => 'nobody',
        'delete_terms' => 'nobody',
        'assign_terms' => 'nobody'
    );
    $args = array(
        'hierarchical' => true,
        'labels' => $labels,
        'show_ui' => true,
        'query_var' => 'attendee',
        'rewrite' => $rewrite,
        'capabilities' => $capabilities
    );
    register_taxonomy('attendees', 'meetings', $args);
}
add_action( 'init', 'todo_create_taxonomies', 1);
function todo_register_attendees() {
    $users = get_users();
    foreach ( $users as $user ) {
        wp_insert_term( $user->display_name, 'attendees', array('description'=> $user->display_name, 'slug' => $user->user_nicename) );
        $lockdown[] = $user->user_nicename;
    }
    $terms = get_terms('attendees', array('get' => 'all') );
    foreach ($terms as $term) {
        if ( !in_array($term->slug, $lockdown) ) {
            wp_delete_term( $term->term_id, 'attendees' );
            $message = new WP_Error('force_terms', __('Only Registered Users can be Attendees, ' . $term->name . ' has been deleted.'));
            if ( is_wp_error($message) ) { ?>
                <div id="aphid-error-<?php echo $message->get_error_code(); ?>" class="error aphid-error"> 
                    <p><strong><?php echo $message->get_error_message(); ?></strong></p>
                </div>
            <?php }
        }
    }
}
add_action( 'admin_notices', 'todo_register_attendees' );
Share
  1. Категории, теги и таксономии

    Сначала я хочу прояснить: все есть таксономия. Теги неиерархичны, категории иерархичны, и обе являются встроенными таксономиями. То же самое касается, например. форматы постов (в сторону, чат и т.д.). Это та же концепция, что и с типами сообщений (сообщение, страница, вложение, nav_menu_item и т. д. — все они просто встроены в типы сообщений).

    Все внутри одной из этих Таксономий является Термом. Например. (внутри форматов постов) «в сторону», «цитата», «аудио».

    Ссылки Кодекса

    • register_taxonomy() — позволяет зарегистрировать таксономию из упр. внутри вашего functions.php файла.
    • wp_insert_term() — позволяет зарегистрировать термин
    • wp_delete_term() — позволяет удалить термин
    • get_terms() — позволяет получить все термины из заданной таксономии

    Концепция

    Следующее для вашего functions.php файла. Это срабатывает при каждом запросе страницы. Вы можете улучшить его — используя Transients API — для запуска по заданным временным меткам (например, дважды в день, ежечасно и т. д.).

    function wpse14350_cleanup_taxonomy_terms()
    {
        // Define your terms inside this array
        $predefined_terms = array(
             'term A'
            ,'term B'
            ,'term C'
        );
        // Name your taxonomy here
        $predefined_taxonomy = 'category';
    
        $all_terms_inside_tax = get_terms( 
             $predefined_taxonomy
            ,array(
                 'hide_empty'   => false
                ,'taxonomy'     => $predefined_taxonomy
            ) 
        );
    
        foreach ( $all_terms_inside_tax as $term )
        {
            if ( ! in_array( $term->name, $predefined_terms ) )
                wp_delete_term( $term->term_id, $predefined_taxonomy );
        }
    }
    add_action( 'init', 'wpse14350_cleanup_taxonomy_terms' );
    
    • 0
  2. Если вы добавляете термины в таксономию независимо друг от друга и хотите скрыть пользовательский интерфейс, почему бы просто не использовать два из register_taxonomy поддерживаемых аргументов.

    Возможности
    (массив) (необязательно) Массив возможностей для этой таксономии.

    По умолчанию: Нет

    ‘manage_terms’ — ‘manage_categories’
    ‘edit_terms’ — ‘manage_categories’
    ‘delete_terms’ — ‘manage_categories’
    ‘assign_terms’ — ‘edit_posts’

    show_ui
    (логическое значение) (необязательно) Следует ли создавать пользовательский интерфейс по умолчанию для управления этой таксономией.

    По умолчанию: если не установлено, по умолчанию используется значение открытого аргумента.

    Установите возможности на некоторые несуществующие возможности, и вы, по сути, лишите пользователей возможности изменять, создавать или удалять их. Если вам нужно иметь возможность назначать их для сообщений традиционным способом (например, через редактор сообщений), просто используйте реальную возможность для assign_terms значения.

    Пример:

    $args = array(
    
    ....
    
        'capabilities' => array(
            'manage_terms' => 'foobar',
            'edit_terms'   => 'foobar',
            'delete_terms' => 'foobar',
            'assign_terms' => 'foobar' // <-- change this one to a desired cap if you need to be able to assign them(you could use manage_options for admins only)
        ),
    );
    

    Установите show_ui значение false, и вы предотвратите отображение каких-либо пунктов меню для таксономии.

    Надеюсь, это поможет…

    • 0

Оставить ответ

You must login to add an answer.