Página única do tipo de postagem personalizada redirecionando para a página 404

2

Eu declarei o tipo de mensagem abaixo:

 $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'query_var' => true,
        'rewrite' => array('slug' => 'agences'),
        'capability_type' => 'post',
        'has_archive' => true,
        'hierarchical' => false,
        'menu_position' => 5,
        'taxonomies' => array('brands', 'country'),
        'supports' => array('title', 'editor', 'author', 'thumbnail', 'custom-fields')
    );

    register_post_type('destinations', $args);

Inicialmente, consegui acessar uma única página desse tipo de postagem usando single-agences.php , mas agora ela está redirecionando para o 404.

Verifiquei outras respostas e descobri que é um erro comum, mas outras respostas não conseguiram resolver isso. Qualquer ajuda será maravilhosa.

    
por Deepak jha 07.03.2016 / 15:23

2 respostas

0

Foi devido a um plugin "Remove slug base taxonomy". Ele estava em conflito com o slug base dos "destinos" do CPT. Eu tive que usar add_rewrite_rule para checar o slug e redirecioná-lo manualmente para o local correto

    
por Deepak jha 06.07.2017 / 06:51
9

CPT recém-registrado mostra 404 porque, o register_post_type() não libera as regras de reescrita. Então, cabe a você decidir se quer fazer isso manualmente ou automaticamente.

Manualmente:

Vá para /wp-admin/ e, em seguida, Configurações »Permalinks e pressione o botão Salvar alterações para liberar as regras de regravação.

Automaticamente:

Você pode liberar as regras de regravação usando a função flush_rewrite_rules() . Mas como register_post_type() é chamado em init hook, ele será disparado toda vez que o init hook for disparado. A mesma coisa que o códice está dizendo também:

  

Esta função é útil quando usada com tipos de postagem personalizados, pois permite a limpeza automática das regras de reescrita do WordPress (geralmente, precisa ser feito manualmente para novos tipos de postagens personalizadas). No entanto, esta é uma operação dispendiosa , por isso só deve ser usada quando for absolutamente necessário.

É por isso que é melhor ligar a coisa a algo que dispara uma vez e que flush regras quando necessário apenas. Como @cybmeta já mostrou isso para você. Mas você também pode seguir a abordagem do @bainternet:

/**
 * To activate CPT Single page
 * @author  Bainternet
 * @link http://en.bainternet.info/2011/custom-post-type-getting-404-on-permalinks
 * ---
 */
$set = get_option( 'post_type_rules_flased_mycpt' );
if ( $set !== true ){
    flush_rewrite_rules( false );
    update_option( 'post_type_rules_flased_mycpt', true );
}

Ele está salvando um valor para options table apenas para o tipo de postagem. E se o valor não estiver lá, ele está liberando regras de reescrita. Se está lá, ele não está fazendo isso.

Mas, por favor, note que está realmente fazendo uma chamada de banco de dados toda vez (se não estiver em cache). Então, eu prefiro ligar o código after_setup_theme para o tema, ou register_activation_hook para plug-in.

Bônus

Durante a depuração de regras de reescrita, plugins como esses podem ser muito úteis:

por Mayeenul Islam 07.03.2016 / 16:11