ลบตัวบุ้งอนุกรมวิธานออกจาก Permalink อนุกรมวิธานแบบลำดับชั้นที่กำหนดเอง


21

ฉันสร้าง taxonomy ของ 'forum' โดยใช้กฎเหล่านี้:

register_taxonomy(
  'forum',
  array('topic'),
  array(
    'public' => true,
    'name' => _a('Forums'),
    'singular_name' => _a('Forum'),
    'show_ui' => true,
    'show_in_nav_menus' => true,
    'hierarchical' => true,

    'labels' => array(
      'name' => _a('Forums'),
      'singular_name' => _a('Forum'),
      'search_items' => _a('Search Forums'),
      'popular_items' => _a('Popular Forums'),
      'all_items' => _a('All Forums'),
      'parent_item' => _a('Parent Forum'),
      'parent_item_colon' => _a('Parent Forum:'),
      'edit_item' => _a('Edit Forum'),
      'update_item' => _a('Update Forum'),
      'add_new_item' => _a('Add New Forum'),
      'new_item_name' => _a('New Forum Name'),
    ),
    'query_var' => true,
    'rewrite' => array('slug' => 'forums', 'with_front' => false, 'hierarchical' => true),  
  )
);

ในส่วนหน้า URL จะมีลักษณะดังนี้:

forums/general-discussion/sub-forum

ฉันจะลบกระสุนด้านหน้า ("ฟอรัม") ได้อย่างไร นั่นคือเปลี่ยน URL เป็น:

general-discussion/sub-forum

ถ้าฉันผ่านอาร์กิวเมนต์กระสุนที่ว่างเปล่าเพื่อ register_taxonomy () มันทำงาน แต่ที่ทำให้เกิดปัญหากับ Permalinks ประเภทโพสต์ที่เกี่ยวข้องกับอนุกรมวิธานนี้


@One Trick Pony - คุณลองแทนที่จะปล่อย'slug' => 'forums'ว่างแล้วเอามันออกไปเลย'rewrite' => array('with_front' => false, 'hierarchical' => true)ใช่ไหม? ฉันคิดว่ามันได้ผลในอดีตสำหรับฉัน ยังให้แน่ใจว่าคุณล้างลิงก์ถาวร
eileencodes

ได้ลองแล้วและ Permalinks ก็เหมือนกัน เพิ่ม'slug' => ''ทำให้มันทำงาน แต่แล้วโพสต์โดยใช้อนุกรมวิธานนี้สร้าง
404s

@One Trick Pony - นอกจาก 'การสนทนาทั่วไป' คุณต้องการเซ็กเมนต์เส้นทางระดับบนสุดอีกอย่างไร
MikeSchinkel

มี%forum%ควรเป็นเซ็กเมนต์ระดับบนสุด
onetrickpony

@ One Trick Pony - ฉันแค่หวังว่าคุณจะให้เซ็กเมนต์เส้นทางระดับสูงอื่น ๆ ให้ฉันดู
MikeSchinkel

คำตอบ:


11

UPDATE

ตั้งแต่เขียน WordPress หลักนี้ได้เพิ่ม'do_parse_request'เบ็ดที่ช่วยให้การกำหนดเส้นทาง URL ได้รับการจัดการอย่างหรูหราและโดยไม่ต้องขยายWPชั้นเรียน ฉันครอบคลุมหัวข้อในเชิงลึกในการพูดคุย WordCamp ที่แอตแลนตา 2557 ของฉันในหัวข้อ" การกำหนดเส้นทาง URL ง่าย ๆ " ; สไลด์มีอยู่ที่ลิงค์

คำตอบเดิม

การออกแบบ URLนั้นมีความสำคัญต่อทศวรรษ ฉันยังเขียนบล็อกเกี่ยวกับเรื่องนี้เมื่อหลายปีก่อน และในขณะที่ WordPress เป็นผลรวมเป็นซอฟต์แวร์ที่ยอดเยี่ยม โชคไม่ดีที่มันเป็นระบบการเขียน URL ที่สั้นมาก(IMHO แน่นอน :)ยินดีที่เห็นคนสนใจเกี่ยวกับการออกแบบ URL!

