حل مشکل URL دسته بندی و زیر دسته بندی در وردپرس

برای اولین بار توسط من محسن هوشمند این مشکل حل شد؛ که سال ها من با این مشکل روبرو بودم، و تونستم چند سال پیش این رو حل کنم. و امروز این مقاله رو می‌نویسم و این کد هایی که برنامه نویسی کردم رو به اشتراک بزارم.

دسته‌ها: بلاگ, وردپرس

راه حل مشکل URL هایی که زیر دسته بندی در وردپرس دارند؟

وردپرس یک ساختار دسته بندی انعطاف پذیر و سلسله مراتبی را امکان پذیر می‌کند و دسته‌های تودرتو را قادر می‌سازد تا محتوا را به طور موثر دسته بندی کنید. با این حال، مدیریت نادرست این URL های دسته بندی و زیردسته ها می‌تواند منجر به مشکلات SEO شوید. مسیرهای دسته بندی و زیر دسته بندی وجود دارند مه نباید آن دسته ها بوجود بیاد، یا بدتر از آن، ممکن است محتوا را بدون رعایت ساختار مورد انتظار ارائه کنند و باعث ایجاد محتوای تکراری و سردرگمی برای موتورهای جستجو شود.

حل مشکل URL دسته بندی و زیر دسته بندی در وردپرس هگزلا

حل مشکل 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 های نامرتبط حل می‌کند. این مقاله نحوه عملکرد این کد و اینکه چرا برای حفظ یک ساختار دسته بندی تمیز و سئو پسند ضروری است را بررسی می‌کند.

برچسب ها:
دیدگاهتان را بنویسید
سوال و نظر خود را در مورد این پست بنویسید.

2 + 7 =

0 دیدگاه برای پست "حل مشکل URL دسته بندی و زیر دسته بندی در وردپرس" ارسال شده: