Tambahkan ekstensi .html (dot HTML) ke jenis pos khusus

10

Apakah ada cara untuk menambahkan .htmlekstensi ke jenis posting khusus tanpa plugin ?

Untuk posting saya bisa gunakan /%postname.htmlpada pengaturan permalink

Untuk halaman saya bisa menggunakan:

add_action('init', 'change_page_permalink', -1);
function change_page_permalink() {
    global $wp_rewrite;
    if ( strstr($wp_rewrite->get_page_permastruct(), '.html') != '.html' ) 
        $wp_rewrite->page_structure = $wp_rewrite->page_structure . '.html';
}

Untuk jenis pos kustom ???

Apakah ada kode yang mirip dengan kode di atas yang memungkinkan saya untuk mengubah atau menambahkan .htmlurl jenis posting kustom?

pengguna983248
sumber
5
Hanya ingin tahu untuk alasan apa Anda ingin menambahkan .html?
Vince Pettit
Nah, function post-type_permalinkakan terjadi kesalahan. Jika Anda tidak menerima kesalahan ini, berarti ada yang salah dengan pengaturan debug Anda. Juga tolong ulang pertanyaan Anda dengan niat yang benar di telepon. Terima kasih.
kaiser
@kaiser, Apakah hanya untuk mengetahui bagaimana saya dapat menggunakan pengaturan permalink yang sama pada jenis posting khusus. Jika saya mengatur /$postname.htmluntuk posting, bagaimana saya bisa menggunakan yang sama untuk jenis posting kustom.
user983248
Anda tidak membaca satu baris pun yang saya tulis dalam komentar saya, kan? Harap perbaiki kode Anda. Juga -tidak berfungsi dalam nama fungsi ...
kaiser
@kaiser Ya saya lakukan, tapi saya bukan Flash, dan saya punya masalah tangan, jadi saya tidak bisa mengetik seperti yang saya pikirkan atau bicarakan
user983248

Jawaban:

8

Ini sepertinya berhasil:

Buat aturan menulis ulang seperti post-type/post-name.html. Anda dapat menggunakan array untuk membuat aturan hanya untuk beberapa set tipe posting alih-alih melakukannya untuk semuanya.

add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
    $new_rules = array();
    foreach ( get_post_types() as $t )
        $new_rules[ $t . '/([^/]+)\.html$' ] = 'index.php?post_type=' . $t . '&name=$matches[1]';
    return $new_rules + $rules;
}

Format struktur permalink baru untuk jenis posting ini.

add_filter( 'post_type_link', 'custom_post_permalink' ); // for cpt post_type_link (rather than post_link)
function custom_post_permalink ( $post_link ) {
    global $post;
    $type = get_post_type( $post->ID );
    return home_url( $type . '/' . $post->post_name . '.html' );
}

Dan kemudian berhenti mengarahkan ulang URL kanonik untuk menghapus garis miring tambahan. Ini mungkin memerlukan beberapa pekerjaan lagi, karena Anda mungkin ingin menyimpan pengalihan untuk sebagian besar kasus.

add_filter( 'redirect_canonical', '__return_false' );

Seperti yang orang lain katakan di sekitar sini, setelah melakukan hal di atas Anda harus menyiram aturan, dan itu mungkin dengan mengunjungi options-permalink.phphalaman admin di Dashboard -> Settings -> Permalinks.

vmassuchetto
sumber
6
Oi Vinicius, praktik menjawab yang baik adalah dengan awalan semua nama fungsi dengan wpse_59024_ (ID Pertanyaan) untuk menghindari konflik salinan / pasta;). . . Dan memiliki manfaat tambahan untuk mengetahui Jawaban mana yang dimiliki kode itu di pustaka cuplikan kami. . . . . +1 Tempat di!
brasofilo
Kode ini akan menimpa filter lain yang menggunakan post_type_linkfilter
Tom J Nowell
4

Anda dapat menambahkan aturan penulisan ulang untuk ini yang menggantikan permalink bawaan, misalnya untuk "produk" jenis pos kustom ...

add_action('init', 'add_html_ext_to_custom_post_types');
function add_html_ext_to_custom_post_types() {
    add_rewrite_rule('^product/([^/]+)\.html', 'index.php?product=$matches[1]', 'top');
}

(Jangan lupa untuk menyiram aturan Anda baik dengan menyimpan kembali permalink Anda atau menggunakan flush_rulescara @toscho note di atas).

Peringatan

  • Saya tidak berpikir fungsi seperti the_permalink()akan menggunakan ini, jadi Anda mungkin harus menambahkan filter untuk post_linkmenangkap tautan tersebut. Anda juga dapat menambahkan ke redirect_canonicalfilter untuk mengarahkan ulang permalink default, sehingga / product / foo dan / product / foo / redirect ke /product/foo.html.
  • Anda perlu menambahkan penulisan ulang tambahan untuk URL lain yang digunakan situs Anda, seperti URL feed, halaman berikutnya, trackback, dll. Kode di atas hanya akan berfungsi untuk halaman Jenis Posting Kustom utama.
Matthew Boynes
sumber
2

Jika Anda lebih suka plugin WordPress untuk menangani pekerjaan untuk Anda, lihat Permalink Jenis Posting Kustom di repositori plugin WordPress. Diuji pada WordPress 3.4.1 dan bekerja dengan sempurna.

Setelah mengaktifkan plugin, cukup arahkan ke Dashboard -> Pengaturan -> Permalinks. Anda dapat menambahkan penulisan ulang khusus untuk setiap jenis posting kustom terdaftar.

Michael Ecklund
sumber
3
Jangan menyiram aturan penulisan ulang pada setiap pemuatan halaman.
fuxia
kode itu tidak berfungsi, juga jika Anda hanya menyalin dan menempelkan kode dari xplus3.net/2010/05/20/wp3-custom-post-type-permalinks pastikan kode itu berfungsi seperti yang diharapkan -1 untuk tidak diuji
user983248
@toscho, bagaimana menurut Anda untuk melakukan itu atau menghentikannya?
user983248
1
flush_rules()harus dipanggil pada de / aktivasi hanya karena sangat lambat. Anda dapat memeriksa $GLOBALS['wp_rewrite']->rulesuntuk melihat apakah aturannya sudah diketahui.
fuxia
@Michael Ecklund Ini memberi saya 404 tidak bekerja. Apakah Anda menguji kode itu?
user983248