Wie füge ich einer benutzerdefinierten Taxonomie ein Standardelement hinzu?


10

Die Wordpress-Standardtaxonomie (Kategorien) enthält standardmäßig das Element Nicht kategorisiert. Wie füge ich einer neuen benutzerdefinierten Taxonomie ein Standardelement hinzu?

functions.php:

// === CUSTOM TAXONOMIES === //
function my_custom_taxonomies() {
    register_taxonomy(
        'block',        // internal name = machine-readable taxonomy name
        'static_content',       // object type = post, page, link, or custom post-type
        array(
            'hierarchical' => true,
            'labels' => array(
                'name' => __( 'Blocks' ),
                'singular_name' => __( 'Block' ),
                'add_new_item' => 'Add New Block',
                'edit_item' => 'Edit Block',
                'new_item' => 'New Block',
                'search_items' => 'Search Block',
                'not_found' => 'No Block found',
                'not_found_in_trash' => 'No Block found in trash',
            ),
            'query_var' => true,    // enable taxonomy-specific querying
            'rewrite' => array( 'slug' => 'block' ),    // pretty permalinks for your taxonomy?
        )
    );
}
add_action('init', 'my_custom_taxonomies', 0);

BEARBEITEN: Ich möchte nur das Taxonomieelement dort haben, wenn das Thema installiert ist. Es muss nicht automatisch zu einem leeren Begriff hinzugefügt werden .

Antworten:


7

Schauen Sie hier:

https://web.archive.org/web/20150403012347/http://wordpress.mfields.org/2010/set-default-terms-for-your-custom-taxonomies-in-wordpress-3-0/

Grundsätzlich müssen Sie den save_post-Hook verwenden, um die Begriffe für den Beitrag zu überprüfen und den Standardbegriff aus Ihrer Taxonomie hinzuzufügen, wenn dieser leer ist.

Wenn Sie nur einen Anfangsbegriff in Ihrer benutzerdefinierten Taxonomie festlegen möchten, können Sie diesen verwenden wp_insert_term(). Es ist wahrscheinlich am einfachsten, es in derselben Funktion hinzuzufügen, mit der Sie Ihre benutzerdefinierte Taxonomie erstellen. Wie t3ios in den Kommentaren hinzufügt, sollten Sie get_term()zuerst aufrufen und den Begriff nur einfügen, wenn der Rückgabewert null ist (dh der Begriff existiert nicht).

Dieser Beispielcode stammt aus dem Codex: http://codex.wordpress.org/Function_Reference/wp_insert_term

