it-swarm.asia

إزالة سبيكة من عناوين URL لنشر نوع المنشور المخصص

يبدو أن جميع موارد الويب بناءً على موضوع إزالة سبيكة نوع المنشور المخصصة أي

yourdomain.com/CPT-SLUG/post-name 

هي الآن حلول قديمة جدًا غالبًا ما تشير إلى التثبيت المسبق WP للإصدار 3.5. واحد مشترك هو:

'rewrite'   => array( 'slug' => false, 'with_front' => false ),  

ضمن وظيفة register_post_type الخاصة بك. هذا لم يعد يعمل ومضللة. لذلك أطلب من المجتمع في Q3 2018 على وشك WordPress 5 ...

ما هي الطرق الحديثة والكفؤة لإزالة Slug Post Type من عنوان URL لنشر Post Post مخصص من داخل وسيطة إعادة الكتابة أو أي مكان آخر؟

استكمال: يبدو أن هناك عدة طرق لفرض هذا للعمل مع regex. على وجه التحديد ، يجب أن تكون الإجابة من جان بيك على استعداد دائم لمراقبة إنشاء المحتوى لضمان عدم إنشاء أسماء صفحات/منشورات متعارضة .... ومع ذلك ، فأنا مقتنع بأن هذا يمثل نقطة ضعف كبيرة في WP الأساسية حيث يجب التعامل معها. كلاهما كخيار/ربط عند إنشاء CPT أو مجموعة متقدمة من خيارات الروابط الدائمة. يرجى دعم تذكرة المسار.

الحاشية: يرجى دعم تذكرة التتبع هذه عن طريق مشاهدتها/الترويج لها: https://core.trac.wordpress.org/ticket/34136#ticket

43
Ben Racicot

ستعمل التعليمة البرمجية التالية ، ولكن عليك فقط أن تضع في اعتبارك أن التعارضات يمكن أن تحدث بسهولة إذا كانت سبيكة نوع المنشور المخصص الخاص بك هي نفسها كصفحة الصفحة أو المنشور ...

أولاً ، سنقوم بإزالة سبيكة من الرابط الثابت:

function na_remove_slug( $post_link, $post, $leavename ) {

    if ( 'events' != $post->post_type || 'publish' != $post->post_status ) {
        return $post_link;
    }

    $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

    return $post_link;
}
add_filter( 'post_type_link', 'na_remove_slug', 10, 3 );

مجرد إزالة سبيكة لا يكفي. في الوقت الحالي ، ستحصل على 404 صفحة لأن WordPress لا يتوقع سوى النشرات والصفحات أن تتصرف بهذه الطريقة. ستحتاج أيضًا إلى إضافة ما يلي:

function na_parse_request( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
        return;
    }

    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'events', 'page' ) );
    }
}
add_action( 'pre_get_posts', 'na_parse_request' );

فقط قم بتغيير "الأحداث" إلى نوع المنشور المخصص الخاص بك وأنت على ما يرام. قد تحتاج إلى تحديث الرابط الثابت الخاص بك.

57
Nate Allen

اكتب الكود التالي في تسجيل التصنيف.

'rewrite' => [
  'slug' => '/',
  'with_front' => false
]

أهم شيء عليك القيام به بعد تغيير الكود

بعد أن قمت بتغيير مستند تصنيف نوع المنشور المخصص الخاص بك ، حاول الانتقال إلى الإعدادات> الروابط الدائمة و إعادة حفظ إعداداتك ، وإلا فستجد 404 صفحة غير موجودة.

تحقق هنا للحصول على أفضل حل: http://www.krazzycodes.com/how-to-remove-custom-post-type-taxonomy-base-from-url-in-wordpress/

19
Mayank Dudakiya

حاولت معرفة ذلك منذ وقت ليس ببعيد ، والإجابة المختصرة عما أعرفه هي لا . ليس من داخل وسيطة إعادة الكتابة على الأقل.

يصبح التفسير الطويل واضحًا إذا نظرت إلى الكود الفعلي لـ register_post_type في wp-include/post.php سطر 1454 :

