Modelo de CPT não exibido - Obtendo 404

8

Estou desenvolvendo um plug-in Custom Post Type, que funciona bem em dev. Agora que o mudei para produção, recebo um 404 quando tento exibir o modelo para o CPT.

Então, duas perguntas:

1- Existe algum mecanismo para determinar o caminho que o WP percorreu na hierarquia?

2- Por que isso não me deu apenas a página única ou de índice?

Eu joguei $ wp_query e um stacktrace no final do 404. Aqui está parte do que encontrei:

[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

E o rastreamento da pilha:

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

Obrigado pela ajuda.

NotoriousWebmaster
fonte

Respostas:

14

Sempre libere as regras de reescrita ao registrar um novo tipo ou taxonomia de publicação pública. Caso contrário, as regras internas de reescrita não levarão isso em consideração quando um URL for mapeado para uma consulta.

Você pode automatizar esse processo conectando registered_post_typee registered_taxonomy.

Abaixo está o código atualizado, com base nos comentários dos comentários e de outras pessoas.

Faça o download como plugin T5 Silent Flush no 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 );
}

Isso liberará as regras sempre que você criar um novo tipo ou taxonomia de postagem. Não há necessidade de visitar as configurações de link permanente novamente.

fuxia
fonte
Estou pensando em adicionar isso ao próprio plugin CPT. Não parece fazer sentido exigir que um usuário tenha outro plug-in para que meu plug-in funcione.
precisa
Sim, claro. Eu só queria fornecer um exemplo reutilizável para outros leitores com o mesmo problema.
fuxia
8
Parece que isso deve ser essencial
Scott Kingsley Clark
Tiveram algumas perguntas sobre isso: será tão intensivo em recursos quanto liberar as regras de reescrita e isso será executado toda vez que o WP carregar?
Manny Fleurmond
@MannyFleurmond Sim, ele será executado sempre que o tipo de postagem for registrado. Mas as regras são liberadas apenas quando necessário e o get_option()valor vem do cache.
fuxia