在自定义分类法中插入术语


9

进行了此自定义分类法,可以控制单个帖子的布局,基本上我想添加两个选项:布局1和布局2。

// Register Custom Taxonomy
function custom_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Layout', 'Taxonomy General Name', 'text_domain' ),
        'singular_name'              => _x( 'Layout', 'Taxonomy Singular Name', 'text_domain' ),
        'menu_name'                  => __( 'Taxonomy', 'text_domain' ),
        'all_items'                  => __( 'All Items', 'text_domain' ),
        'parent_item'                => __( 'Parent Item', 'text_domain' ),
        'parent_item_colon'          => __( 'Parent Item:', 'text_domain' ),
        'new_item_name'              => __( 'New Item Name', 'text_domain' ),
        'add_new_item'               => __( 'Add New Item', 'text_domain' ),
        'edit_item'                  => __( 'Edit Item', 'text_domain' ),
        'update_item'                => __( 'Update Item', 'text_domain' ),
        'separate_items_with_commas' => __( 'Separate items with commas', 'text_domain' ),
        'search_items'               => __( 'Search Items', 'text_domain' ),
        'add_or_remove_items'        => __( 'Add or remove items', 'text_domain' ),
        'choose_from_most_used'      => __( 'Choose from the most used items', 'text_domain' ),
        'not_found'                  => __( 'Not Found', 'text_domain' ),
    );
    $capabilities = array(
        'manage_terms' => 'foobar',
        'edit_terms'   => 'foobar',
        'delete_terms' => 'foobar',
        'assign_terms' => 'foobar' 
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => false,
        'show_in_nav_menus'          => false,
        'show_tagcloud'              => false,
        'capabilities'               => $capabilities,
    );
    register_taxonomy( 'Layout', array( 'post' ), $args );

}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );

功能设置为无效值以阻止术语被编辑,但是wp_insert_term无法正常工作。

在我的自定义分类法中添加两个术语不会那么难,对吧?

尽管将我的自定义分类名称更改为“ category”(即WP默认),但使用它插入术语是行不通的。是什么赋予了?

function example_insert_category() {
    $parent_term = term_exists( 'layout' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id
    wp_insert_term(
        'Example Category',
        'layout',
        array(
          'description' => 'This is an example category created with wp_insert_term.',
          'slug'        => 'example-category'
        )
    );
}
add_action( 'after_setup_theme', 'example_insert_category' );

按照承诺,我将代码发布到了插件。希望这会
有所

Answers:


12

编辑2

如所承诺的,这是插件的代码。

众所周知的事实是,自定义分类法和自定义帖子类型应该放入插件中,而不是放在主题中。我从插件中剥离了零件。

怎么运行的

分类法通过插件正常注册。有关此的任何信息,您可以转到register_taxonomy。我需要强调的部分以及与此问题相关的部分是如何插入新术语。

wp_insert_terms快速插入术语很容易,但是如果使用不正确,此代码也可能会缩短加载时间。这个想法是先运行一次该函数,然后再运行一次,几乎就像第一次运行后将其删除一样。

为此,您需要将函数连接到register_activation_hook。该挂钩运行一次,即当插件被激活时,它不会在页面刷新时重新运行。只有在停用插件并再次激活后,它才会再次触发

因此,您首先需要注册分类法,因为您无法为不存在的分类法分配术语。注册分类法后,您可以插入条款。请记住,此操作只会发生一次,也就是激活插件时。如果您需要添加条款,则需要停用插件并再次激活

您还想先尝试检查术语是否存在,然后再尝试创建和插入它。

这是插件代码

<?php
/**
Plugin Name: Create terms
Plugin URI: http://wordpress.stackexchange.com/q/163541/31545
Description: Create terms
Version: 1.0
Author: Pieter Goosen
License: GPLv2 or later
*/
class Test_Terms {

    function __construct() {
        register_activation_hook( __FILE__,array( $this,'activate' ) );
        add_action( 'init', array( $this, 'create_cpts_and_taxonomies' ) );
    } 

    function activate() {
        $this->create_cpts_and_taxonomies();
        $this->register_new_terms();
    }

    function create_cpts_and_taxonomies() {

        $args = array( 
            'hierarchical'                      => true,  
            'labels' => array(
                'name'                          => _x('Test Tax', 'taxonomy general name' ),
                'singular_name'                 => _x('Test Tax', 'taxonomy singular name'),
                'search_items'                  => __('Search Test Tax'),
                'popular_items'                 => __('Popular Test Tax'),
                'all_items'                     => __('All Test Tax'),
                'edit_item'                     => __('Edit Test Tax'),
                'edit_item'                     => __('Edit Test Tax'),
                'update_item'                   => __('Update Test Tax'),
                'add_new_item'                  => __('Add New Test Tax'),
                'new_item_name'                 => __('New Test Tax Name'),
                'separate_items_with_commas'    => __('Seperate Test Tax with Commas'),
                'add_or_remove_items'           => __('Add or Remove Test Tax'),
                'choose_from_most_used'         => __('Choose from Most Used Test Tax')
            ),  
            'query_var'                         => true,  
            'rewrite'                           => array('slug' =>'test-tax')        
        );
        register_taxonomy( 'test_tax', array( 'post' ), $args );
    }

    function register_new_terms() {
        $this->taxonomy = 'test_tax';
        $this->terms = array (
            '0' => array (
                'name'          => 'Tester 1',
                'slug'          => 'tester-1',
                'description'   => 'This is a test term one',
            ),
            '1' => array (
                'name'          => 'Tester 2',
                'slug'          => 'tester-2',
                'description'   => 'This is a test term two',
            ),
        );  

        foreach ( $this->terms as $term_key=>$term) {
                wp_insert_term(
                    $term['name'],
                    $this->taxonomy, 
                    array(
                        'description'   => $term['description'],
                        'slug'          => $term['slug'],
                    )
                );
            unset( $term ); 
        }

    }
}
$Test_Terms = new Test_Terms();

编辑1

您插入条款的问题是您的麻烦。after_setup_theme在之前运行init,这意味着您正在尝试向尚未注册的分类法插入术语。

我建议您将wp_insert_term函数移到init函数内部,即下面register_taxonomy

还建议term_exists在插入术语之前先检查是否存在()

例:

// Register Custom Taxonomy
function custom_taxonomy() {

   //CODE TO REGISTER TAXONOMY

   if( !term_exists( 'Example Category', 'layout' ) ) {
       wp_insert_term(
           'Example Category',
           'layout',
           array(
             'description' => 'This is an example category created with wp_insert_term.',
             'slug'        => 'example-category'
           )
       );
   }
}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );

