[wp-trac] [WordPress Trac] #31723: is_page( false ) === true ?
WordPress Trac
noreply at wordpress.org
Mon Mar 23 12:33:44 UTC 2015
#31723: is_page( false ) === true ?
------------------------------------------+----------------------
Reporter: Compute | Owner:
Type: defect (bug) | Status: closed
Priority: normal | Milestone:
Component: Query | Version:
Severity: normal | Resolution: wontfix
Keywords: needs-unit-tests 2nd-opinion | Focuses:
------------------------------------------+----------------------
Changes (by boonebgorges):
* status: new => closed
* resolution: => wontfix
* milestone: Awaiting Review =>
Comment:
> I truely understand if it's a wontfix, I was just wondering WHY this
makes any sense.
In a nutshell: `is_page()` (and `is_author()`, etc) is intended to be used
in two different ways. One is to pass a specific ID or slug: `is_page(
'foo' )`, `is_page( 123 )`. The other is the more general check "is this a
page at all?", where no param is passed: `is_page()`. So the logic of
these functions goes something like this:
* If `parse_query()` has already determined that this is not a page query
at all (https://core.trac.wordpress.org/browser/tags/4.1.1/src/wp-
includes/query.php?marks=1598,1599#L1587), return false early
https://core.trac.wordpress.org/browser/tags/4.1.1/src/wp-
includes/query.php?marks=4339,4340#L4324.
* If `empty( $page )`, we assume that no argumen has been passed to
`is_page()`, and we're simply checking to see whether we're on any sort of
page at all. We already know that we are, after the previous step. So we
return true. https://core.trac.wordpress.org/browser/tags/4.1.1/src/wp-
includes/query.php?marks=4342,4343#L4324
* From this point on, we compare the passed value of `$page` against the
current page.
If we were designing the system from scratch, something like jipmoors's
suggestion would be good. Or even something more explicit, using argument
overloading:
{{{
public function is_page() {
if ( ! func_num_args() ) {
return $this->is_page;
}
$page = func_get_arg( 0 );
// rest of the function
}
}}}
[31723.1.diff] fixes the behavior for `is_page( 0 )` and `is_page( false
)` and `is_page( '' )`, but not for `is_page( null )`. I suppose there's
an argument for privileging `''` and `false`: `get_metadata()` will
generally return an empty string when the requested value is not found,
and `get_option()` generally returns `false`, which means that the bug'll
be fixed for cases where a falsey value is stored in one of these two
places. My `func_num_args()` trick is a broader fix, though I know that in
the past, function argument overloading has been frowned upon (harder to
read and document).
In any of these cases, backward compatibility is a concern. It's very
likely that plugins are counting on `is_page( 0 )` to return the same as
`is_page()`. It's a hard thing to verify, though - I'm not sure how to
search for it.
I'm leaning toward wontfix. As Compute notes, there is an easy workaround,
and you might argue that plugin authors ought to be doing this kind of
validation anyway. If anyone has a powerful practical argument that
wontfix is the wrong way forward here, please feel free to reopen with
details.
--
Ticket URL: <https://core.trac.wordpress.org/ticket/31723#comment:12>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list