$parent_term = term_exists( 'fruits', 'product' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id
wp_insert_term(
  'Apple', // the term 
  'product', // the taxonomy
  array(
    'description'=> 'A yummy apple.', 
    'slug' => 'apple', 
    'parent'=> $parent_term_id
  )
);

@anu Ich glaube, ich habe mich nicht sehr gut erklärt, ich wollte nur diese Taxonomie dort haben, wenn das Thema installiert ist. Es muss kein Begriff sein, wenn es leer ist.
janoChen

@janoChen - Ich habe die Antwort aktualisiert
anu

@anu Ausgezeichnet, ich wünschte, ich könnte Ihre Antwort mehr abstimmen. Ich habe die Fragen bearbeitet. Wo genau soll ich den Code platzieren, den Sie oben geschrieben haben?
janoChen

Der Code, den ich hinzugefügt habe, ist nur ein Beispiel (und stammt aus dem WordPress-Codex). Sie müssen ihn daher nach Bedarf ändern. Der beste Ort, um es hinzuzufügen, wäre kurz vor der schließenden Klammer für die Funktion.
Anu

1
Sie sind sicher, dass Sie die Einfügung in dieser Funktion ausführen möchten, sie wird auf init ausgeführt, d. H. Ich glaube nicht, dass Sie die Einfügung jedes Mal ausführen möchten, wenn eine Seite aufgerufen wird, oder? Vielleicht gibt die Einfügefunktion null / false zurück, wenn bereits ein passender Begriff mit diesem Namen vorhanden ist (ich habe nicht nachgesehen), aber trotzdem scheint dies ein wenig unnötig zu sein (warum nicht get_term (s) aufrufen und dann prüfen, ob er existiert einfügen wenn nicht).
t31os

4

Die Standardkategorie ist in der wp_insert_post()Funktion fest codiert .

Es kann also nicht genau repliziert werden, aber Sie können es auf andere Weise handhaben. Ich würde versuchen, den Übergang des Post-Status für neue Posts zu aktivieren und den gewünschten Standardbegriff zuzuweisen, wenn während der Post-Erstellung keine zugewiesen wurde.


+1 für die Verknüpfung mit dem Post-Status-Hook, genau das habe ich gesucht.
Matt

0

Mit dem Default Term Plugin können Sie dies tun

register_taxonomy( 'custom-tax', array('post'), array(
    'label'              => 'Custom Tag',
    'public'             => true,
    'show_ui'            => true,
    'default_term'       => 'Some Default Term', // Add this line to your code 
// then activate and deactivate the default term plugin to save the terms you set.
));

Wenn der Beitrag gesendet wird, wird standardmäßig der Standardbegriff im Beitrag gespeichert, wenn kein Begriff aktiviert ist. Es funktioniert sowohl für hierarchische als auch für nicht hierarchische Taxonomien.


Wäre schön, wenn der angegebene Begriff automatisch in der Ansicht nach der Erstellung ausgewählt würde, damit der Benutzer weiß, was passieren wird.
Garconis

0

Ich musste eine benutzerdefinierte Taxonomie "Tage" mit den Wochentagen füllen. Ich wollte nicht, dass der Client sich mit dem Erstellen von Tagen herumschlagen oder dort hineinkommen und Tage oder falsch geschriebene Tage löschen musste. Nach dem obigen Rat bin ich auf diese Idee gekommen, aber ich frage mich, ob es eine präzisere Art der Codierung gibt:

 /*************************************** ...Create a Custom Taxonomy for days ******************************/
add_action( 'init', 'build_taxonomies', 0 );  
function build_taxonomies() {  
    register_taxonomy( 
    'days', 
    'schedule',
   array( 'hierarchical' => true, 
    'label' => 'Days',
    'query_var' => true, 
    'show_ui' => false, //removes the menus from admin menu and edit panel  
    'rewrite' => true ) );  

/*---------------------------------------Check to see if the days are created..if not, create them----*/
$parent_term = term_exists( 'days', 'days' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id

wp_insert_term(//this should probably be an array, but I kept getting errors..
        'Monday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'monday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Tuesday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'tuesday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Wednesday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'wednesday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Thursday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'thursday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Friday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'friday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Saturday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'saturday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Sunday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'sunday',
        'parent'=> $parent_term_id ));
}
/************ now I add my own meta box for days to get rid of extra controls *************/

add_action('admin_menu', 'add_custom_categories_box');
function add_custom_categories_box() {
 add_meta_box('myrelateddiv', 'Days*', 'ilc_post_related_meta_box', 'schedule', 'normal', 'low', array( 'taxonomy' => 'days' ));
}

function ilc_post_related_meta_box( $post, $box ) {
  $defaults = array('taxonomy' => 'related');
  if ( !isset($box['args']) || !is_array($box['args']) )
  $args = array();
  else
  $args = $box['args'];
  extract( wp_parse_args($args, $defaults), EXTR_SKIP );
  $tax = get_taxonomy($taxonomy);
?>

  <ul id="<?php echo $taxonomy; ?>checklist" class="list:<?php echo $taxonomy?> categorychecklist form-no-clear">
<?php
  wp_terms_checklist($post->ID, array( 'taxonomy' => $taxonomy, 'popular_cats' => $popular_ids, 'checked_ontop' => FALSE ) )
?>
</ul>   
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.