Template CPT Tidak Ditampilkan - Mendapatkan 404

8

Saya sedang mengembangkan plugin Jenis Posting Khusus, yang berfungsi dengan baik di dev. Sekarang saya sudah memindahkannya ke produksi, saya mendapatkan 404 ketika saya mencoba untuk menampilkan template untuk CPT.

Jadi, dua pertanyaan:

1- Apakah ada mekanisme untuk menentukan jalur yang diambil WP untuk melewati hierarki?

2 - Mengapa tidak hanya memberi saya halaman tunggal atau indeks?

Saya telah membuang $ wp_query dan sebuah stacktrace di akhir 404. Inilah bagian dari apa yang saya temukan:

[query] => Array
    (
        [page] => 
        [pagename] => refletters/proximity
    )

[request] => SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND (wp_posts.ID = '0') AND wp_posts.post_type = 'page'  ORDER BY wp_posts.post_date DESC 
[posts] => Array
    (
    )

[queried_object] => 
[queried_object_id] => 0

Dan jejak stack:

2013-04-27 22:16:41 - 24.52.197.40 - TRACE - index.php - 404.php[39] - 
    wordpress/wp-content/themes/notoriousconsultant/404.php[39] - aaLog->logtrace
    wordpress/wp-includes/template-loader.php[50] - include
    wordpress/wp-blog-header.php[16] - require_once
    wordpress/index.php[17] - require

Terima kasih atas bantuan Anda.

NotoriousWebmaster
sumber

Jawaban:

14

Selalu siram aturan penulisan ulang saat Anda mendaftarkan jenis pos publik baru atau taksonomi. Kalau tidak, aturan penulisan ulang internal tidak akan memperhitungkannya saat URL dipetakan ke kueri.

Anda dapat mengotomatiskan proses itu dengan menghubungkan ke registered_post_typedan registered_taxonomy.

Di bawah ini adalah kode yang diperbarui, berdasarkan umpan balik dari komentar dan orang lain.

Unduh sebagai plugin T5 Silent Flush di GitHub.

add_action( 'registered_post_type', 't5_silent_flush_cpt', 10, 2 );
add_action( 'registered_taxonomy',  't5_silent_flush_tax', 10, 3 );

/**
 * Flush rules for custom post types.
 *
 * @wp-hook registered_post_type
 * @param   string $post_type
 * @param   stdClass $args
 * @return  void
 */
function t5_silent_flush_cpt( $post_type, $args )
{
    if ( $args->_builtin )
        return;

    if ( ! $args->public )
        return;

    if ( ! $args->publicly_queryable )
        return;

    if ( ! $args->rewrite )
        return;

    $slug = $post_type;

    if ( isset ( $args->rewrite['slug'] ) && is_string( $args->rewrite['slug'] ) )
        $slug = $args->rewrite['slug'];

    $rules = get_option( 'rewrite_rules' );

    if ( ! isset ( $rules[ $slug . '/?$'] ) )
        flush_rewrite_rules( FALSE );
}

/**
 * Flush rules for custom post taxonomies.
 *
 * @wp-hook registered_taxonomy
 * @param   string $taxonomy
 * @param   string $object_type
 * @param   array  $args
 * @return  void
 */
function t5_silent_flush_tax( $taxonomy, $object_type, $args )
{
    // No idea why we get an array here, but an object for post types.
    // Objects are easier to write, so ...
    $args = (object) $args;

    if ( $args->_builtin )
        return;

    if ( ! $args->public )
        return;

    if ( ! $args->rewrite )
        return;

    $slug = $taxonomy;

    if ( isset ( $args->rewrite['slug'] ) && is_string( $args->rewrite['slug'] ) )
        $slug = $args->rewrite['slug'];


    $rules = get_option( 'rewrite_rules' );

    if ( ! isset ( $rules[ $slug . '/(.+?)/?$'] ) )
        flush_rewrite_rules( FALSE );
}

Ini akan menghapus aturan setiap kali Anda membuat jenis posting baru atau taksonomi. Tidak perlu mengunjungi pengaturan permalink lagi.

fuxia
sumber
Saya sedang berpikir untuk menambahkan ini ke plugin CPT itu sendiri. Tampaknya tidak masuk akal untuk meminta pengguna untuk memiliki plugin lain agar plugin saya berfungsi.
NotoriousWebmaster
Ya tentu saja. Saya hanya ingin memberikan contoh yang dapat digunakan kembali untuk pembaca lain dengan masalah yang sama.
fuxia
8
Kedengarannya seperti ini seharusnya ada di inti
Scott Kingsley Clark
Punya beberapa pertanyaan tentang ini: apakah ini akan menjadi sumber daya intensif seperti pembilasan aturan penulisan ulang dan apakah ini berjalan setiap kali WP dimuat?
Manny Fleurmond
@MannyFleurmond Ya, itu akan berjalan setiap kali jenis posting terdaftar. Tetapi aturan hanya memerah ketika diperlukan, dan get_option()nilai berasal dari cache.
fuxia