[wp-trac] [WordPress Trac] #40335: using 'pre_get_terms' is confusing when it comes to ordering by meta

WordPress Trac noreply at wordpress.org
Sun Apr 2 09:41:05 UTC 2017


#40335: using 'pre_get_terms' is confusing when it comes to ordering by meta
--------------------------+-----------------------------
 Reporter:  wujek_bogdan  |      Owner:
     Type:  enhancement   |     Status:  new
 Priority:  normal        |  Milestone:  Awaiting Review
Component:  Query         |    Version:  4.7.3
 Severity:  normal        |   Keywords:
  Focuses:                |
--------------------------+-----------------------------
 There's a  `pre_get_terms` hook. One might think that it works in the same
 way how `pre_get_posts` works, but it doesn't.

 I wanted to order terms by a meta field, so I did something like this:

 {{{#!php
 <?php
 add_action('pre_get_terms', function (\WP_Term_Query $query) {

     if ( SOME_CONDITION_HERE ) {
         return;
     }

     $queryVars = $query->query_vars;

     $args = [
         'meta_key' => 'my_meta_key',
         'orderby' => 'meta_value',
         'order' => 'ASC',
     ];

     $query->query_vars = array_merge($queryVars, $args);
 });
 }}}

 And for `pre_get_posts` this technique would work. But with
 `pre_get_terms` it's different.  Digging into `WP_Term_Query` class code I
 found that this code would cause `parse_orderby()` method to set the
 `$maybe_orderby_meta` variable to `true`. But it doesn't mean that terms
 will be sorted by a meta field. It only means that terms '''maybe''' will
 be sorted by meta.

 There's an another filter required. At the end of the `parse_orderby()`
 method there's an another filter applied: `get_terms_orderby`.

 So in order to sort terms by meta field there's one more thing required.
 Something like:

 {{{#!php
 <?php
 add_filter('get_terms_orderby', function ($orderby, $args) {

     if ( SOME_CONDITION_HERE ) {
         return $orderby;
     }

     return 'meta_value';
 }, 10, 2);
 }}}

 This is unintuitive and confusing, and what's the most important: it's not
 documented. The documentation should be very clear about it. Because of
 the filter name, that's very similar to the `pre_get_posts` filter name,
 users might expect it to work in the same way.  It might be even
 considered as a bug. So I'll mark it as a bug, because from the user's
 perspective this is how it looks like.

--
Ticket URL: <https://core.trac.wordpress.org/ticket/40335>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list