add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );

يمكنك أن ترى البادئات $args->rewrite['slug'] إلى علامة إعادة الكتابة %$post_type%. يمكن للمرء أن يفكر "دعنا نضبط فقط الدرج إلى null ثم" حتى تنظر إلى عدة سطور:

if ( empty( $args->rewrite['slug'] ) )
    $args->rewrite['slug'] = $post_type;

يمكنك أن ترى أن الدالة دائمًا تتوقع قيمة سبيكة غير فارغة وتستخدم نوع المنشور.

12
Jan Beck

رداً على إجابتي السابقة : يمكنك بالطبع تعيين المعلمة rewrite على false عند تسجيل نوع منشور جديد والتعامل مع قواعد إعادة الكتابة بنفسك

<?php
function wpsx203951_custom_init() {

    $post_type = 'event';
    $args = (object) array(
        'public'      => true,
        'label'       => 'Events',
        'rewrite'     => false, // always set this to false
        'has_archive' => true
    );
    register_post_type( $post_type, $args );

    // these are your actual rewrite arguments
    $args->rewrite = array(
        'slug' => 'calendar'
    );

    // everything what follows is from the register_post_type function
    if ( is_admin() || '' != get_option( 'permalink_structure' ) ) {

        if ( ! is_array( $args->rewrite ) )
            $args->rewrite = array();
        if ( empty( $args->rewrite['slug'] ) )
            $args->rewrite['slug'] = $post_type;
        if ( ! isset( $args->rewrite['with_front'] ) )
            $args->rewrite['with_front'] = true;
        if ( ! isset( $args->rewrite['pages'] ) )
            $args->rewrite['pages'] = true;
        if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )
            $args->rewrite['feeds'] = (bool) $args->has_archive;
        if ( ! isset( $args->rewrite['ep_mask'] ) ) {
            if ( isset( $args->permalink_epmask ) )
                $args->rewrite['ep_mask'] = $args->permalink_epmask;
            else
                $args->rewrite['ep_mask'] = EP_PERMALINK;
        }

        if ( $args->hierarchical )
            add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" );
        else
            add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" );

        if ( $args->has_archive ) {
            $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;
            if ( $args->rewrite['with_front'] )
                $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
            else
                $archive_slug = $wp_rewrite->root . $archive_slug;

            add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
            if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
                $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
                add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
                add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
            }
            if ( $args->rewrite['pages'] )
                add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
        }

        $permastruct_args = $args->rewrite;
        $permastruct_args['feed'] = $permastruct_args['feeds'];
        add_permastruct( $post_type, "%$post_type%", $permastruct_args );
    }
}
add_action( 'init', 'wpsx203951_custom_init' );

يمكنك أن ترى add_permastruct call الآن لا يشمل الركود. اختبرت سيناريوهين:

  1. عندما أنشأت صفحة تحتوي على "التقويم" في الدودة ، يتم استبدال هذه الصفحة بواسطة أرشيف نوع المنشور والذي يستخدم أيضًا "التقويم" في الدرج.

 enter image description here 

  1. عندما أنشأت صفحة تحتوي على الزر "my-event" والحدث (CPT) مع "" my-event "" ، فإن نوع المنشور المخصص يتم عرضه.

 enter image description here 

  1. أي صفحات أخرى لا تعمل سواء. إذا نظرت إلى الصورة أعلاه ، يصبح من الواضح سبب ذلك: ستظل قاعدة نوع المنشور المخصص دائمًا متكافئة مع مربع صفحة. نظرًا لعدم توفر WordPress لأي وسيلة لتحديد ما إذا كانت هذه الصفحة أو نوع منشور مخصص غير موجود ، فسوف تُرجع 404. لهذا السبب تحتاج إلى سبيكة لتحديد الصفحة أو CPT. قد يكون الحل المحتمل هو اعتراض الخطأ والبحث عن صفحة قد تكون موجودة على غرار هذه الإجابة .
7
Jan Beck

