[wp-trac] [WordPress Trac] #33369: Cannot intelligently target using the `get_terms_args` filter
WordPress Trac
noreply at wordpress.org
Fri Aug 14 01:47:51 UTC 2015
#33369: Cannot intelligently target using the `get_terms_args` filter
-----------------------------------+------------------------------
Reporter: johnjamesjacoby | Owner:
Type: feature request | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Taxonomy | Version: 2.2
Severity: normal | Resolution:
Keywords: has-patch 2nd-opinion | Focuses:
-----------------------------------+------------------------------
Comment (by johnjamesjacoby):
> It could be argued that a function using defaults should return the same
result when the argument was explicit and equal to the default, as when
(deliberately) omitted. My trust in the documentation of a function would
be damaged if I found this not to be true.
If I understand you correctly, I don't think this is true. See
`get_tags()` for a (maybe poor) example of this:
{{{
$r = apply_filters( 'get_media_item_args', $args );
}}}
> In other words, I think `get_terms( 'mytax', array( 'orderby' => 'name'
) )` and `get_terms( 'mytax' )` should return the same results when called
in the same context, regardless of any filter.
I disagree. The reason filters exist is to allow for overriding the
environment and it's relative variables.
> That is why I'm not sure that filters really should be informed on how
the arguments was given, only their value after merging with defaults. The
way WordPress uses `wp_parse_args()` resembles that of PHP when using
optional arguments.
I understand. And I am positive that most of WordPress core operates this
way.
> Do you have a use case where this "knowledge" is the only way to do what
you want?
See above. In this case, which might be unique, there is a default
`orderby` of `name` in the defaults, which gets transferred to `$args` if
none are passed. That funnels into the `get_terms_orderby` filter, which
includes the query clause and the `$args` array, but `orderby` is never
empty unless it's explicitly passed as such, so it's not possible to
conditionally filter it.
> Are there any other filters in core that reveals the arguments as given
before defaulting?
`get_media_item_args` and `wp_link_pages_args` are the two that I found at
a cursory. FWIW, most of BuddyPress's & bbPress's template tags works this
way, to allow JIT manipulating of return values based on both the merged
arguments and the original ones. Basically, the more relevant data that's
passed into a filter is the more useful it is.
----
One other way to maybe approach this would be to remove all references to
`'orderby' => 'name'` from relative `get_terms()` usages, or remove the
default `t.name` (if `orderby` somehow ends up empty) with some uniquely
filterable value.
Ultimately, there's no way to know if `t.name` was the intended query
argument passed into the function, or the default fallback because no
`orderby` argument was passed. Which is also to say, there's no way to
override `t.name` without accidentally doing it almost everywhere all the
time.
--
Ticket URL: <https://core.trac.wordpress.org/ticket/33369#comment:4>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list