Je veux commander mes catégories comme je commande mes pages. J'ai ajouté un champ supplémentaire appelé Order à ma taxonomie, mais comment puis-je commander mes termes en fonction de cette valeur?
Ajouter et sauvegarder la valeur de ma commande:
/** Add New Field To Category **/
function extra_category_fields( $tag ) {
$t_id = $tag->term_id;
$cat_meta = get_option( "category_$t_id" );
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="meta-order"><?php _e('Category Order'); ?></label></th>
<td>
<div id="catOrder">
<input type="text" name="cat_meta[order]" size="3" style="width:5%;" value="<?php echo (isset($cat_meta['order'])) ? $cat_meta['order'] : '0'; ?>" />
</div>
<span class="description"><?php _e('Categories are ordered Smallest to Largest'); ?></span>
</td>
</tr>
<?php
}
add_action('protax_edit_form_fields','extra_category_fields');
/** Save Category Meta **/
function save_extra_category_fileds( $term_id ) {
if ( isset( $_POST['cat_meta'] ) ) {
$t_id = $term_id;
$cat_meta = get_option( "category_$t_id");
$cat_keys = array_keys($_POST['cat_meta']);
foreach ($cat_keys as $key){
if (isset($_POST['cat_meta'][$key])){
$cat_meta[$key] = $_POST['cat_meta'][$key];
}
}
//save the option array
update_option( "category_$t_id", strip_tags($cat_meta) );
}
}
add_action ( 'edited_protax', 'save_extra_category_fileds');
Normalement, je pourrais récupérer cette valeur telle que:
$categories = get_categories(array('taxonomy' => 'protax'));
foreach($categories as $cat){
$tmp = get_option('category_'.$cat->cat_ID);
echo $tmp['order'];
}
Est-il possible de commander par cette valeur personnalisée? Existe-t-il un meilleur moyen de classer manuellement mes catégories?
SOLUTION - Mise à jour: 03/03/2015 - Merci à /u/G.M.
Le texte ci-dessous ajoute un nouveau champ à la page d'édition des termes et enregistre la valeur dans le champ term_group
non utilisé (pour le moment en tout cas), qui peut ensuite être utilisé pour commander des termes. Dans les crochets ci-dessous (actions), vous devrez remplacer TAXONOMY_SLUG
par votre slug de taxonomie réelle.
/**
* Append Fields To Term Edit Page
* @param Term Object $term
* @param string $taxonomy
*/
function term_order_field( $term, $taxonomy ) {
?>
<tr class="form-field">
<th scope="row" valign="top">
<label for="meta-order"><?php _e( 'Category Order' ); ?></label>
</th>
<td>
<input type="text" name="_term_order" size="3" style="width:5%;" value="<?php echo ( ! empty( $term->term_group ) ) ? $term->term_group : '0'; ?>" />
<span class="description"><?php _e( 'Categories are ordered Smallest to Largest' ); ?></span>
</td>
</tr>
<?php
}
add_action( 'TAXONOMY_SLUG_edit_form_fields', 'term_order_field', 10, 2 );
/**
* Save Term Order
* @param int $term_id
*/
function save_term_order( $term_id ) {
global $wpdb;
if( isset( $_POST['_term_order'] ) ) {
$wpdb->update(
$wpdb->terms,
array(
'term_group' => $_POST['_term_order']
),
array(
'term_id' => $term_id
)
);
}
} // END Function
add_action( 'edited_TAXONOMY_SLUG', 'save_term_order' );
Ajouter une cellule d'ordre de terme à la liste de termes
/**
* Add Column To Show 'Term Order' Field
* @param array $columns
* @return array $columns
*/
function term_order_header( $columns ) {
$columns['order'] = '<center>Order</center>';
return $columns;
}
add_filter( 'manage_edit-TAXONOMY_SLUG_columns', 'term_order_header' );
/**
* Give 'Term Order' Column A Value `term_group`
* @param string $empty
* @param string $col_name
* @param int $term_id
* @return string
*/
function term_order_header_val( $empty = '', $col_name, $term_id ) {
if( isset( $_GET['taxonomy'] ) && 'order' == $col_name ) {
$term = get_term( $term_id, $_GET['taxonomy'] );
return "<center>{$term->term_group}</center>";
} else {
return '0';
}
}
add_filter( 'manage_TAXONOMY_SLUG_custom_column', 'term_order_header_val', 10, 3 );
Documentation crochet
{$taxonomy}_edit_form_fields
edited_{$taxonomy}
manage_{$screen->id}_columns
manage_{$this->screen->taxonomy}_custom_column
Vous trouverez ci-dessous une solution obsolète qui fonctionne mieux si vous souhaitez enregistrer plusieurs méta-valeurs. Si vous avez seulement besoin de sauvegarder une commande à terme, la solution ci-dessus est la meilleure.
/** Add New Field To Category **/
function extra_category_fields( $tag ) {
$t_id = $tag->term_id;
$cat_meta = get_option( "category_$t_id" );
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="meta-order"><?php _e('Category Order'); ?></label></th>
<td>
<div id="catOrder">
<input type="text" name="cat_meta[order]" size="3" style="width:5%;" value="<?php echo (isset($cat_meta['order'])) ? $cat_meta['order'] : '0'; ?>" />
</div>
<span class="description"><?php _e('Categories are ordered Smallest to Largest'); ?></span>
</td>
</tr>
<?php
}
add_action('protax_edit_form_fields','extra_category_fields');
/** Save Category Meta **/
function save_extra_category_fileds( $term_id ) {
global $wpdb;
if ( isset( $_POST['cat_meta'] ) ) {
$t_id = $term_id;
$cat_meta = get_option( "category_$t_id");
$cat_keys = array_keys($_POST['cat_meta']);
foreach ($cat_keys as $key){
if (isset($_POST['cat_meta'][$key])){
$cat_meta[$key] = $_POST['cat_meta'][$key];
}
}
update_option( "category_$t_id", $cat_meta );
$wpdb->update($wpdb->terms, array('term_group' => $cat_meta['order']), array('term_id'=>$term_id));
}
}
add_action ( 'edited_protax', 'save_extra_category_fileds');
L'appelant:
$procats = get_categories(array('taxonomy' => 'protax', 'hide_empty' => 0, 'orderby' => 'term_group'));
Edit - Vous pouvez également les commander dans le panneau d'administration en utilisant ce filtre:
function change_term_order( $orderby, $args, $taxonomies ) {
if ( is_admin() && 'protax' !== $taxonomies[0] )
return $orderby;
$orderby = 'term_group';
$args['order'] = 'ASC';
return $orderby;
}
add_filter( 'get_terms_orderby', 'change_term_order', 10, 3 );
Et ça:
$terms_hearing = merge_tax_and_custom_field(
get_terms([
'taxonomy' => 'hearing',
'hide_empty' => false,
]),
'abbr'
);
sort_tax_by_custom_field($terms_hearing, 'abbr');
// function will allow to merge taxonomy result with custom taxonomy terms
function merge_tax_and_custom_field($terms, $field)
{
// merge custom field into original taxonomy object
foreach ($terms as $index => $term) {
// grabbing custom field data
$data = get_option('taxonomy_term_' . $term->term_id)[$field];
// adding data field into term object as property
$terms[$index]->{$field} = $data;
}
return $terms;
}
// sort field by custom field value
function sort_tax_by_custom_field($terms, $field)
{
usort($terms, function ($a, $b) {
return strcmp($a->abbr, $b->abbr);
});
return $terms;
}