من خلال الاطلاع على الإجابات هنا ، أعتقد أن هناك مجالًا لحل أفضل يجمع بين بعض الأشياء التي تعلمتها أعلاه ويضيف اكتشافًا تلقائيًا ومنع حدوث تكرارات جديدة للبريد.

ملاحظة: تأكد من تغيير "custom_post_type" لاسم CPT الخاص بك من خلال المثال الخاص بي أدناه. هناك العديد من الحوادث ، و "العثور/الاستبدال" هو وسيلة سهلة للقبض عليهم جميعًا. كل هذا الرمز يمكن أن يذهب في وظائفك. php أو في البرنامج المساعد.

الخطوة 1: تعطيل إعادة الكتابة على نوع المنشور المخصص الخاص بك عن طريق تعيين إعادة كتابة إلى "خطأ" عند تسجيل المنشور:

register_post_type( 'custom_post_type',
    array(
        'rewrite' => false
    )
);

الخطوة 2: / إضافة إعادة كتابة مخصصاتنا يدويا إلى أسفل من ووردبريس يعيد كتابة لدينا custom_post_type

function custom_post_type_rewrites() {
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/embed/?$', 'index.php?custom_post_type=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/trackback/?$', 'index.php?custom_post_type=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '([^/]+)/page/?([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&paged=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)(?:/([0-9]+))?/?$', 'index.php?custom_post_type=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
}
add_action( 'init', 'custom_post_type_rewrites' );

ملاحظة: بناءً على احتياجاتك ، قد تحتاج إلى تعديل عمليات إعادة الكتابة أعلاه (هل تريد تعطيل trackbacks؟ الخلاصات ، إلخ). تمثل هذه الأنواع "الافتراضية" من عمليات إعادة الكتابة التي كان سيتم إنشاؤها إذا لم تقم بتعطيل عمليات إعادة الكتابة في الخطوة 1

الخطوة 3: اجعل الروابط الدائمة إلى نوع المنشور المخصص "جميلًا" مرة أخرى

function custom_post_type_permalinks( $post_link, $post, $leavename ) {
    if ( isset( $post->post_type ) && 'custom_post_type' == $post->post_type ) {
        $post_link = home_url( $post->post_name );
    }

    return $post_link;
}
add_filter( 'post_type_link', 'custom_post_type_permalinks', 10, 3 );

ملاحظة: يمكنك التوقف هنا إذا لم تكن قلقًا بشأن قيام المستخدمين بإنشاء منشور متعارض (مكرر) في نوع منشور آخر من شأنه إنشاء موقف حيث يمكن تحميل واحد منهم فقط عند طلب الصفحة.

الخطوة 4: منع تكرار نشر الرخويات

function prevent_slug_duplicates( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    $check_post_types = array(
        'post',
        'page',
        'custom_post_type'
    );

    if ( ! in_array( $post_type, $check_post_types ) ) {
        return $slug;
    }

    if ( 'custom_post_type' == $post_type ) {
        // Saving a custom_post_type post, check for duplicates in POST or PAGE post types
        $post_match = get_page_by_path( $slug, 'OBJECT', 'post' );
        $page_match = get_page_by_path( $slug, 'OBJECT', 'page' );

        if ( $post_match || $page_match ) {
            $slug .= '-duplicate';
        }
    } else {
        // Saving a POST or PAGE, check for duplicates in custom_post_type post type
        $custom_post_type_match = get_page_by_path( $slug, 'OBJECT', 'custom_post_type' );

        if ( $custom_post_type_match ) {
            $slug .= '-duplicate';
        }
    }

    return $slug;
}
add_filter( 'wp_unique_post_slug', 'prevent_slug_duplicates', 10, 6 );

ملاحظة: سيؤدي ذلك إلى إلحاق السلسلة "-plicate" بنهاية أي من الرخويات المكررة. لا يمكن أن يمنع هذا الرمز الرخويات المكررة إذا كانت موجودة بالفعل قبل تنفيذ هذا الحل. تأكد من التحقق من التكرارات أولاً.

أحب أن أسمع من أي شخص آخر يعطي هذا الأمر لرؤية ما إذا كان يعمل بشكل جيد بالنسبة لهم أيضا.

