1

I'm a WordPress rookie. I've added a custom field to my "Category" taxonomy. The custom field is "custom_order" and its purpose is to hold a number so that my categories can be sorted and displayed in the order I choose.

My problem is that I can't get them to sort; I can display the categories, and 'echo' each category's "custom_order" number, but I must be missing something when it comes to accessing and sorting the meta_value.

Not sure if I'm going about this the right way either.

Here is my code to add the field to the 'New Category' page:

<?php
function taxonomy_add_new_meta_field() 
{ ?>
<div class="form-field">
    <label for="term_meta[custom_order]">Order</label>
    <input type="number" name="term_meta[custom_order]" id="term_meta[custom_order]" value="">
    <p class="description">Enter an order number for organizational purposes</p>
</div>
<?php
}

add_action( 'category_add_form_fields', 'taxonomy_add_new_meta_field', 10, 2 );
?>

Here is my code to add the field to the 'Edit Category' page:

<?php
function taxonomy_edit_meta_field($term) {

$t_id = $term->term_id;

$term_meta = get_option( "taxonomy_$t_id" ); ?>
<tr class="form-field">
    <th scope="row" valign="top"><label for="term_meta[custom_order]">Order</label></th>
    <td>
        <input type="number" name="term_meta[custom_order]" id="term_meta[custom_order]" value="<?php                 echo esc_attr( $term_meta['custom_order'] ) ? esc_attr(     $term_meta['custom_order'] ) : ''; ?>">
        <p class="description">Enter an order number for organizational purposes</p>
    </td>
</tr>
<?php
}
add_action( 'category_edit_form_fields', 'taxonomy_edit_meta_field', 10, 2);
?>

Here is my code to save the contents of the field:

<?php

function save_taxonomy_custom_meta( $term_id ) {
if ( isset( $_POST['term_meta'] ) ) {
    $t_id = $term_id;
    $term_meta = get_option( "taxonomy_$t_id" );
    $cat_keys = array_keys( $_POST['term_meta'] );
    foreach ( $cat_keys as $key) {
        if ( isset ( $_POST['term_meta'][$key] ) ) {
            $term_meta[$key] = $_POST['term_meta'][$key];
                    }
                }
                update_option( "taxonomy_$t_id", $term_meta );
        }
}

add_action( 'edited_category', 'save_taxonomy_custom_meta', 10, 2 );
add_action( 'create_category', 'save_taxonomy_custom_meta', 10, 2 );

The above snippets of code I got from this website:

http://pippinsplugins.com/adding-custom-meta-fields-to-taxonomies/

Last but not least here is my attempt to sort my categories based on this field:

$args = array(
'parent' => $category->cat_ID,
'hide_empty'=>0,
'exclude'=>'1',
'meta_key'=>'custom_order',
'orderby'=>'meta_value_num',
'order'=>'ASC'
);
$subcategories = get_categories($args);

I then iterate through the $subcategories array with a foreach() loop. I thought I had it working until I added a third sub-category; I now see that it puts 'custom_order' 1 first, 'custom_order' 3 second, and 'custom_order' 2 third.

Can anybody lend me a hand?

4
  • you're not going to be able to get the correct order from get_categories, the API knows nothing of your custom meta implementation. you'll have to get all the categories and order them yourself in php.
    – Milo
    Apr 1, 2014 at 23:59
  • Ok I figured that may be the case. Thank you Milo!
    – jon
    Apr 2, 2014 at 1:48
  • Hello @jon, I also want to implement same. Have you find solution for categories order, please share here? Nov 9, 2016 at 9:36
  • 2
    Possible duplicate of Sort category page with custom field
    – T.Todua
    Jan 5, 2017 at 20:54

2 Answers 2

0

I would edit the SQL database directly, changing category IDs based on my desired order. Then I would use 'orderby'=>'id' to sort.

You could also add an integer to the slug (i.e., 1-fish, 2-chips, 3-dips, etc.) and order by slug, but those would appear on the front end.

0
0

Some example workarounds (may need a bit modification):

1st way:

$arguments= array('parent' => $categoryID);
$categories = get_categories( $arguments );

$subcategories=array();
foreach($categories as $each=>$value){
    $subcategories[$value->CUSTOM_FIELD_NAME] = $value;
}

asort($subcategories);
foreach($subcategories as $each=>$value){
    //do what you want here
}   

2nd way:

$args = array(
    'parent' => $category->cat_ID,
    'hide_empty'=>0,
    'exclude'=>'1',
    'meta_key'=>'custom_order',
    'orderby'=>'meta_value_num',
    'order'=>'ASC'
);
$subcategories = get_categories($args);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.