#31521 closed defect (bug) (fixed)
wp_title if archive of year w/o permalink fires php notice in locale.php
Reported by: | michelwppi | Owned by: | hellofromTonya |
---|---|---|---|
Milestone: | 5.9 | Priority: | normal |
Severity: | normal | Version: | 4.1.1 |
Component: | General | Keywords: | good-first-bug has-patch has-screenshots has-unit-tests commit |
Focuses: | template | Cc: |
Description
PHP Notice : Undefined index: 00 in /Applications/MAMP/htdocs/wp_svn41/wp-includes/locale.php on line 271
The concerned function : $wp_locale->get_month
Permalinks = default like: www.mysite.com/?m=2015
The calling function = wp_title in general-template.php
Here:
// If there's a month if ( is_archive() && !empty($m) ) { $my_year = substr($m, 0, 4); $my_month = $wp_locale->get_month(substr($m, 4, 2)); error_log("here calling..."); $my_day = intval(substr($m, 6, 2)); $title = $my_year . ( $my_month ? $t_sep . $my_month : '') . ( $my_day ? $t_sep . $my_day : '' ); }
This part of function forget that 'm' query_tag can have a length from 4 to 9+ as well defined in query.php - not only month...
if ( $qv['m'] ) { $this->is_date = true; if ( strlen($qv['m']) > 9 ) { $this->is_time = true; } else if ( strlen($qv['m']) > 7 ) { $this->is_day = true; } else if ( strlen($qv['m']) > 5 ) { $this->is_month = true; } else { $this->is_year = true; } }
and $wp_locale->get_month do not like empty string giving '00' index...
Suggestion (raw):
Add test ( strlen($m) >= 5 ) before to call $wp_locale->get_month
like
$my_month = ( strlen($m) >= 5 ) ? $wp_locale->get_month(substr($m, 4, 2)) : "";
Cheers,
M.
Attachments (6)
Change History (28)
#3
@
10 years ago
@DrewAPicture
This issue remains in WP 4.2 because the test of
strlen($m) >=5
is not done in function wp_title line 829 like done in wp_query of wp_query.php.
Cheers
#4
@
7 years ago
- Keywords needs-patch good-first-bug added; reporter-feedback removed
- Milestone changed from Awaiting Review to Future Release
#5
@
7 years ago
Currently looking at this.
To help others, the steps to reproduce:
- set permalinks to plain.
- Add
wp_title
somewhere on your archive page. - Go to
yourdomain.com?m=2017
. - See the error before
wp_title
is output.
#6
@
7 years ago
I was discussing with @herregroen that we could also just move the $wp_locale->get_month( $my_month )
check to the conditional echo. That would minimize the adjustment to the code and solve the issue as well. Like so:
$title = $my_year . ( $my_month ? $t_sep . $wp_locale->get_month( $my_month ) : '' ) . ( $my_day ? $t_sep . $my_day : '' );
#7
@
7 years ago
- Keywords has-patch added; needs-patch removed
Added a patch that cleans up the date parsing by reusing the same WP_Query globals is_time
, is_day
and is_month
to do the checks.
Used an array to implode
to avoid a huge assignment to $title
.
More changes but I think overall more readable code.
#8
@
7 years ago
- Owner set to herregroen
- Status changed from new to assigned
Assigning to mark the good-first-bug
as "claimed".
This ticket was mentioned in Slack in #core by sergey. View the logs.
4 years ago
#10
@
4 years ago
- Milestone changed from Future Release to 5.8
- Owner changed from herregroen to SergeyBiryukov
- Status changed from assigned to reviewing
#11
@
4 years ago
- Keywords has-screenshots added
- Owner changed from SergeyBiryukov to audrasjb
- Status changed from reviewing to accepted
I was able to reproduce the issue and I can confirm the proposed patch solves it. In 31521.3.diff, I just refreshed the patch against trunk.
#12
@
4 years ago
- Owner changed from audrasjb to SergeyBiryukov
- Status changed from accepted to assigned
Reassigning to @SergeyBiryukov for review, sorry I didn't see you were reviewing.
This ticket was mentioned in Slack in #core by antpb. View the logs.
4 years ago
#16
@
4 years ago
- Keywords needs-testing needs-unit-tests added; commit removed
- Milestone changed from 5.8 to 5.9
- Owner changed from antpb to hellofromTonya
In reviewing the patch, noticed it is using substr()
and does not have guarding to check for failed state. In PHP 8, substr()
return type changed for failure from boolean false
to an ''
empty string. This change could have impact on the patch or upstream from it.
Today is 5.8 Beta 1. After discussing with @antpb, decided to punt to 5.9 to give time for deeper review and adding tests.
Reassigning ownership to me to follow-up on the review and tests.
This ticket was mentioned in PR #1861 on WordPress/wordpress-develop by hellofromtonya.
3 years ago
#17
- Keywords has-unit-tests added; needs-unit-tests removed
Adds tests to first validate the bug exists (test fail when the fix is not applied).
Fix:
- Move
substr()
to assign to the variable$my_month
as it can return an empty string. - If a month was found (not an empty string), then pass it to
$wp_locale->get_month()
.
Makes the long concatenated title string multiline for readability.
Trac ticket: https://core.trac.wordpress.org/ticket/31521
#18
@
3 years ago
- Keywords commit added
Hello folks,
I too was able to reproduce the issue and 31521.4.diff resolves it.
I created PR 1861 which:
- adds unit tests (which do fail when the fix is not applied)
- applies the 31521.4.diff fix
- for the
$title
concatenated string: puts each date part on a separate line for improved readability
Marking for commit
. Props to @costdev for the code review.
#19
@
3 years ago
- Keywords needs-testing removed
Removing needs-testing
as @audrasjb tested the original patch (which is used in the PR).
hellofromtonya commented on PR #1861:
3 years ago
#21
Committed via changeset https://core.trac.wordpress.org/changeset/52136.
Hi @michelwppi, are you still experiencing this issue in 4.2?