คำตอบที่ฉันจะมอบให้คือปลั๊กอินที่ฉันเรียกWP_Extendedว่าเป็นข้อพิสูจน์แนวคิดสำหรับข้อเสนอนี้ใน Trac (โปรดสังเกตว่าข้อเสนอเริ่มต้นจากสิ่งหนึ่งและพัฒนาเป็นอีกสิ่งหนึ่งดังนั้นคุณต้องอ่านทุกสิ่งเพื่อดูว่า มันกำลังมุ่งหน้าไป.)

โดยพื้นฐานแล้วแนวคิดคือการ subclass WPคลาสแทนที่parse_request()เมธอดจากนั้นกำหนด$wpตัวแปรโกลบอลด้วยอินสแตนซ์ของคลาสย่อย จากนั้นภายในparse_request()คุณตรวจสอบเส้นทางโดยส่วนของเส้นทางแทนการใช้รายการของนิพจน์ปกติที่ต้องตรงกับ URL อย่างครบถ้วน

เพื่อที่จะระบุอย่างชัดเจนนี้ตรรกะเทคนิคแทรกในด้านหน้าของparse_request()ซึ่งการตรวจสอบสำหรับการแข่งขัน URL เพื่อ RegEx และรูปลักษณ์แรกแทนสำหรับการแข่งขันระยะอนุกรมวิธาน แต่มันเท่านั้นแทนที่parse_request()และใบส่วนที่เหลือทั้งหมดของระบบ WordPress URL เส้นทางเหมือนเดิมรวมทั้งและ โดยเฉพาะอย่างยิ่งการใช้$query_varsตัวแปร

สำหรับกรณีการใช้งานของคุณการใช้งานนี้จะเปรียบเทียบส่วนเส้นทาง URL กับคำศัพท์อนุกรมวิธานเนื่องจากนั่นคือทั้งหมดที่คุณต้องการ การดำเนินการนี้จะตรวจสอบเงื่อนไขอนุกรมวิธานเคารพความสัมพันธ์ระยะพ่อแม่และลูกและเมื่อพบการแข่งขันก็จะระบุเส้นทาง URL (ลบชั้นนำและต่อท้ายทับ)ไป$wp->query_vars['category_name'], $wp->query_vars['tag']หรือ$wp->query_vars['taxonomy']& $wp->query_vars['term']และมันทะลุparse_request()วิธีการWPระดับ

ในทางตรงกันข้ามถ้าเส้นทาง URL ไม่ตรงกับคำจากอนุกรมวิธานที่คุณระบุให้มอบหมายตรรกะการกำหนดเส้นทาง URL ไปยังระบบการเขียน WordPress ใหม่โดยการเรียกparse_request()วิธีการของWPชั้นเรียน

วิธีใช้WP_Extendedสำหรับกรณีการใช้งานของคุณคุณจะต้องเรียกใช้register_url_route()ฟังก์ชันจากภายในfunctions.phpไฟล์ของธีมของคุณดังนี้:

add_action('init','init_forum_url_route');
function init_forum_url_route() {
  register_url_route(array('taxonomy'=>'forum'));
}

นี่คือซอร์สโค้ดสำหรับปลั๊กอิน:

