-
-
Save Genyus/f9b53cf3f10996b99e1aaf3fa94fb090 to your computer and use it in GitHub Desktop.
/** | |
* Fixes landing page 404 when non-standard permalinks are enabled. | |
* | |
* @param \WP_Query $query | |
*/ | |
function elementor_pre_get_posts( \WP_Query $query ) { | |
if ( | |
// If the post type includes the Elementor landing page CPT. | |
class_exists( '\Elementor\Modules\LandingPages\Module' ) | |
&& is_array( $query->get( 'post_type' ) ) | |
&& in_array( \Elementor\Modules\LandingPages\Module::CPT, $query->get( 'post_type' ), true ) | |
// If custom permalinks are enabled. | |
&& '' !== get_option( 'permalink_structure' ) | |
// If the query is for a front-end page. | |
&& ( ! is_admin() || wp_doing_ajax() ) | |
&& $query->is_main_query() | |
// If the query is for a page. | |
&& isset( $query->query['page'] ) | |
// If the query is not for a static home/blog page. | |
&& ! is_home() | |
// If the page name has been set and is not for a path. | |
&& ! empty( $query->query['pagename'] ) | |
&& false === strpos( $query->query['pagename'], '/' ) | |
// If the name has not already been set. | |
&& empty( $query->query['name'] ) ) { | |
$query->set( 'name', $query->query['pagename'] ); | |
} | |
} | |
add_action( 'pre_get_posts', 'elementor_pre_get_posts', 100 ); |
@gbaumbach Apologies for the late response, but I finally had a chance to look into your issue.
As your permalink structure includes the /blog/
prefix, then requesting a root path URL like /my-landing-page
triggers a query looking for a page or attachment matching that slug, which of course doesn't exist and thus returns a 404. This query is executed before the pre_get_posts
action fires and I couldn't see any filters that would allow it to be modified.
As far as I can tell, this behaviour isn't the result of any bug, it's just how WP parses URLs. If you need to access a landing page at the root, you'll have to add a custom rewrite rule to redirect requests for your landing page(s) to the correct underlying URL.
HTH
Thanks for the response--it seems like Elementor is phasing these out. I ended up just creating a custom post-type for landing pages and was able to maneuver around the /blog issue. Thanks again!
@gbaumbach your answer led me to this video. it is the implementation of the custom post-type. i believe it is a nice workaround.
https://youtu.be/NYKhybukUEc?si=MaPPlAeR_7Rr0rDX
Cool! Yeah, this worked for us, good share @krishnadiamesso
It doesn't seem to be working with Polylang plugin & translations
Not sure if anyone else is still having this issue but I got the following to work:
Step 1 - return to standard URL structure
Step 2 - add the following to functions.php - this is for /blog/ to be added before posts only - based on this post: https://wordpress.stackexchange.com/questions/300806/custom-permalink-for-post-only-not-custom-post-types
// Elementor Landing Page Custom URL Structure Fix
/**
- Add new rewrite rule
/
function create_new_url_querystring() {
add_rewrite_rule(
'blog/([^/])$',
'index.php?name=$matches[1]',
'top'
);
add_rewrite_tag('%recipes%','([^/]*)');
}
add_action('init', 'create_new_url_querystring', 999 );
/**
- Modify post link
- This will print /blog/post-name instead of /post-name
*/
function append_query_string( $url, $post, $leavename ) {
if ( $post->post_type == 'post' ) {
$url = home_url( user_trailingslashit( "blog/$post->post_name" ) );
}
return $url;
}
add_filter( 'post_link', 'append_query_string', 10, 3 );
/**
- Redirect all posts to new url
- If you get error 'Too many redirects' or 'Redirect loop', then delete everything below
*/
function redirect_old_urls() {
if ( is_singular('post') ) {
global $post;
if ( strpos( $_SERVER['REQUEST_URI'], '/blog/') === false) {
wp_redirect( home_url( user_trailingslashit( "blog/$post->post_name" ) ), 301 );
exit();
}
}
}
add_filter( 'template_redirect', 'redirect_old_urls' );
Nice one, this sorted the problem for me. Thanks a lot!