将术语插入到自定义分类中

时间:2014-10-06 作者:andy

制作了这个自定义分类法,可以控制单个帖子的布局,基本上我想添加两个选项,布局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\\U insert\\U term正常工作。

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

使用此方法插入术语不起作用,尽管如果我将自定义分类名称更改为“category”,即WP default,效果很好。有什么好处?

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\' );

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

EDIT 2

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

众所周知,自定义分类法和自定义帖子类型应该放在插件中not 在您的主题中。我已经从插件中删除了部分。

HOW IT WORKS

该分类通过插件注册为普通分类。有关这方面的任何信息,你可以去看看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();

EDIT 1

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

我建议你wp_insert_term 函数的内部,就在下面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 );
请注意,这是未经测试的

ORIGINAL ANSWER

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

以下是为自定义分类法(和自定义帖子类型)选择名称时的指导原则

以下是not 自定义分类名称和自定义帖子类型名称中允许使用

大写字母或camelcase

任何类型的特殊字符,下划线除外(_)

  • 空格

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

    任何reserved names, 请注意,这是any 自定义命名约定,而不仅仅是分类名称。

    如果分类学名称中有多个单词,则have to 用下划线而不是连字符分隔(-). 我一直在质疑,在分类名称的URL中,连字符是进行SEO的方式。这是真的,这就是为什么有重写规则来相应地调整您的URL。切勿出于URL SEO目的更改分类名称或帖子类型名称

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

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

    参考号:

  • 结束

    相关推荐