<?php
/*
Filename: wp-extended.php
Plugin Name: WP Extended for Taxonomy URL Routes
Author: Mike Schinkel
*/
function register_url_route($args=array()) {
  if (isset($args['taxonomy']))
    WP_Extended::register_taxonomy_url($args['taxonomy']);
}
class WP_Extended extends WP {
  static $taxonomies = array();
  static function on_load() {
    add_action('setup_theme',array(__CLASS__,'setup_theme'));
  }
  static function register_taxonomy_url($taxonomy) {
    self::$taxonomies[$taxonomy] = get_taxonomy($taxonomy);
  }
  static function setup_theme() { // Setup theme is 1st code run after WP is created.
    global $wp;
    $wp = new WP_Extended();  // Replace the global $wp
  }
  function parse_request($extra_query_vars = '') {
    $path = $_SERVER['REQUEST_URI'];
    $domain = str_replace('.','\.',$_SERVER['SERVER_NAME']);
    //$root_path = preg_replace("#^https?://{$domain}(/.*)$#",'$1',WP_SITEURL);
$root_path = $_SERVER['HTTP_HOST'];

    if (substr($path,0,strlen($root_path))==$root_path)
      $path = substr($path,strlen($root_path));
    list($path) = explode('?',$path);
    $path_segments = explode('/',trim($path,'/'));
    $taxonomy_term = array();
    $parent_id = 0;
    foreach(self::$taxonomies as $taxonomy_slug => $taxonomy) {
      $terms = get_terms($taxonomy_slug);
      foreach($path_segments as $segment_index => $path_segment) {
        foreach($terms as $term_index => $term) {
          if ($term->slug==$path_segments[$segment_index]) {
            if ($term->parent!=$parent_id) { // Make sure we test parents
              $taxonomy_term = array();
            } else {
              $parent_id = $term->term_id; // Capture parent ID for verification
              $taxonomy_term[] = $term->slug; // Collect slug as path segment
              unset($terms[$term_index]); // No need to scan it again
            }
            break;
          }
        }
      }
      if (count($taxonomy_term))
        break;
    }
    if (count($taxonomy_term)) {
      $path = implode('/',$taxonomy_term);
      switch ($taxonomy_slug) {
        case 'category':
          $this->query_vars['category_name'] = $path;
          break;
        case 'post_tag':
          $this->query_vars['tag'] = $path;
          break;
        default:
          $this->query_vars['taxonomy'] = $taxonomy_slug;
          $this->query_vars['term'] = $path;
          break;
      }
    } else {
      parent::parse_request($extra_query_vars); // Delegate to WP class
    }
  }
}
WP_Extended::on_load();

PS CAVEAT # 1

แต่สำหรับเว็บไซต์ที่กำหนดผมคิดว่าเทคนิคนี้ทำงานเก่ง แต่เทคนิคนี้ไม่ควรนำมาใช้สำหรับปลั๊กอินที่จะกระจายใน WordPress.org ให้ผู้อื่นใช้ หากเป็นแกนหลักของแพคเกจซอฟต์แวร์ที่ใช้ WordPress แล้วนั่นอาจจะไม่เป็นไร มิฉะนั้นเทคนิคนี้ควรจะ จำกัด การปรับปรุง URL เส้นทางสำหรับเว็บไซต์ที่เฉพาะเจาะจง

ทำไม? เพราะมีเพียงปลั๊กอินเดียวเท่านั้นที่สามารถใช้เทคนิคนี้ หากสองปลั๊กอินพยายามใช้ปลั๊กอินเหล่านั้นจะขัดแย้งกัน

นอกจากกลยุทธ์นี้สามารถขยายเพื่อจัดการทั่วไปทุกรูปแบบกรณีการใช้งานที่อาจจำเป็นและนั่นคือสิ่งที่ฉันตั้งใจจะนำมาใช้ทันทีที่ฉันพบเวลาว่างหรือลูกค้าที่สามารถสปอนเซอร์เวลาที่ใช้ในการ สร้างการใช้งานทั่วไปอย่างเต็มที่

ถ้ำ # 2

ฉันเขียนสิ่งนี้เพื่อลบล้างparse_request()ซึ่งเป็นฟังก์ชั่นที่ใหญ่มากและเป็นไปได้มากที่ฉันพลาดคุณสมบัติหนึ่งหรือสองของ$wpวัตถุระดับโลกที่ฉันควรจะตั้งไว้ .. ดังนั้นหากสิ่งที่ทำหน้าที่ไร้ค่านั้นทำให้ฉันรู้และฉันจะมีความสุข ค้นคว้าและแก้ไขคำตอบหากจำเป็น

อย่างไรก็ตาม...


หลังจากเขียนสิ่งนี้ฉันรู้ว่าฉันได้ทดสอบหมวดหมู่แทนคำศัพท์อนุกรมวิธานทั่วไปดังนั้นข้างต้นจะไม่ทำงานสำหรับ'forum'อนุกรมวิธาน แต่ฉันจะแก้ไขมันเพื่อให้ทำงานได้ในวันนี้ ...
MikeSchinkel

