Die benutzerdefinierte Taxonomiefunktion von WordPress ist großartig und ermöglicht es Ihnen, Ihre Beiträge in verschiedenen Taxonomien zu organisieren, wobei die ganze harte Arbeit für Sie erledigt wird. Allerdings kann es auch etwas einschränkend sein. Wenn Sie einen Beitrag bearbeiten, verfügen Ihre Taxonomiebegriffe über eigene Metafelder, die als Kontrollkästchenliste (für hierarchische Taxonomien) oder als Tag-Cloud (für nicht hierarchische Taxonomien) angezeigt werden. Dies sind Ihre beiden Möglichkeiten.
Dies kann problematisch sein, wenn Sie sicherstellen möchten, dass pro Beitrag nur ein Begriff ausgewählt wird. Natürlich können Sie sich in die save_post
挂钩并删除任何“多余”术语,但这不是特别用户友好,并且肯定不会提供出色的用户界面。有时,以不同的方式呈现分类法在美学上会更合乎需要。本文将向您展示如何做到这一点,我们讨论的所有代码都应添加到主题中的 functions.php
-Datei einklinken. Wir konzentrieren uns auf Optionsfelder, Sie können jedoch auch jede andere Eingabemethode verwenden, beispielsweise ein Dropdown-Menü.
WordPress generiert automatisch die Taxonomie-Meta-Box. Unsere erste Aufgabe besteht also darin, sie zu entfernen, damit wir an ihrer Stelle unsere eigene Taxonomie-Meta-Box erstellen können. Ich gehe davon aus, dass unser Kategoriename „mytaxonomy“ lautet (Sie können dies durch „category“ oder „post_tag“ ersetzen, wenn Sie die WordPress-Tags oder das Kategorie-Meta-Feld ändern möchten).
Um die Meta-Box zu entfernen, verwenden wir remove_meta_box
,它应该从挂钩到 admin_menu
的函数内部调用。 remove_meta_box
, das drei Parameter akzeptiert.
add_action( 'admin_menu', 'myprefix_remove_meta_box'); function myprefix_remove_meta_box(){ remove_meta_box('mytaxonomydiv', 'post', 'normal'); }
Hier verwenden wir eine Funktion, um die entsprechend benannten add_meta_boxes
钩子,该函数将添加我们的元框。为此,该函数将调用 add_meta_box
zu verketten, die eine ganze Reihe von Parametern benötigt, darunter:
//Add new taxonomy meta box add_action( 'add_meta_boxes', 'myprefix_add_meta_box'); function myprefix_add_meta_box() { add_meta_box( 'mytaxonomy_id', 'My Radio Taxonomy','myprefix_mytaxonomy_metabox','post' ,'side','core'); } function myprefix_mytaxonomy_metabox( $post ) { echo 'This is my taxonomy metabox'; }
Insgesamt sollte das oben Gesagte die Standard-Meta-Box entfernen und durch Ihre eigene Meta-Box ersetzen. Derzeit wird lediglich die Meldung „Dies ist meine Kategorie-Meta-Box“ angezeigt. Der nächste Schritt besteht darin, die Rückruffunktion so zu ändern, dass sie anzeigt, was wir wollen.
Wir möchten, dass die Meta-Box so ähnlich wie die Standard-Meta-Box aussieht und sich so verhält. Wenn Sie tiefer in die WordPress-Kerndateien eintauchen, finden Sie hier, wo Metaboxen intern generiert werden. Die unten stehende benutzerdefinierte Funktion ahmt die Kernfunktion nach, weist jedoch einige Änderungen bei der Darstellung von Begriffen auf.
Lassen Sie uns unsere Funktion einzeln durchgehen. Das erste Bit legt einige Variablen fest. Du musst dich nur ändern $taxonomy
变量以匹配您的分类名称。另请注意 $name
变量。我们为输入字段指定名称 tax_input[mytaxonomy]
. Dies ist der Name, der im Standard-Metafeld eingegeben wird. Auf diese Weise übernimmt WordPress automatisch Aktualisierungen der Taxonomiebegriffe des Beitrags.
//Set up the taxonomy object and get terms $taxonomy = 'mytaxonomy'; $tax = get_taxonomy($taxonomy);//This is the taxonomy object //The name of the form $name = 'tax_input[' . $taxonomy . ']'; //Get all the terms for this taxonomy $terms = get_terms($taxonomy,array('hide_empty' => 0));
Wir benötigen die ID der aktuellen Laufzeit des Beitrags (wir erwarten nur eine).
$postterms = get_the_terms( $post->ID,$taxonomy ); $current = ($postterms ? array_pop($postterms) : false); $current = ($current ? $current->term_id : 0);
Wenn Sie sich das Kategorien-Metafeld in WordPress ansehen, werden Sie feststellen, dass auf einer Registerkarte die „am häufigsten verwendeten“ Begriffe angezeigt werden. Um dies nachzubilden, benötigen wir die 10 beliebtesten Begriffe. Wir verwenden erneut die get_terms
-Funktion, wählen dieses Mal jedoch bis zu 10 Begriffe aus und sortieren nach Anzahl (Anzahl der Beiträge mit dieser Klassifizierung).
$popular = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );
Als nächstes möchten wir die Registerkarten „Alle Kategorien“ und „Am häufigsten verwendet“ anzeigen (es empfiehlt sich, wann immer möglich Kategorie-Tags zu verwenden). Wenn Sie keine Tabs benötigen, können Sie dieses Bit einfach entfernen:
<!-- Display tabs--> <ul id="<?php echo $taxonomy; ?>-tabs" class="category-tabs"> <li class="tabs"><a href="#<?php echo $taxonomy; ?>-all" tabindex="3"><?php echo $tax->labels->all_items; ?></a></li> <li class="hide-if-no-js"><a href="#<?php echo $taxonomy; ?>-pop" tabindex="3"><?php _e( 'Most Used' ); ?></a></li> </ul>
Als nächstes möchten wir festlegen, was auf der Registerkarte „Alle Kategorien“ angezeigt wird:
<!-- Display taxonomy terms --> <div id="<?php echo $taxonomy; ?>-all" class="tabs-panel"> <ul id="<?php echo $taxonomy; ?>checklist" class="list:<?php echo $taxonomy?> categorychecklist form-no-clear"> <?php foreach($terms as $term){ $id = $taxonomy.'-'.$term->term_id; echo "<li id='$id'><label class='selectit'>"; echo "<input type='radio' id='in-$id' name='{$name}'".checked($current,$term->term_id,false)."value='$term->term_id' />$term->name<br />"; echo "</label></li>"; }?> </ul> </div>
Dies zeigt im Wesentlichen nur eine Liste innerhalb eines div-Elements an, wobei jedes Listenelement eine Radiooption ist. Natürlich können Sie diese Liste auch einfach durch ein Dropdown-Menü oder etwas anderes ersetzen, das Ihnen gefällt.
Jetzt machen wir dasselbe mit der Registerkarte „Am häufigsten verwendet“:
<!-- Display popular taxonomy terms --> <div id="<?php echo $taxonomy; ?>-pop" class="tabs-panel" style="display: none;"> <ul id="<?php echo $taxonomy; ?>checklist-pop" class="categorychecklist form-no-clear" > <?php foreach($popular as $term){ $id = 'popular-'.$taxonomy.'-'.$term->term_id; echo "<li id='$id'><label class='selectit'>"; echo "<input type='radio' id='in-$id'".checked($current,$term->term_id,false)."value='$term->term_id' />$term->name<br />"; echo "</label></li>"; }?> </ul> </div>
将其拼凑在一起,我们的完整功能是
//Callback to set up the metabox function myprefix_mytaxonomy_metabox( $post ) { //Get taxonomy and terms $taxonomy = 'mytaxonomy'; //Set up the taxonomy object and get terms $tax = get_taxonomy($taxonomy); $terms = get_terms($taxonomy,array('hide_empty' => 0)); //Name of the form $name = 'tax_input[' . $taxonomy . ']'; //Get current and popular terms $popular = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) ); $postterms = get_the_terms( $post->ID,$taxonomy ); $current = ($postterms ? array_pop($postterms) : false); $current = ($current ? $current->term_id : 0); ?> <div id="taxonomy-<?php echo $taxonomy; ?>" class="categorydiv"> <!-- Display tabs--> <ul id="<?php echo $taxonomy; ?>-tabs" class="category-tabs"> <li class="tabs"><a href="#<?php echo $taxonomy; ?>-all" tabindex="3"><?php echo $tax->labels->all_items; ?></a></li> <li class="hide-if-no-js"><a href="#<?php echo $taxonomy; ?>-pop" tabindex="3"><?php _e( 'Most Used' ); ?></a></li> </ul> <!-- Display taxonomy terms --> <div id="<?php echo $taxonomy; ?>-all" class="tabs-panel"> <ul id="<?php echo $taxonomy; ?>checklist" class="list:<?php echo $taxonomy?> categorychecklist form-no-clear"> <?php foreach($terms as $term){ $id = $taxonomy.'-'.$term->term_id; echo "<li id='$id'><label class='selectit'>"; echo "<input type='radio' id='in-$id' name='{$name}'".checked($current,$term->term_id,false)."value='$term->term_id' />$term->name<br />"; echo "</label></li>"; }?> </ul> </div> <!-- Display popular taxonomy terms --> <div id="<?php echo $taxonomy; ?>-pop" class="tabs-panel" style="display: none;"> <ul id="<?php echo $taxonomy; ?>checklist-pop" class="categorychecklist form-no-clear" > <?php foreach($popular as $term){ $id = 'popular-'.$taxonomy.'-'.$term->term_id; echo "<li id='$id'><label class='selectit'>"; echo "<input type='radio' id='in-$id'".checked($current,$term->term_id,false)."value='$term->term_id' />$term->name<br />"; echo "</label></li>"; }?> </ul> </div> </div> <?php }
我在回调函数中对 ID 和单选按钮的命名非常谨慎。如果您现在尝试上述所有操作,您会发现 WordPress 会自动处理帖子术语的更新。此外,WordPress 的 javascript 自动处理选项卡导航。有一个轻微的问题。 “所有类别”单选按钮与“最常用的”单选按钮不同步。如果您决定放弃“最常用”选项卡,那么您可以忽略此部分。否则,我们只需要添加一点点 JavaScript 就可以解决这个问题。
我们想要向页面添加一些 javascript,因此在回调函数中,我们将使用一个钩子,当在管理中添加 javascript 时会触发该钩子。即 admin_enqueue_scripts
挂钩。由于我们将函数添加到回调函数内的此钩子上,因此仅在需要时才加载它。只需在上面的回调函数顶部添加这一行:
add_action('admin_enqueue_scripts','myprefix_radiotax_javascript');
当管理页面加载 JavaScript 时,这将触发我们的函数。这个函数只不过是注册我们的 javascript 并将其排入队列,我们希望将其加载到页脚中:
function myprefix_radiotax_javascript(){ wp_register_script( 'radiotax', get_template_directory_uri() . '/js/radiotax.js', array('jquery'), null, true ); // We specify true here to tell WordPress this script needs to be loaded in the footer wp_enqueue_script( 'radiotax' ); }
现在对于我们实际需要的 javascript,在主题的 js
文件夹中创建一个文件。我们将其命名为 radiotax.js
,下面是要放入其中的代码:
jQuery(document).ready(function($) { var taxonomy = 'mytaxonomy'; $('#' + taxonomy + 'checklist li :radio, #' + taxonomy + 'checklist-pop :radio').live( 'click', function(){ var t = $(this), c = t.is(':checked'), id = t.val(); $('#' + taxonomy + 'checklist li :radio, #' + taxonomy + 'checklist-pop :radio').prop('checked',false); $('#in-' + taxonomy + '-' + id + ', #in-popular-' + taxonomy + '-' + id).prop( 'checked', c ); }); });
那么这几行代码有什么作用呢?每当您选中一个单选按钮时,它都会取消选中所有其他单选按钮(在两个选项卡上),然后检查与该术语相对应的单选按钮。
这样我们就完成了。 WordPress 为我们处理剩下的所有事情。不过还有改进的空间...添加新术语怎么样?我已经从我们的元框中省略了这一点,因为它实际上非常棘手。它将涉及更多的 JavaScript 以及服务器端的一些操作。
根据 Roberto 的要求,这里是 GitHub 上完整代码的链接。它是本教程中使用的代码的类实现,因此开始时您只需要更改顶部的类的静态变量。
Das obige ist der detaillierte Inhalt vonVerwendung von Taxonomien zur Implementierung von Optionsfeldern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!