Opened 11 years ago
Last modified 6 years ago
#31957 new defect (bug)
query fails, when post is queried under specific name
| Reported by: |
|
Owned by: | |
|---|---|---|---|
| Milestone: | Priority: | normal | |
| Severity: | normal | Version: | 4.1.1 |
| Component: | Query | Keywords: | |
| Focuses: | Cc: |
Description
i.e., i have custom post type, named "CARS",
and when i have standard category, named "CARS"..
when i publish standard post under "cars" category:
mysite.com/cars/something-name...
worpdress thinks, that it is under custom-post types, and 404 page is displayed..
to fix that, i have made this function:
//example URL: yoursite.com/cars/subcat/TORNADOO
add_action( 'pre_get_posts', 'myf' ); function myf( $query ) {
if ( $query->is_main_query() ) {
//when the PERMALINK was not found, then 404 maybe triggered.. But wait! maybe it is a standard post, under the standard category(which's name is i.e. "cars")
if (!url_to_postid(currentURL__MLSS)){
$link_array=explode('/','/cars/subcat/TORNADOO');
$k=array_filter($link_array); //remove empty values
$k=array_values($k); //reset hierarchy
$all_nmb = count($k);
//if post exists with the found slug("TORNADOO"), lets check, if their parents are categories
$post=get_page_by_path(basename('TORNADOO'), OBJECT, 'post');
if ($post){
for($i=0; $i<$all_nmb-1; $i++){
$cat = get_term_by('slug', $k[$i], 'category');
if(!(in_category($cat->term_id,$post->ID) || post_is_in_descendant_category(array($cat->term_id),$post->ID))){
$failed=true; break;
}
}
if (!$failed){
//new query
$query->init();
$query->parse_query( array('post_type' =>'post') ) ;
//others
$query->is_home = false;
$query->is_single = true;
$query->is_singular = true;
$query->is_page = false;
$query->queried_object_id = $post->ID;
$query->set( 'page_id', $post->ID );
}
}
}
//if page exists with the that link, then query will be made correctly..
//$page=get_page_by_path(...., ..., 'page');
}
if ( ! function_exists( 'post_is_in_descendant_category' ) ) { function post_is_in_descendant_category( $cats, $_post = null ) {
foreach ( (array) $cats as $cat ) { $descendants = get_term_children( (int) $cat, 'category' );
if ( $descendants && in_category( $descendants, $_post ) ) {return true;}
}return false;
}
}
Change History (4)
#1
@
11 years ago
Version 0, edited 11 years ago
by
(next)
#2
@
11 years ago
sorry, same problem for 'pages' ,not only posts.. so, the same custom query is needed---
//PAGE exists... with the found slug("TORNADOO"), lets check if it's a really page..
$page=get_page_by_path('cars/subcat/TORNADOO', OBJECT, 'page');
if ($page){
//new query
$query->init();
$query->parse_query( array('post_type' =>'page') ) ;
//others
$query->is_home = false;
$query->is_single = false;
$query->is_singular = true;
$query->is_page = true;
$query->queried_object_id = $page->ID;
$query->set( 'page_id', $page->ID );
return;
}
This ticket was mentioned in Slack in #core by boone. View the logs.
9 years ago
Note: See
TracTickets for help on using
tickets.
Also, if i access:
yoursite.com/cars/subcat/
then it should not try to find, if a standard category exists under that slug (instead of showing 404, as it think that it's custom post type page)