ดังนั้นฉันจึงอัปเดตรหัสเพื่อแก้ไขปัญหาที่ฉันพูดถึงในความคิดเห็นก่อนหน้า
MikeSchinkel

ไม่สามารถทำงานนี้ ... ฉันต้องเปลี่ยนกฎการเขียนซ้ำหรือไม่
onetrickpony

@One Trick Pony - ข้อมูลการวินิจฉัยเล็กน้อยจะช่วยได้ :) คุณลองทำอะไร จะเกิดอะไรขึ้นเมื่อคุณป้อน URL ลงในเบราว์เซอร์ของคุณ คุณมีโอกาสโทรหาอนุกรมวิธานของคุณ'forums'มากกว่า'forum'หรือไม่? คุณคาดหวังว่า URL ที่ลิงค์ไปยังหน้าเหล่านี้มีการเปลี่ยนแปลงหรือไม่(ถ้าใช่ไม่น่าแปลกใจรหัสของฉันไม่ได้อยู่ที่การพิมพ์ URL เพียงเส้นทางของ URL)
MikeSchinkel

ไม่ฉันสามารถเปลี่ยน URL ได้ (ฉันคิดว่าเป็นฟังก์ชัน term_link ที่ฉันต้องขอใช้) site/rootforum/ใช้งานได้ แต่site/rootforum/subforum/ไม่ (ข้อผิดพลาด 404) ...
onetrickpony

7

ง่ายจริงๆ

ขั้นตอนที่ 1: หยุดใช้พารามิเตอร์เขียนใหม่เลย เราจะม้วนงานเขียนของคุณเอง

'rewrite'=>false;

ขั้นตอนที่ 2: ตั้งกฎหน้าอย่างละเอียด สิ่งนี้บังคับให้เพจปกติมีกฎของตนเองแทนที่จะเป็นเพจทั้งหมดที่ด้านล่างของหน้า

ขั้นตอนที่ 3: สร้างกฎการเขียนซ้ำเพื่อจัดการกรณีการใช้งานของคุณ

ขั้นตอนที่ 4: บังคับให้ล้างกฎที่เกิดขึ้นด้วยตนเอง วิธีที่ง่ายที่สุด: ไปที่ settings-> Permalink และคลิกปุ่มบันทึก ฉันชอบสิ่งนี้มากกว่าวิธีการเปิดใช้งานปลั๊กอินสำหรับการใช้งานของฉันเองเนื่องจากฉันสามารถบังคับให้กฎล้างออกเมื่อใดก็ตามที่ฉันเปลี่ยนสิ่งต่าง ๆ

ดังนั้นเวลารหัส:

function test_init() {
    // create a new taxonomy
    register_taxonomy(
        'forum',
        'post',
        array(
            'query_var' => true,
            'public'=>true,
            'label'=>'Forum',
            'rewrite' => false,
        )
    );

    // force verbose rules.. this makes every Page have its own rule instead of being a 
    // catch-all, which we're going to use for the forum taxo instead
    global $wp_rewrite;
    $wp_rewrite->use_verbose_page_rules = true;

    // two rules to handle feeds
    add_rewrite_rule('(.+)/feed/(feed|rdf|rss|rss2|atom)/?$','index.php?forum=$matches[1]&feed=$matches[2]');
    add_rewrite_rule('(.+)/(feed|rdf|rss|rss2|atom)/?$','index.php?forum=$matches[1]&feed=$matches[2]');

    // one rule to handle paging of posts in the taxo
    add_rewrite_rule('(.+)/page/?([0-9]{1,})/?$','index.php?forum=$matches[1]&paged=$matches[2]');

    // one rule to show the forum taxo normally
    add_rewrite_rule('(.+)/?$', 'index.php?forum=$matches[1]');
}

add_action( 'init', 'test_init' );

โปรดจำไว้ว่าหลังจากเพิ่มรหัสนี้แล้วคุณต้องเปิดใช้งานเมื่อคุณล้างกฎความคิดเห็น (โดยการบันทึกหน้าในการตั้งค่า -> ลิงก์ถาวร)!

