맞춤 분류 체계에 용어 삽입


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이 작동하지 않습니다.

내 맞춤 분류 체계에 두 개의 용어를 추가하는 것은 그리 어렵지 않습니다.

사용자 정의 분류 이름을 '범주'(예 : 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' );

약속 한대로 코드를 플러그인에 게시했습니다. 희망이 :-)하는 데 도움이
피터 구센

답변:


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(). 이는 nomen esmen, 물건을 대시로 대체합니다. 그것들은 사용해서는 안되기 때문에 믿을 수 없습니다.
Nicolai

사실을 제외하고는 어디에서나 원하는대로 숫자를 사용할 수 있으므로 처음부터는 사용할 수 있지만 어디서나 읽을 수는 없습니다. 그래도 숫자에 대한 확실한 이유를 찾지 못했습니다. 대시와 달리 적어도»»또한 게시물 유형에 대시가 포함 된 경우 'manage_ <Custom Post Type Name> _posts_columns'작업을 사용하여 사용자 정의 게시물 유형의 관리 페이지에 열을 추가 할 수 없습니다. .«의 코덱스 페이지에 register_post_type()있습니다.
Nicolai

1
워드 프레스에는 결함이 있으므로 동의해야합니다. 일부는 실제 범죄입니다 :-). 대시는 가장 많이 말하는 주제 중 하나이며 이름에서 가장 많이 사용됩니다. 템플릿 계층을 살펴볼 때 실패가 분명합니다. 대시로 구분 된 my-taxonomy와 같은 두 단어로 분류법을 작성하고 분류법 템플리트 taxonomy-my-taxonomy.php를 작성하면 실패가 표시됩니다. 나는 어딘가에서 숫자를 읽었고 다시 확인해야합니다. 이것은 항상 안전을 유지하기 위해 사용하는 안전 유지 목록이며 완벽하게 작동했습니다. 모든 정보에 감사드립니다
Pieter Goosen

1
나도 그랬지만 처음부터 올바른 방법으로 배웠기 때문입니다. 내가 WordPress Development 와 똑똑하고 경험 많은 사람들 로부터 가장 많이 배웠습니다 . 제가 실제로 한 적이없는 실수가 많이 있습니다.
Nicolai

1
이 답변은 보호되어야합니다. 이 답변 / 예제의 세부 사항은 매우 중요하며 종종 코덱스에서 충분하지 않습니다.
찰스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.