حل مشکل URL دسته بندی و زیر دسته بندی در وردپرس
برای اولین بار توسط من محسن هوشمند این مشکل حل شد؛ که سال ها من با این مشکل روبرو بودم، و تونستم چند سال پیش این رو حل کنم. و امروز این مقاله رو مینویسم و این کد هایی که برنامه نویسی کردم رو به اشتراک بزارم.
راه حل مشکل URL هایی که زیر دسته بندی در وردپرس دارند؟
وردپرس یک ساختار دسته بندی انعطاف پذیر و سلسله مراتبی را امکان پذیر میکند و دستههای تودرتو را قادر میسازد تا محتوا را به طور موثر دسته بندی کنید. با این حال، مدیریت نادرست این URL های دسته بندی و زیردسته ها میتواند منجر به مشکلات SEO شوید. مسیرهای دسته بندی و زیر دسته بندی وجود دارند مه نباید آن دسته ها بوجود بیاد، یا بدتر از آن، ممکن است محتوا را بدون رعایت ساختار مورد انتظار ارائه کنند و باعث ایجاد محتوای تکراری و سردرگمی برای موتورهای جستجو شود.
حل مشکل URL دسته بندی و زیر دسته بندی در وردپرس
برای مثال؛ دسته و زیر دسته بندی هایی دارم مثل زیر:
https://hexella.com/category/digital-marketing/
https://hexella.com/category/digital-marketing/seo/
اگر من مسیر زیر دسته رو که از URL کلمه digital-marketing/ حذف کنم زیر دسته من میشه مثل URL پایین:
https://hexella.com/category/seo/
و این صفحه رل کنونیکال اینه در اصل https://hexella.com/category/digital-marketing/seo/ و چرا باید من دسته اصلی رو اگر حذف کردم از URL چرا این صفحه زیر هم وجود داشته باشه
https://hexella.com/category/seo/
اینجاست که به مشکل خواهید خود و کسی از سایت شما بدش بیاد خیلی راحت با زدن لینک هایی روی URL نادرست صفحه نادرست ایندکس خواد شد.
راحل اینه وقتی URL درست اینه:
https://hexella.com/category/digital-marketing/seo/
و اگر کسی این URL رو نغییر داد و اینطوری شد:
https://hexella.com/category/seo/
به صورت اتوماتیک URl بالا ریدایرکت بشه به یوآرال URL درست زیر:
https://hexella.com/category/digital-marketing/seo/
مشکل دوم هم بین دسته و زیر دسته ها میتوان متن الکی نوشت و صفحه وجود دارد.
من اومدم مشکل دوم هم حل کردم. وقتی url اصلی در زیر اینه:
https://hexella.com/category/digital-marketing/seo/
و کسی بیاد بین url دسته و زیر دسته مثل url زیر متن الکی بنویسه و صفحه هم وجود داره. و این میشه صفحات کپی البته رک کنونیکال به url اصلی اشاره میکنه ولی چرا باید همچین url های ایجاد بشه.
https://hexella.com/category/digital-marketing/mohsen/seo
و باید url بالا مه نادرست است ریدایرکت بشه به url که درسته.
راه حل در کد زیر برای وردپرس نوشتم؛ و میتوانید در فایل Functions قالبتون بزارید:
<?php
/*
Plugin Name: WP & WooCommerce Category URL Fixer
Description: Ensures proper hierarchical category structure in WordPress and WooCommerce URLs, returning 404 for invalid category paths and redirecting to canonical URLs.
Author: Mohsen Hooshmand
Version: 1.2.2
Author URI: https://hexella.com/
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* Check if WooCommerce is active.
*
* @return bool
*/
function hexella_is_woocommerce_active() {
return class_exists( 'WooCommerce' );
}
/**
* Ensure valid hierarchical structure for both WordPress and WooCommerce categories.
* Shows a 404 page for invalid paths without redirecting.
*/
function hexella_enforce_category_hierarchy_404() {
if ( is_admin() || ! is_main_query() ) {
return; // Only process on front-end pages.
}
global $wp_query;
// Handle both WordPress and WooCommerce categories
if ( is_category() || ( hexella_is_woocommerce_active() && is_product_category() ) ) {
$taxonomy = is_category() ? 'category' : 'product_cat';
$query_var = $taxonomy === 'category' ? 'category_name' : 'product_cat';
$queried_object = get_queried_object();
if ( ! $queried_object || $queried_object->taxonomy !== $taxonomy ) {
return; // Ensure we are working with the correct taxonomy.
}
// Get the current category slug and path.
$current_path = trim( get_query_var( $query_var ), '/' );
if ( empty( $current_path ) ) {
return; // Avoid issues when no category is queried.
}
$slugs = explode( '/', $current_path );
// Validate each part of the hierarchy.
$valid = true;
$parent_id = 0; // Start with no parent.
foreach ( $slugs as $slug ) {
$term = get_term_by( 'slug', $slug, $taxonomy );
if ( ! $term || ( $term->parent !== $parent_id && $parent_id !== 0 ) ) {
$valid = false;
break;
}
$parent_id = $term->term_id; // Update parent ID for the next level.
}
// If the hierarchy is invalid, set a 404.
if ( ! $valid ) {
$wp_query->set_404();
status_header( 404 );
nocache_headers(); // Ensure no caching for the 404 page.
// Load the 404 template and stop further execution.
include get_query_template( '404' );
exit;
}
}
}
add_action( 'template_redirect', 'hexella_enforce_category_hierarchy_404' );
/**
* Redirect invalid category URLs to the correct canonical URL.
*/
function hexella_redirect_invalid_category_url() {
if ( is_admin() || ! is_main_query() ) {
return; // Only process on front-end pages.
}
// Detect pagination pages
$paged = get_query_var( 'paged' );
$is_paginated = $paged > 1;
if ( is_category() || ( hexella_is_woocommerce_active() && is_product_category() ) ) {
$taxonomy = is_category() ? 'category' : 'product_cat';
$queried_object = get_queried_object();
if ( ! $queried_object || $queried_object->taxonomy !== $taxonomy ) {
return;
}
$canonical_url = get_term_link( $queried_object, $taxonomy );
if ( is_wp_error( $canonical_url ) ) {
return;
}
// Add pagination segment to canonical URL if necessary
if ( $is_paginated ) {
$canonical_url = trailingslashit( $canonical_url ) . 'page/' . $paged . '/';
}
$current_url = home_url( strtok( $_SERVER['REQUEST_URI'], '?' ) );
$original_request = $_SERVER['REQUEST_URI'];
$has_query_string = strpos( $original_request, '?' ) !== false;
// Perform the comparison and redirect if needed
if ( trailingslashit( $current_url ) !== trailingslashit( $canonical_url ) ) {
if ( $has_query_string ) {
$current_base = strtok( $current_url, '?' );
$canonical_base = strtok( $canonical_url, '?' );
if ( trailingslashit( $current_base ) === trailingslashit( $canonical_base ) ) {
return; // Allow the query string; no redirect needed.
}
}
wp_redirect( $canonical_url, 301 );
exit;
}
}
}
add_action( 'template_redirect', 'hexella_redirect_invalid_category_url' );
این کد وردپرس این مشکلات را با اعمال سلسله مراتب دسته بندی معتبر و اطمینان از تغییر مسیرهای مناسب به URL های نامرتبط حل میکند. این مقاله نحوه عملکرد این کد و اینکه چرا برای حفظ یک ساختار دسته بندی تمیز و سئو پسند ضروری است را بررسی میکند.