0

I am trying to get custom term meta value for a certain category using get_term_meta() function. This value is stored in the wp_termmeta table. Then, based on that value, I want to modify the main query for a certain category archive page (sort the posts by date ascending). However, the pre_get_posts() hook that I am using does not allow me to do so. I tried all the ways that i am aware of, however, it is still not working

Here is my code:

function my_new_category_order( $query ) {
    //get the category id
    $cat_id = get_query_var('cat');
    //get the custom meta value
    $post_order = get_term_meta($cat_id, 'post-order', true);
    //The value is shown two times. First, it is false, then it is "oldest"
    var_dump($post_order); 

    //Cannot go inside the if statement because $post_order is false!
    if ( $post_order && $query->is_category($cat_id) && $query->is_main_query() ) {
        $query->set( 'order', 'ASC' );
        //$post_order is false here
        var_dump($post_order);
        //$cat_id is empty string
        var_dump($cat_id);
    }


}
add_action( 'pre_get_posts', 'my_new_category_order' );

As a result, I am not able to go inside the if statement and reorder the posts.. The rest of the code is working fine but the term meta value remains undefined. What am I doing wrong?

  • As you can see, $query is undefined and returns null when accessed. 'edit_category' means a category has been edited, a save operation. You are not querying anything. Altering sort order happens in 'pre_get_posts'. I don't understand what you are trying to do, or may be just trying to do two separate things in one action. Maybe split the two concerns. – Knut Sparhell Sep 29 at 19:38
  • I edited my question and uploaded the modified code. I am now using the pre_get_posts hook. However, it is still not working. I believe it is so, because the query runs before I am able to fetch data from wp_termmeta table.. how can i make it work? Please check my modified question. – Badan Sep 29 at 22:13
  • I don't believe $post_order can change within the scope of a function without being set. Dump $cat_id and is_category and is_main_query too. Also set he query order without a condition to test it. – Knut Sparhell Sep 29 at 22:32
  • Should not be a problem to get meta, any time, anywhere. 'post-order' is correct key, not 'post_order'? - have to ask... – Knut Sparhell Sep 29 at 23:00
  • Yes, the key is post-order. Might be due to the fact that pre_get_posts gets the data before the actual query? – Badan Sep 29 at 23:06
0

I finally, finally figured it out! I was not able to get the category id in the first place. Strangely, get_query_var('cat') is not working. Here is the way that worked for me, in case someone else also struggles with this:

function my_new_category_order( $query ) {
    $category = get_queried_object();
    $cat_id = $category->term_id;
    $post_order = get_term_meta($cat_id, 'post-order', true);
    //Now everything works!
    if ( $post_order =='oldest' && $query->is_category($cat_id) && $query->is_main_query() ) {
        $query->set( 'order', 'ASC' );
    }
}
add_action( 'pre_get_posts', 'my_new_category_order' );

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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