หลังจากที่คุณได้ล้างกฎและบันทึกลงในฐานข้อมูลแล้ว / สิ่งที่ควรไปที่ฟอรั่มของคุณ = หน้า taxonomy ใด ๆ

กฎการเขียนซ้ำนั้นไม่ใช่เรื่องยากหากคุณเข้าใจนิพจน์ทั่วไป ฉันใช้รหัสนี้เพื่อช่วยฉันเมื่อตรวจแก้จุดบกพร่องพวกเขา:

function test_foot() {
    global $wp_rewrite;
    echo '<pre>';
    var_dump($wp_rewrite->rules);
    echo '</pre>';
}
add_action('wp_footer','test_foot');

ด้วยวิธีนี้ฉันสามารถดูกฎปัจจุบันได้อย่างรวดเร็วบนหน้าของฉัน เพียงจำไว้ว่ามี URL ใด ๆ ระบบจะเริ่มที่ด้านบนสุดของกฎและดำเนินการตามกฎเหล่านั้นจนกว่าจะพบ URL ที่ตรงกัน การจับคู่จะใช้ในการเขียนแบบสอบถามอีกครั้งในชุดการค้นหา? key = value ปกติ คีย์เหล่านั้นจะถูกวิเคราะห์คำในสิ่งที่เข้าสู่วัตถุ WP_Query ง่าย

แก้ไข:บันทึกด้านข้างวิธีนี้อาจใช้ได้เฉพาะในกรณีที่โครงสร้างโพสต์ที่กำหนดเองตามปกติของคุณเริ่มต้นด้วยสิ่งที่ไม่ใช่ catchall เช่น% category% หรือบางอย่างเช่นนั้น คุณต้องเริ่มด้วยสตริงแบบคงที่หรือตัวเลขเช่น% ปี% นี่คือการป้องกันไม่ให้มันจับ URL ของคุณก่อนที่มันจะเป็นไปตามกฎของคุณ


หากคุณต้องการแก้จุดบกพร่องของกฎการเขียนซ้ำได้ง่ายขึ้นฉัน (อีกครั้ง) แนะนำปลั๊กอินตัววิเคราะห์การเขียนซ้ำของฉันซึ่งช่วยให้คุณลองใช้กฎและดูตัวแปรข้อความค้นหาได้ทันที
Jan Fabry

น่าเสียดายที่ระบบการเขียน URL ใหม่ในปัจจุบันบังคับให้รูปแบบ URL ที่เป็นไปได้ทั้งหมดแบนอยู่ในรายการขนาดใหญ่เทียบกับการติดตามโครงสร้างต้นไม้โดยธรรมชาติของเส้นทาง URL การตั้งค่าปัจจุบันไม่สามารถอำนวยความสะดวกให้ตรงกับอาร์เรย์ของตัวอักษรเช่นหมวดหมู่หรือชื่อฟอรั่ม ; ตามที่คุณทราบมันบังคับให้ URL "หน้า"ทั้งหมดต้องได้รับการประเมินก่อน การจับคู่ตามส่วนของเส้นทางและการจับคู่ในหลาย ๆ วิธี(อาร์เรย์ของตัวอักษรหมวดหมู่แท็กคำศัพท์ทางภาษีชื่อผู้ใช้ประเภทโพสต์ชื่อโพสต์ชื่อเรียกกลับตัวกรองเบ็ดและในที่สุด RegEx)จะขยายความซับซ้อนให้ดีขึ้น เข้าใจไหม.
MikeSchinkel

Mike: จริงๆแล้วมันไม่ง่ายเลยที่จะเข้าใจเพราะฉันไม่มีเงื่อนงำแรกของ WTF ที่คุณพูดถึง แนวคิดของการกำหนดเส้นทาง URL ของคุณสับสนและยากและอย่างที่คุณอาจทราบแล้วฉันไม่เห็นด้วยกับพวกเขา การค้นหาแบบเรียบมีเหตุผลและมีความยืดหยุ่นมากกว่าที่คุณมักจะให้เครดิต คนส่วนใหญ่ไม่ต้องการความซับซ้อนทั้งหมดที่ไม่จำเป็นใน URL และแทบไม่มีใครต้องการมัน
อ็อตโต

