Özel bir sınıflandırma içine bir terim ekleme


9

Tek yazılarda düzeni kontrol edecek bu özel sınıflandırma yaptım, temel olarak Düzen 1 ve Düzen 2 olmak üzere iki seçenek eklemek istiyorum.

// 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 );

Terimlerin düzenlenmesini durdurmak için yetenekler geçersiz değerlere ayarlanmış, ancak wp_insert_term çalışamıyor.

Özel sınıflandırmama iki terim eklemek o kadar zor olamaz, değil mi?

Bir terim eklemek için bunu kullanmak işe yaramaz, ancak özel sınıflandırma adımı 'kategori' olarak değiştirirsem, yani WP varsayılanı iyi çalışır. Ne oluyor?

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

Söz verdiğim gibi kodu eklentiye gönderdim. Umarım bu yardımcı olur :-)
Pieter Goosen

Yanıtlar:


12

DÜZENLEME 2

Söz verildiği gibi, eklentinin kodu.

Özel taksonomilerin ve özel gönderi türlerinin temanızda değil , bir eklentiye girmesi gerektiği bilinen bir gerçektir . Eklentimdeki parçaları çıkardım.

NASIL ÇALIŞIR

Sınıflandırma, eklenti aracılığıyla normal olarak kaydedilir. Bununla ilgili herhangi bir bilgi için gidip kontrol edebilirsiniz register_taxonomy. Vurgulamak istediğim kısım ve bu soru ile ilgili olan, yeni terimlerin nasıl ekleneceği.

Terimler eklemek wp_insert_termshızlı ve kolaydır, ancak bu kod doğru kullanılmazsa yükleme süresine de zarar verebilir. Fikir, bu işlevi bir kez çalıştırmak ve daha sonra bir daha asla, ilk çalıştırmadan sonra kaldırmak gibi.

Bunu yapmak için, fonksiyonunuzu bağlayacaksınız register_activation_hook. Bu kanca bir kez çalışır, yani eklenti etkinleştirildiğinde, sayfa yenilemesinde tekrar çalışmaz. Tekrar ateşleyeceği tek zaman eklentinin devre dışı bırakılıp tekrar etkinleştirilmesidir.

Dolayısıyla, var olmayan bir sınıflandırmaya terim atayamayacağınız için öncelikle sınıflandırma işleminizi kaydetmeniz gerekir. Sınıflandırmanız kaydedildikten sonra terimlerinizi ekleyebilirsiniz. Unutmayın, bu eylem sadece bir kez gerçekleşir ve bu eklenti etkinleştirilir. Terim eklemeniz gerekiyorsa, eklentiyi devre dışı bırakmanız ve tekrar etkinleştirmeniz gerekir

Ayrıca, bir terim oluşturup eklemeye çalışmadan önce bir terimin var olup olmadığını kontrol etmek istersiniz.

İşte eklenti kodu

<?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();

DÜZENLEME 1

Terim ekleme ile ilgili sorununuz kanca. after_setup_themedaha önce çalışır init, yani henüz kayıtlı olmayan bir sınıflandırma için bir terim eklemeye çalışıyorsunuz.

wp_insert_termİşlevinizi init işlevinizin içine taşımanızı öneririm , hemen altındaregister_taxonomy

Ayrıca, bir terim term_existseklemeden önce bir terimin ( ) olup olmadığını kontrol etmeniz de önerilir.

Misal:

// 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 );

Unutmayın, bu test edilmemiştir

ORİJİNAL CEVAP

Özel sınıflandırma adlarının (ve özel posta türü adlarının) çok özel bir kurallar kümesine uyması gerekir;

Özel sınıflandırmalar (ve özel yayın türleri) için adları seçerken bir kılavuz satırı aşağıda verilmiştir

  1. Aşağıdaki edilir değil özel taksonomisi isimleri ve özel yayın türü adlarında izin

    • Büyük harfler veya deve

    • Alt çizgiler ( _) dışında herhangi bir özel karakter türü

    • Spaces

    • Taksonomi için 32 karakterden ve yazı türleri için 20 karakterden fazla

    • Herhangi ayrılmış isimler ve lütfen not, bu gider herhangi özel adlandırma kuralı, sadece sınıflandırma adları.

  2. Bir sınıflandırma adında birden fazla sözcük varsa , bunların tire ( -) yerine alt çizgi ile ayrılması gerekir . Kısa çizgiler, taksonomi adları için URL'lerde SEO için gitmek için bir yol olduğu meydan okundu. Bu nedenle, URL'nizi buna göre ayarlamak için yeniden yazma kuralları vardır. URL SEO amaçları için sınıflandırma adlarını veya posta türü adlarını asla değiştirmeyin

Ayrıca, bu garip yetenekleri de kaldırmalısınız. Ayrıca bir sorun yaratabilir

Bu sorununuzu çözmezse, lütfen kullandığınız kodu ekleyin wp_insert_term

Referans:


Kaynağa baktıktan sonra, biraz argümanlıyım , çünkü argüman ayarlanırsa $taxonomyparametre hiç dezenfekte olmaz . Aslında bu gerçekten inanılmaz. Ve aksi takdirde sanitize olur , bu da nomen es omen, her yerde şeyleri tire ile değiştirir. Kullanılmaması gerektiği için de inanılmaz. query_vartruesanitize_title_with_dashes()
Nicolai

Aslında, sayıları istediğiniz gibi, her yerde kullanabilirsiniz, bu yüzden başlangıçta da, bunun yapılmaması gereken her yeri okuyabilirsiniz. Ancak sayılara karşı kesin bir neden bulunamadı. Kısa çizgilerden farklı olarak, en azından bir ifade vardı »Ayrıca, yayın türü tire içeriyorsa, özel yayın türünün yönetici sayfasına sütun ekleyemezsiniz ('manage_ <Özel Posta Türü Adı> _posts_columns' işlemini kullanarak) . «'İn kodeks sayfasında register_post_type().
Nicolai

1
Wordpress'in kusurları var, kabul etmeli. Bazıları gerçek suçlardır :-). Bence tireler en çok konuşulan konulardan biri ve aynı zamanda isimlerde en çok kullanılan konulardan biri. Şablon hiyerarşisine bakmaya başladığınızda başarısızlığı oldukça belirgindir. Bir sınıflandırma ile ayrılmış iki kelimeli bir sınıflandırma oluşturun ve bir sınıflandırma şablonu sınıflandırma-sınıflandırma.php şablonu oluşturun, başarısızlık göreceksiniz. Bir yerde bir şey okudum, yine de tekrar kontrol etmeliyim. Bu, her zaman güvende kalmak için kullandığım güvenli bir liste ve mükemmel çalıştı. Tüm bilgilerin için teşekkürler, takdir
Pieter Goosen

1
Ben de, ama en başından beri doğru şekilde öğrendiğim için. Bildiğim kadarıyla WordPress Geliştirme'den ve buradaki akıllı ve deneyimli insanlardan öğrendim . Yani aslında kendim hiç yapmadığım birçok hata var.
Nicolai

1
Bu cevap korunmalı. Bu cevaptaki / örnekteki ayrıntılar çok önemlidir ve Kodeks'de yeterince işaret edilmez.
Charles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.