5
Matt Keys

لا تحتاج الكثير من الصعب رمز. مجرد استخدام البرنامج المساعد خفيفة الوزن:

لديها خيارات قابلة للتخصيص.

1
T.Todua

بالنسبة لأي شخص قرأ هذا الأمر وكان لديه مشكلة في المشاركات الفرعية كما فعلت ، فقد وجدت أن أفضل طريقة هي إضافة قواعد إعادة الكتابة الخاصة بك.

كانت المشكلة الرئيسية التي كنت أواجهها هي أن WordPress يتعامل مع إعادة التوجيه من صفحات ذات مستويين (منشورات فرعية) تختلف اختلافًا عميقًا قليلاً عما تعامل مع 3 مستويات عميقًا (منشورات تابعة لطفل تابع).

هذا يعني عندما يكون لدي/post-type/post-name/post-child/يمكنني استخدام/post-name/post-child وسوف يعيد توجيهي إلى الواحد مع post-type في المقدمة ولكن إذا كان لدي post-type/post-name/post-child/post-grandchild ثم لا يمكنني استخدام post-name/post-child/post-grandchild.

من خلال إلقاء نظرة على قواعد إعادة الكتابة ، يبدو الأمر مطابقًا لأشياء بخلاف pagename في المستويين الأول والثاني (أعتقد أن المستوى الثاني يطابق المرفق) ، ثم يقوم بشيء ما لإعادة توجيهك إلى المنشور المناسب. في ثلاثة مستويات عميقة لا يعمل.

أول شيء عليك القيام به هو إزالة رابط نوع المنشور من الأطفال أيضًا. يجب أن يحدث هذا المنطق هنا إذا نظرت إلى إجابة Nate Allen أعلاه:

$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

أنا نفسي استخدمت مزيجًا من الشرطيات المختلفة للتحقق مما إذا كان المنشور لديه أطفال وما إلى ذلك من أجل الوصول إلى الرابط الثابت. هذا الجزء ليس صعبًا للغاية وستجد أمثلة لأشخاص يقومون بذلك في مكان آخر.

الخطوة التالية هي أن الأمور تتغير من الإجابة المعطاة. بدلاً من إضافة الأشياء إلى الاستعلام الرئيسي (الذي كان يعمل مع المنشورات المخصصة وأطفالهم ولكن ليس الأطفال الآخرين) أضفت إعادة كتابة ذهبت إلى أسفل قواعد WordPress بحيث إذا لم يتحقق pagename وكان على وشك اضغط على 404 ، وستقوم بإجراء فحص أخير لمعرفة ما إذا كانت الصفحة الموجودة في نوع المنشور المخصص لها نفس الاسم وإلا فإنها ستطرد 404.

إليك قاعدة إعادة الكتابة التي استخدمتها بافتراض أن "الحدث" هو اسم CPT الخاص بك

function rewrite_rules_for_removing_post_type_slug()
{
    add_rewrite_rule(
        '(.?.+?)?(:/([0-9]+))?/?$',
        'index.php?event=$matches[1]/$matches[2]&post_type=event',
        'bottom'
    );
}

add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);

آمل أن يساعد هذا شخصًا آخر ، لم أتمكن من العثور على أي شيء آخر يتعلق بوظائف منشأ الأطفال وإزالة الدودة البادئة من هؤلاء.

0
Moe Loubani

ويمكننا إجراء بعض التغييرات على الوظيفة المذكورة أعلاه:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {
    $query->set( 'post_type', array( 'post', 'events', 'page' ) );
}
}

إلى:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {

    global $wpdb;
    $pt = $wpdb->get_var(
        "SELECT post_type FROM `{$wpdb->posts}` " .
        "WHERE post_name = '{$query->query['name']}'"
    );
    $query->set( 'post_type', $pt );
}
}

من أجل تعيين قيمة post_type الصحيحة.

0
Max Kondrachuk

هذا عملت لي: 'rewrite' => array('slug' => '/')

0
Malki Mohamed