it-swarm.asia

كيفية إنشاء بنية الرابط الثابت مع تصنيفات مخصصة وأنواع المنشورات المخصصة مثل الاسم الأساسي/ضريبة الوالدين/ضريبة الأطفال/اسم مخصص بعد النشر

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

لتوضيح بصريًا ما أريد:

/basename/ - ideally a page, but I think this will cause a permalink collision    
/basename/top-cat/ - top parent custom taxonomy archive    
/basename/top-cat/child-cat/ - child cat custom taxonomy archive     
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive    
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

يمكنك القيام بذلك بشكل جيد باستخدام المنشورات والفئات المضمّنة ، كيف يمكنك القيام بذلك مع التصنيفات المخصصة وأنواع المنشورات المخصصة؟ أعلم أنك بحاجة إلى استخدام 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ), للحصول على البزاقات الهرمية ، والتي تعمل بشكل جيد على صفحات الأرشيف ، ولكن تظهر منشورات نوع المنشورات المخصصة 404. إذا قمت بإزالة الجزء 'hierarchical' => true فعندئذٍ ، فإن المنشورات تعمل ، لكنني فقدت عناوين URL الهرمية (فقط/basename/grandchild-cat/post-name/works).

لذلك ، أي حلول؟ شكراً جزيلاً لك ، لقد دفعني هذا إلى المكسرات منذ حوالي 3 أسابيع.

53
Jeff

بعد الجمع بين مجموعة من الإجابات الأخرى ، نجحت! لذلك إليك الحل لأولئك منكم الذين يكافحون مع هذا أيضًا:

هذا المنشور و هذا واحد ساعدني في الخروج ، لذا بفضل هؤلاء الرجال.

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

أولاً ، احصل على الرخويات الصحيحة عند تحديد أنواع المنشورات المخصصة وتصنيفاتها: بالنسبة لنوع المنشور المخصص ، يجب أن يكون basename/%taxonomy_name% ويجب أن تكون سبيكة رصيف التصنيف basename فقط. لا تنسَ أيضًا إضافة 'hierarchical' => true إلى صفيف إعادة كتابة التصنيف للحصول على مصطلحات متداخلة في عنوان url الخاص بك. تأكد أيضًا من تعيين query_var على true في كلتا الحالتين.

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

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules  = array();
    $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
    $newRules['basename/(.+)/?$']                = 'index.php?taxonomy_name=$matches[1]'; 

    return array_merge($newRules, $rules);
}

ستحتاج بعد ذلك إلى إضافة هذا الرمز للسماح لموظف العمل بكيفية التعامل مع %taxonomy_name% في بنية إعادة كتابة نوع المنشور المخصصة الخاصة بك:

function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'custom_post_type_name')
        return $link;

    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below
    }
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

لقد أنشأت وظيفة مخصصة بناءً على وورد get_category_parents:

// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {    
    $chain = '';   
    $parent = &get_term($id, $taxonomy);

    if (is_wp_error($parent)) {
        return $parent;
    }

    if ($nicename)    
        $name = $parent -> slug;        
else    
        $name = $parent -> name;

    if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
        $visited[] = $parent -> parent;    
        $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

    }

    if ($link) {
        // nothing, can't get this working :(
    } else    
        $chain .= $name . $separator;    
    return $chain;    
}

ثم تحتاج إلى مسح الروابط الدائمة (ما عليك سوى تحميل صفحة إعدادات الروابط الدائمة).

الآن كل شيء "يجب" العمل نأمل! استخدم مجموعة من مصطلحات التصنيف وقم بتداخلها بشكل صحيح ، ثم قم بإجراء بعض منشورات نوع المنشورات المخصصة وتصنيفها بشكل صحيح. يمكنك أيضًا إنشاء صفحة تحتوي على الدرج basename ، ويجب أن يعمل كل شيء بالطريقة التي حددتها في سؤالي. قد ترغب في إنشاء بعض صفحات أرشيف التصنيف المخصص للتحكم في كيفية ظهورها وإضافة نوع من أداة التصنيف البرنامج المساعد لإظهار فئاتك المتداخلة في الشريط الجانبي.

نأمل أن يساعدك!

68
Jeff

نلقي نظرة على هذا البرنامج المساعد . يوفر عناوين URL هرمية للفئات ، ولكن يمكنك التكيف بسهولة مع أي تصنيف.

يتبع إنشاء القاعدة دالة متكررة .

2
vmassuchetto