WordPress สร้างทาก URL อย่างไร


17

มีหน้าเว็บบางแห่งที่มีรายละเอียดอย่างชัดเจนว่า WordPress สร้างทากสำหรับ URL หรือไม่? ฉันกำลังเขียนสคริปต์ที่ต้องการสร้างทาก URL ที่เหมือนกับ WordPress สร้าง


คำตอบสำหรับคำถามนี้ล้าสมัยแล้ว - ใช้codex.wordpress.org/Function_Reference/wp_unique_post_slugแทน
SinisterBeard

คำตอบ:


16

ปิดแบ็ตฉันไม่สามารถให้หน้า / กวดวิชา / เอกสารเกี่ยวกับวิธีสร้างทาก WP แต่ดูที่sanitize_title()ฟังก์ชั่น

ไม่ได้รับความประทับใจที่ไม่ถูกต้องโดยใช้ชื่อฟังก์ชั่นก็จะไม่ได้หมายถึงการฆ่าเชื้อชื่อสำหรับการใช้งานต่อไปในฐานะหน้า / ชื่อโพสต์ ใช้สตริงชื่อและส่งคืนเพื่อใช้ใน URL:

  • แถบ HTML และ PHP
  • ตัดแถบอักขระพิเศษ
  • แปลงอักขระทั้งหมดเป็น lowercaps ที่ต่ำกว่า
  • แทนที่ whitespaces, underscores และ period โดยไฮเฟน / ขีดกลาง
  • ลดขีดคั่นต่อเนื่องหลายอันให้เป็นหนึ่ง

มีอาจจะเป็นกรณีที่ขอบหลักทำอะไรบางอย่างเพิ่มเติม (คุณจะต้องมองไปที่แหล่งที่มาเพื่อตรวจสอบว่าsanitize_title()จะเสมอพอเพียงในการสร้างตรงเดียวกับที่คุณคาดหวัง) แต่นี้ควรจะครอบคลุมอย่างน้อย 99% หากไม่ได้ทุกกรณี .


1
@kaiser: ฉันคิดว่าคุณเป็นเพียงแค่ความรักกับT5 Rewrite :) (ซึ่งอยู่ในวาระการประชุมของฉันที่จะตรวจสอบ) | และโดยทั่วไป: หากชื่อมีความยาวจริง ๆ WP ก็ตัดทากให้เหลือความยาวสูงสุด นี่เป็นหนึ่งในกรณีที่ฉันไม่แน่ใจว่าsanitize_titleตัวกรองที่ใช้ในฟังก์ชั่นนั้นดีหรือไม่หรือว่าถูกจัดการโดยอย่างอื่นหลังจากที่ฟังก์ชั่นทำงาน
Johannes Pille

ฉันเดาว่ามันเป็นฟิลเตอร์sanitize_titleที่ต้องเช็คเอาท์ แต่มีกำลังยังคนอื่น ๆฟังก์ชั่นที่เกี่ยวข้อง ฉันไม่รู้เกี่ยวกับสิ่งนี้จริงๆ บางครั้งดูเหมือนว่าSimplePieจะเข้าใจง่ายกว่าWP_Rewriteสิ่งนั้น Btw: Toscho ทำงานกับการรวมฟังก์ชั่น "Monkeyman Rewrite Analyzer" เข้ากับปลั๊กอินของเขา นั่นคือสิ่งที่เริ่มน่าสนใจจริงๆ
ไกเซอร์

1
พิจารณาsanitize_title_with_dashes ()ถ้าคุณต้องการให้ชัดเจนยิ่งขึ้นเกี่ยวกับการสร้างกระสุนที่เป็นมิตรกับ URL
Tom Auger

5

คุณสามารถใช้ฟังก์ชั่นนี้:

static public function slugify($text)
{
  // replace non letter or digits by -
  $text = preg_replace('~[^\pL\d]+~u', '-', $text);

  // transliterate
  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

  // remove unwanted characters
  $text = preg_replace('~[^-\w]+~', '', $text);

  // trim
  $text = trim($text, '-');

  // remove duplicate -
  $text = preg_replace('~-+~', '-', $text);

  // lowercase
  $text = strtolower($text);

  if (empty($text)) {
    return 'n-a';
  }

  return $text;
}