ขอบคุณ แต่ฉันคิดว่าฉันเคยลองมาก่อนหน้านี้แล้ว ( wordpress.stackexchange.com/questions/9455/ … )
onetrickpony

โชคดีที่ WordPress คำตอบขณะนี้ช่วยให้คนที่ทำการควบคุมความต้องการของ URL ที่พวกเขาไปจนมีความเสียงและพวกเขาดูเหมือนจะเป็นจำนวนมาก (100+) แต่ฉันเคารพว่าคุณอาจไม่สามารถทำตามตัวอย่างของฉันก่อนที่จะนำไปใช้อย่างเต็มรูปแบบ ฉันคาดการณ์ว่าเมื่อวิธีที่ฉันสนับสนุนถูกนำไปใช้อย่างสมบูรณ์ในปลั๊กอินและหลังจากนั้นประมาณ 6-12 เดือนมันจะกลายเป็นวิธีที่เหมาะสมสำหรับเว็บไซต์ CMS บน WordPress เพื่อกำหนดเส้นทาง URL ของพวกเขา ดังนั้นให้เริ่มการอภิปรายนี้อีกครั้งในอีกประมาณ 9 เดือน
MikeSchinkel

4

คุณจะไม่สามารถทำได้โดยใช้ WP_Rewrite เพียงอย่างเดียวเนื่องจากไม่สามารถแยกความแตกต่างระหว่างคำว่าทากและโพสต์ทาก

คุณต้องขอเข้า 'ขอ' และป้องกัน 404 โดยการตั้งค่า var แบบสอบถามโพสต์แทนอนุกรมวิธานหนึ่ง

บางสิ่งเช่นนี้

function fix_post_request( $request ) {
    $tax_qv = 'forum';
    $cpt_name = 'post';

    if ( !empty( $request[ $tax_qv ] ) ) {
        $slug = basename( $request[ $tax_qv ] );

        // if this would generate a 404
        if ( !get_term_by( 'slug', $slug, $tax_qv ) ) {
            // set the correct query vars
            $request[ 'name' ] = $slug;
            $request[ 'post_type' ] = $cpt_name;
            unset( $request[$tax_qv] );
        }
    }

    return $request;
}
add_filter( 'request', 'fix_post_request' );

โปรดทราบว่าจะต้องกำหนด taxonomy ก่อนประเภทโพสต์

นี่จะเป็นช่วงเวลาที่ดีที่จะชี้ให้เห็นว่าการมีอนุกรมวิธานและประเภทโพสต์ที่มีคำสืบค้นเดียวกันคือแนวคิดที่ไม่ดี

นอกจากนี้คุณจะไม่สามารถเข้าถึงโพสต์ที่มีกระสุนเหมือนหนึ่งในเงื่อนไข


ตกลงกันว่าการมีอนุกรมวิธานและประเภทโพสต์ที่มีคำสืบค้นเดียวกันเป็นแนวคิดที่ไม่ดี แต่นั่นอาจหมายถึงผู้ที่มีอนุกรมวิธานและประเภทโพสต์ที่มีชื่อเดียวกันเป็นแนวคิดที่ไม่ดีซึ่งไม่ใช่กรณี หากใช้ชื่อเดียวกันแล้วหนึ่งในสองควรมี var แบบสอบถาม
MikeSchinkel

2

ฉันจะดูรหัสของปลั๊กอินแมวระดับบนสุด:

http://fortes.com/projects/wordpress/top-level-cats/

คุณสามารถปรับได้อย่างง่ายดายดังนั้นมันจึงมองหากระสุนอนุกรมวิธานของคุณเองโดยการเปลี่ยน

$category_base = get_option('category_base');

ในบรรทัด 74 ไปยังสิ่งที่ชอบ:

$category_base = 'forums';

