Bagaimana WordPress menghasilkan siput URL?


Jawaban:


16

Dari kelelawar, saya tidak bisa memberi Anda halaman / tutorial / dokumentasi tentang bagaimana siput WP dihasilkan, tetapi lihat sanitize_title()fungsinya.

Jangan mendapatkan kesan yang salah dengan nama fungsi, itu tidak dimaksudkan untuk membersihkan judul untuk penggunaan lebih lanjut sebagai judul halaman / posting . Dibutuhkan string judul dan mengembalikannya untuk digunakan dalam URL:

  • strip HTML & PHP
  • strip karakter khusus
  • mengubah semua karakter menjadi huruf kecil
  • menggantikan spasi putih, garis bawah dan titik dengan tanda hubung / garis putus-putus
  • mengurangi beberapa strip berturut-turut menjadi satu

Ada mungkin menjadi kasus di mana tepi inti melakukan sesuatu tambahan (Anda harus melihat sumber untuk memverifikasi bahwa sanitize_title()akan selalu cukup dalam menghasilkan persis sama yang Anda harapkan), tapi ini harus mencakup setidaknya 99%, jika tidak semua, kasus .


1
@kaiser: Saya pikir Anda hanya jatuh cinta dengan T5 Rewrite :) (yang ada di agenda saya untuk check-out) | dan umumnya: Jika sebuah judul sangat panjang, WP juga memotong siput hingga panjang maksimum tertentu. Itu salah satu kasus di mana saya tidak sepenuhnya yakin apakah itu dilakukan oleh sanitize_titlefilter yang diterapkan dalam fungsi juga, atau apakah itu ditangani oleh sesuatu yang lain setelah fungsi dijalankan.
Johannes Pille

Saya kira itu adalah- sanitize_titlefilter yang perlu diperiksa. Tetapi ada juga fungsi terkait lainnya . Saya benar-benar tidak tahu tentang ini. Kadang-kadang tampaknya SimplePielebih mudah dipahami daripada WP_Rewriteitu. Btw: Toscho berfungsi mengintegrasikan fungsi "Monkeyman Rewrite Analyzer" ke dalam plugin-nya. Di situlah hal-hal mulai menjadi sangat menarik.
kaiser

1
Juga pertimbangkan sanitize_title_with_dashes () jika Anda ingin sedikit lebih eksplisit tentang menghasilkan siput ramah URL.
Tom Auger

5

Anda dapat menggunakan fungsi ini:

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;
}

Ini semacam bagaimana fungsi wp url berfungsi.


4

Inti siap melayani Anda

Tidak ada mode pengembang selain WordPress WP_DEBUGyang tidak banyak membantu Anda dalam hal ini. Pada dasarnya WP menggunakan "Rewrite API" , yang merupakan fungsi, pembungkus tingkat rendah untuk WP_Rewritekelas, yang dapat Anda baca di Codex . The global $wp_rewriteobjek berdiri di layanan Anda untuk memeriksa atau berinteraksi dengan kelas.

Plugin yang membantu mencarinya.

Toschos "T5 Rewrite" -Plugin dan Jan Fabrys "Monkeyman Rewrite Analyzer" -Plugin akan memandu jalan Anda. Saya telah menulis ekstensi kecil untuk "T5 Rewrite" untuk memadukannya dengan lancar dengan "Monkeyman Rewrite Analyzer", yang dapat Anda temukan di wiki wiki "T5 Rewrite" di GitHub .

"Monkeyman" -plugin menambahkan halaman baru, diajukan di menu UI admin di bawah Tools . "T5 Rewrite" -plugin menambahkan tab bantuan baru ke halaman Pengaturan > Permalinks . Ekstensi saya menambahkan tab bantuan ke Alat- halaman yang disebutkan juga.

Berikut adalah tangkapan layar dari apa yang tampak seperti konten tab "T5 Rewrite" bantuan.

masukkan deskripsi gambar di sini

Vorlage = Pola | Beschreibung = Penjelasan | Beispiele = Contoh

Catatan

"T5 Rewrite" -plugin melakukan pekerjaan yang luar biasa dengan membantu Anda memeriksa objek penulisan ulang. Dan itu bahkan lebih: itu menambah kemungkinan baru. Oleh karena itu (paling tidak di instalasi saya) bagian dari paket plugin dasar saya.


2

Sebenarnya, jika Anda melihat fungsi inti wp_insert_post (post.php), Anda akan melihat bahwa ia melakukan hal berikut:

$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 );

Kuncinya adalah menggunakan wp_unique_post_slug dan sanitize_title:

wp_unique_post_slug( sanitize_title( 

0

Maafkan untuk melanjutkan pertanyaan lama, tetapi saya memiliki kebutuhan yang sama ketika mengetahui metode ini bekerja dengan baik untuk saya:

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

Metode ini menggunakan sanitasi ganda.

Yang pertama menggunakan save mode, di mana tag HTML dan PHP dilucuti, dan aksen dihapus (karakter beraksen diganti dengan non-aksen setara).

Kedua queryMode memastikan semua ruang diganti dengan tanda hubung -dan tanda baca lainnya dihapus.

Semoga ini bisa membantu seseorang! :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.