มันเป็นวิธีการทำงานของฟังก์ชั่น wp url sanitize


4

หลักที่บริการของคุณ

ไม่มีโหมดผู้พัฒนาที่ติดตั้งไว้ใน WordPress WP_DEBUGซึ่งไม่ได้ช่วยอะไรคุณมากเกินไปในกรณีนี้ โดยทั่วไป WP ใช้"API Rewrite"ซึ่งเป็นฟังก์ชั่นที่ใช้ห่อหุ้มในระดับต่ำสำหรับWP_Rewriteระดับซึ่งคุณสามารถอ่านเกี่ยวกับใน Codex global $wp_rewriteวัตถุยืนที่บริการของคุณเพื่อตรวจสอบได้หรือโต้ตอบกับชั้นเรียน

ปลั๊กอินที่ช่วยให้มองเข้าไปในมัน

Toschos "T5 Rewrite" -PluginและJan Fabrys "Monkeyman Rewrite Analyzer" --Pluginจะแนะนำเส้นทางของคุณ ผมเคยเขียนส่วนขยายขนาดเล็กสำหรับ "T5 Rewrite" ได้อย่างราบรื่นรวมกับ "Monkeyman Rewrite วิเคราะห์" ซึ่งคุณสามารถหาได้ใน "T5 Rewrite" Repos wikie นี่บน GitHub

"การ Monkeyman" -plugin เพิ่มหน้าใหม่ยื่นในเมนู UI ผู้ดูแลระบบภายใต้เครื่องมือ "การ T5 Rewrite" -plugin เพิ่มแท็บความช่วยเหลือใหม่ให้กับการตั้งค่า > Permalinksหน้า ส่วนขยายของฉันเพิ่มแท็บความช่วยเหลือไปยังเครื่องมือที่กล่าวถึง - หน้าด้วย

ต่อไปนี้เป็นภาพหน้าจอของสิ่งที่ "แท็บการเขียนซ้ำ T5" - เนื้อหาแท็บความช่วยเหลือดูเหมือน

ป้อนคำอธิบายรูปภาพที่นี่

Vorlage = รูปแบบ | Beschreibung = คำอธิบาย | Beispiele = ตัวอย่าง

หมายเหตุ

"T5 Rewrite" -plugin ทำงานได้อย่างยอดเยี่ยมด้วยการช่วยคุณตรวจสอบวัตถุที่เขียนใหม่ และมันยังเพิ่มขึ้นอีก: เพิ่มความเป็นไปได้ใหม่ ๆ ดังนั้นอย่างน้อยมันก็เป็นส่วนหนึ่งของแพ็คเกจเสริมพื้นฐานของฉัน


2

ที่จริงแล้วถ้าคุณดูฟังก์ชั่นหลัก wp_insert_post (post.php) คุณจะเห็นว่ามันทำสิ่งต่อไปนี้:

$data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'], $post_ID ), $post_ID, $data['post_status'], $post_type, $post_parent );

$wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where );

สิ่งสำคัญที่ควรทราบคือการใช้ wp_unique_post_slug และ sanitize_title:

wp_unique_post_slug( sanitize_title( 

0

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

$some_string = "DON'T STOP ME NOW!";
$slug = sanitize_title(sanitize_title($some_string, '', 'save'), '', 'query');
echo $slug; // dont-stop-me-now

วิธีนี้ใช้การฆ่าเชื้อสองครั้ง

คนแรกใช้saveโหมดที่แท็ก HTML และ PHP ถูกถอดออกและสำเนียงจะถูกลบออก (ตัวอักษรเน้นเสียงจะถูกแทนที่ด้วยการเทียบเท่าที่ไม่เน้นเสียง)

queryโหมดที่สองช่วยให้มั่นใจว่ามีการเว้นวรรคทั้งหมดด้วยเครื่องหมายขีดกลาง-และเครื่องหมายวรรคตอนอื่น ๆ

หวังว่านี่จะช่วยใครซักคน! :)

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