อาจทำงานกับหมวดหมู่ได้ แต่ไม่เหมาะกับ taxonomies ที่กำหนดเอง (อย่างน้อยใน wp 3.1) ... ฉันจัดการเพื่อเปลี่ยน URL แต่ฉันได้รับข้อผิดพลาด 404 ครั้ง
onetrickpony

2

ผมขอแนะนำการดูที่เป็นปลั๊กอินที่กำหนดเองโพสต์ Permalinks ฉันยังไม่มีเวลาที่จะทำการทดสอบ แต่มันอาจช่วยสถานการณ์ของคุณได้


มันไม่ได้ก็จัดการโพสต์ไม่ได้ taxonomies และแม้ว่ามันจะผมจะต้องมีการเพิ่มชนิดของคำนำหน้าบางอย่างก่อน%forum%ซึ่งเป็นสิ่งที่ฉันพยายามที่จะหลีกเลี่ยงการ ...
onetrickpony

2

เนื่องจากฉันคุ้นเคยกับคำถามอื่นของคุณฉันจะตอบโดยคำนึงถึงสิ่งนั้น

ฉันยังไม่ได้ทดสอบเลย แต่มันอาจใช้ได้ถ้าคุณลงมือทำทันทีหลังจากที่คุณลงทะเบียน permaststructs ทั้งหมดที่คุณต้องการ:

class RRSwitcher {
  var $rules;
  function RRSwitcher(){
    add_filter( 'topic_rewrite_rules', array( $this, 'topics' ) );
    add_filter( 'rewrite_rules_array', array( $this, 'rules' ) );
  }
  function topics( $array ){
    $this->rules = $array;
    return array();
  }
  function rules( $array ){
    return array_merge( (array)$array, (array)$this->rules );
  }
}
$RRSwitcher = new RRSwitcher();
global $wp_rewrite;
$wp_rewrite->use_verbose_rules = true;
$wp_rewrite->flush_rules();

สิ่งนี้ทำอะไร: มันจะลบกฎการเขียนซ้ำที่สร้างขึ้นจากหัวข้อความคิดเห็นจากโฟลว์ปกติของกฎอาร์เรย์และรวมกฎเหล่านั้นอีกครั้งในตอนท้ายของอาร์เรย์ สิ่งนี้จะป้องกันกฎเหล่านั้นไม่ให้รบกวนกฎการเขียนซ้ำอื่น ๆ ถัดไปจะบังคับใช้กฎการเขียนซ้ำแบบละเอียด (แต่ละหน้าจะได้รับกฎส่วนบุคคลที่มีนิพจน์ทั่วไปที่ระบุ) สิ่งนี้ป้องกันไม่ให้หน้าเว็บรบกวนกฎของหัวข้อของคุณ ในที่สุดมันจะทำการล้างข้อมูล (ให้แน่ใจว่าไฟล์. htaccess ของคุณเขียนได้ไม่เช่นนั้นจะไม่สามารถใช้งานได้) และบันทึกกฎการเขียนซ้ำที่ซับซ้อนมากขึ้นอีกมากมาย


ลองแล้วไม่มีอะไรเปลี่ยนแปลง
onetrickpony

2

มีปลั๊กอินสำหรับการนี้

มันจะลบประเภทกระสุนโดยการเพิ่มกฎเฉพาะสำหรับแต่ละประเภทโพสต์ที่กำหนดเองหน้า


2

ไม่แน่ใจว่าสิ่งนี้จะใช้งานได้สำหรับ taxonomies หรือไม่ แต่สามารถใช้ได้กับประเภทโพสต์ที่กำหนดเอง

แม้ว่าจะไม่ได้รับการอัปเดตเป็นเวลา 2 ปี แต่ปลั๊กอินด้านล่างใช้งานได้กับฉัน: http://wordpress.org/plugins/remove-slug-from-custom-post-type/

FYI ฉันใช้ WP 3.9.1กับ WP Types1.5.7


2

ใช้สแลชเป็นค่าสำหรับทาก ... การทำงาน 100%

'rewrite' => array(
    'slug'       => '/', 
    'with_front' => FALSE
 ),

2
ไม่มากนี่ทำให้pageโพสต์ทั้งหมดเป็น404
Milo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.