#10616 closed defect (bug) (invalid)
post queries are not working with custom permalinks
Reported by: | frumph | Owned by: | |
---|---|---|---|
Milestone: | Priority: | high | |
Severity: | major | Version: | 2.8.4 |
Component: | Template | Keywords: | |
Focuses: | Cc: |
Description
With permalinks off this works:
if (isset($_GET['archive_year'])) { $archive_year = (int)$_GET['archive_year']; }
With Permalinks on:
/%category%/%postname%/
It does not see the posted query, isset shows nothing.
This is what the dashboard - settings - permalinks asked me to put in the .htaccess (i had since made it rw)
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> }} I noticed as well that if I set it using the get_query_var and add the var to the vars list I couldn't get that to work at all with whatever tutorial I was reading.
Attachments (2)
Change History (22)
#3
in reply to:
↑ 1
@
15 years ago
Replying to frumph:
Additional Info, this is my href line:
<a href="<?php echo add_query_arg('archive_year', $year) ?>"><strong><?php echo $year ?></strong></a> |I am using the add_query_arg, remember this does work without permalink /%category%/%postname%/ turned on.
erm turned off I meant, with no permalinks on
#4
follow-up:
↓ 5
@
15 years ago
I figured out how to make it work by doing:
parse_str(preg_replace('#^.*\?#', '', $_SERVER['REQUEST_URI']), $query_vars);
Until it's fixed.
#5
in reply to:
↑ 4
@
15 years ago
Replying to frumph:
parse_str(preg_replace('#^.*\?#', '', $_SERVER['REQUEST_URI']), $query_vars);
I think you're taking a security risk by parsing arbitrary request arguments.
A better way is to use the WordPress rewrite API.
Attach something like the following to the "init" action, and trigger a flush of the rewrite rules (one way to do that is to visit the admin permalinks page).
add_rewrite_rule('^archives-year/(.*)/?$', 'index.php?archive_year=$matches[1]', 'top'); add_rewrite_tag('%archive_year%', '(.*)');
The first line prepares the rewrite rule so it will be added to the rules after the flush. The second makes WP and WP_Query aware that archive_year is a query argument.
Depending on what you're trying to do, the existing "year" query variable might be sufficient instead of the custom "archive_year". In that case, you could just do
add_rewrite_rule('^archives-year/(.*)/?$', 'index.php?year=$matches[1]', 'top');
I suggest this be marked as "won't fix," as we shouldn't be querying based on arbitrary request arguments, and the desired results can be obtained with the existing API.
#6
follow-up:
↓ 7
@
15 years ago
I think you're missing the point that a $_GET works with permalinks off, but doesnt with permalinks on.
#7
in reply to:
↑ 6
@
15 years ago
Replying to frumph:
I think you're missing the point that a $_GET works with permalinks off, but doesnt with permalinks on.
I can't reproduce that.
If I request something like
http://mysite.com/category-slug/post-slug/?archive_year=2009
And then put in index.php of the theme:
if (isset($_GET['archive_year'])) { $archive_year = (int)$_GET['archive_year']; print_r("the year is $archive_year"); }
It prints "the year is 2009". What are you doing differently?
#8
@
15 years ago
What is the result of using this: ?
<?php echo add_query_arg('archive_year', $year) ?>
I think you're attempting to use core function in a way it wasnt designed to be used, Either that, Or you've overriden something incorrectly.
Can you post the -exact- steps to reproduce with the default theme and no plugins? I want code i can cut and paste and reproduce it.
#9
@
15 years ago
Templates Attached.
http://myextralife.com/ is the website currently using 2.8 and it doesnt work on it.
http://mofcomic.com/ is a website using 2.8 and it does work on it.
http://myextralife.com/ I had all plugins turned off and the plugin directory cleared when testing.
- var_dumped $GLOBALS * var_dumped $wp->query_vars -- nada
- $archive_year = $GLOBALSarchive_year?; wasn't there cause wasnt found in $globals.
Additional note: On the same site myextralife i'm doing a form post with the $_GET and *THAT* works which is also a template. However doing <?php echo add_query_arg('archive_year', $year) ?> does not.
Tried adding a public query_var using:
add_filter('query_vars', 'cp_add_query_vars'); function cp_add_query_vars( $qvars ){ $qvars[] = 'archive_year'; return $qvars; }
ComicPress 2.8 (not released yet) http://comicpress.frumph.net/themes/comicpress-rc2.zip
Additionally it only happens on one out of maybe 4 different sites using the beta. This was functioning just fine before the 2.8ish releases as is found at http://comicpress.org/
You can find me at philip@… or http://webcomicplanet.com/chat/ and I can show you on myextralife.com and put any var_dumps you want to see what' it's doing.
(my extralife.com is currently using my band-aided version)
#11
@
15 years ago
I'm still failing to see the problem..
$GLOBALS['archive_year']
will be empty unless you set it. WordPress has overridden register_globals
for a long time.
Adding it to query_vars
will allow the use of get_query_var('archive_year')
and the use of archive_year in rewrite rules.
var_dump($_GET['archive_year']);
works fine for me in the default themes header.php file.
#12
@
15 years ago
Sorry i missed the attachments you added.
Doesnt changing it from
<?php if (isset($_GET['archive_year'])) { $archive_year = (int)$_GET['archive_year'];
to
<?php global $archive_year; if (isset($_GET['archive_year'])) { $archive_year = (int)$_GET['archive_year'];
help?
#13
@
15 years ago
Setting it as global doesnt help, $archive_year is still empty.
You probably were thinking $archive_year would return the last value it was set but it does not, it's still empty. Why? Because (isset( returns false because it's thinking it's not set even though it's in the query line.
Dont know if this will help but THIS works:
$archive_year = $_REQUEST['archive_year']; echo $archive_year; <form method="post" action=""> <input type="hidden" name="archive_year" value="2001" /> <button type="submit" value="submit" name="submit">Click Me.</button></form>
echo $archive_year will echo out 2001.
However, doing this doesnt work:
$archive_year = $_GET['archive_year']; echo $archive_year; <a href="http://www.domain.com/archive/comics-by-year/?archive_year=2001">2001</a>
$archive_year is "UNSET" if isset returns false if I were to add that.
the href which is:
<a href="<?php echo add_query_arg('archive_year', $year) ?>"><strong><?php echo $year ?></strong></a>
where $year == 2001;
.. Turning Permalinks Off
$archive_year = $_GET['archive_year']; echo $archive_year; <a href="http://www.domain.com/?page_id=12846&archive_year=2001">2001</a>
This works, $archive_year returns 2001
it's when I set the permalinks on it doesnt work on page-templates
tested on all templates that we use, same thing.
#14
follow-up:
↓ 15
@
15 years ago
Tested it in page.php by itself and not being a template. Same thing, anything in the request_uri line disappears and can't be found, so _GET / _REQUEST will not find anything when permalinks are enabled, however works when disabled.
#15
in reply to:
↑ 14
@
15 years ago
Replying to frumph:
Tested it in page.php by itself and not being a template. Same thing, anything in the request_uri line disappears and can't be found, so _GET / _REQUEST will not find anything when permalinks are enabled, however works when disabled.
Can you do the following?
- Create a test page.
- Create a page template named something like
page-test.php
that has the following content:<?php /* Template Name: Test Template */ echo '$_GET:'; var_dump($_GET); echo '$_POST:'; var_dump($_POST); echo '$_REQUEST:'; var_dump($_REQUEST);
- Assign the
page-test.php
template to the page and post the link here.
#17
@
15 years ago
I noticed that your header response says that the server is lighttpd, and in fact one can download that site's .htaccess file, so your server must be using different rewrite rules for the "pretty" permalinks to work at all. Could it be that those lighttpd rules are messing with $_GET settings?
#18
@
15 years ago
@filesofo you bring up a seriously valid point that I did not look at and I appreciate that. Unfortunately I am just the programmer on these individuals sites and will have to contact server administrator to see if he has some server set rewrite rules in effect. Will keep in touch on it.
Documentation on lighthttpd's mod_rewrite:
http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModRewrite
#19
@
15 years ago
- Resolution set to invalid
- Status changed from new to closed
We've decided to go back to using our original $_GET methods in the ComicPress 2.8 release and give documentation on how to make it work with Lighthttpd on the forums for those who need it.
Thanks @filesofo and @dd32 you guys are great. Finding out it indeed was not a wordpress problem, that Lighthttpd's configuration and ModReWrite does not play night with wordpress because of it's different rule convention.
Additional Info, this is my href line:
I am using the add_query_arg, remember this does work without permalink /%category%/%postname%/ turned on.