请注意,这未经测试

原始答案

自定义分类名称(和自定义帖子类型名称)需要遵循一组非常特定的规则,否则您将遇到陷阱,无法解决。

这是为自定义分类法(和自定义帖子类型)选择名称时的指南

  1. 以下是不是允许自定义分类名称和自定义后类型名称

    • 大写字母或大写字母

    • 除下划线(_)以外的任何特殊字符

    • 空间

    • 分类法超过32个字符,帖子类型超过20个字符

    • 任何保留名称,请注意,这适用于任何自定义命名约定,而不仅仅是分类名称。

  2. 如果分类名称中有多个单词,则必须用下划线而不是连字符(-)分隔。我一直面临挑战,即连字符是在分类名称的URL中使用SEO的方法。的确如此,这就是为什么存在重写规则来相应地调整URL的原因。切勿出于URL SEO的目的更改分类名称或帖子类型名称

另外,您应该删除那些奇怪的功能。也可能会产生问题

如果这不能解决您的问题,请添加您使用的代码 wp_insert_term

参考:


在查看了源代码之后,我有些困惑,因为$taxonomy如果将query_var参数设置为,则根本不会清除该参数true。实际上,那真是令人难以置信。否则,它会通过进行消毒sanitize_title_with_dashes(),这将在整个地方用破折号代替东西。这也是不可思议的,因为不应该使用它们。
Nicolai 2014年

除了事实之外,您还可以在任何地方使用自己喜欢的数字,因此从一开始就可以使用数字,尽管您可以在任何地方阅读都不应这样做。但是找不到针对数字的明确原因。与破折号不同,至少有一条语句»此外,如果帖子类型包含破折号,您将无法在自定义帖子类型的管理页面中添加列(使用'manage_ <自定义帖子类型名称> _posts_columns'操作) 。«在的法典页面上register_post_type()
Nicolai 2014年

1
WordPress确实有其缺陷,必须同意。有些是实际犯罪:-)。我认为破折号是最受关注的主题之一,也是名称中使用最多的主题。当您开始查看模板层次结构时,它的失败非常明显。用两个单词(例如,用破折号分隔的my-taxonomy)创建一个分类法,然后创建一个分类法模板taxonomy-my-taxonomy.php,您将看到失败。我在某处读过数字,但是需要再次检查。这是我经常用来保持安全的安全列表,并且效果很好。感谢您提供的所有信息,感谢
Pieter Goosen 2014年

1
和我一样,只是因为我从一开始就以正确的方式学习了它。据我所知,我从WordPress开发以及这里的聪明和有经验的人那里了解到最多。因此,我从未真正犯过很多错误。
Nicolai 2014年

1
恕我直言,这个答案应该受到保护。此答案/示例中的详细信息非常重要,但在法典中所指出的却不够多。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.