Regras de reescrita do WordPress para tipo de postagem e taxonomia personalizadas

9

Descobri que este lugar era uma boa fonte de informações no passado, através de muitos estudos no Google sobre os problemas que encontrei. Minha pergunta diz respeito às regras detalhadas de reescrita que o WordPress usa.

Eu configurei um tipo de postagem personalizado chamado projeto e registrei uma taxonomia personalizada chamada projetos . Tudo funciona muito bem, exceto pelas opções de reescrita de lesmas, pois elas acabam em conflito - provavelmente devido às regras de reescrita.

Basicamente, esta é a estrutura que pretendo alcançar:

  • example.com/work/%taxonomy%/%post_name%/ (para postagens)
  • example.com/work/%taxonomy%/ (listar postagens pertencentes a um termo de taxonomia específico)
  • example.com/work/ (acesse page-work.php, que inclui taxonomy.php, para listar todas as postagens associadas a essa taxonomia)

Aqui está o código que tenho até agora, mas preciso de ajuda para escrever as regras WP_Rewrite, já que este é o bit em que estou um pouco perplexo.

$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => ''
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'hierarchical' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // It's a custom post type, not built in!
    'capability_type' => 'post',
    'query_var' => "project", // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type('project' , $args);

// Showcase Taxonomy
register_taxonomy('projects', array('project'), array(
    'public' => true,
    'hierarchical' => true,
    'label' => 'Project Categories', 
    'singular_label' => 'Project Category',
    'query_var' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false, 'hierarchical'=>true)
    )
);

Muito obrigado pela sua ajuda! :-)

matt_d_rat
fonte
@ChristopherDavis Obrigado, vou dar uma olhada neles um pouco mais e ver como me dou.
matt_d_rat
11
Acho que essa pergunta pode ser respondida olhando para Misturar estruturas de tipo de postagem e taxonomia reescritas personalizadas. Se essa pergunta não o ajudar, edite-a para indicar como é diferente.
Jan Fabry

Respostas:

1

Espero que isso possa resolver seu problema

function my_custom_post_type() {
$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => '',
    'menu_name' => 'Projects' 
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
        'hierarchical' => false,
        'has_archive' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // It's a custom post type, not built in!
    'capability_type' => 'post',
        'query_var' => true, // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type( 'work' , $args );

}
function my_custom_taxonomies() {

    $labels = array(
        'name' => __( 'Taxonomy', 'taxonomy general name' ),
        'singular_name' => __( 'Taxonomy', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Taxonomy' ),
        'all_items' => __( 'All Taxonomy' ),
        'parent_item' => __( 'Parent Taxonomy' ),
        'parent_item_colon' => __( 'Parent Taxonomy:' ),
        'edit_item' => __( 'Edit Taxonomy' ), 
        'update_item' => __( 'Update Taxonomy' ),
        'add_new_item' => __( 'Add New Taxonomy' ),
        'new_item_name' => __( 'New Taxonomy Name' ),
        'menu_name' => __( 'Taxonomy' ),
    );  

    register_taxonomy( 'taxonomy', array('work'), array (
                    'labels' => $labels,
                    'hierarchical' =>false,
                    'show_ui' => true,
                    'rewrite' => array( 'slug' => 'work/taxonomy'),
                    'query_var' => true,
                    'show_in_nav_menus' => true,
                    'public' => true,
            ));
}

add_action('init', 'my_custom_post_type', 0);
add_action('init', 'my_custom_taxonomies', 10);

o que você precisa criar é archive-work.php (seu arquivo de tipo de postagem) e taxonomy.php, que será usado para mostrar seu arquivo de taxonomia personalizado.

sem sentido
fonte
não esqueça de alterar a "taxonomia" para seu próprio nome de taxonomia. Não use o mesmo valor que seu post_type. tente usar a categoria na primeira tentativa. trabalho / categoria, register_taxonomy ('categoria, matriz (' trabalho '), matriz (......
nonsensecreativity
1

Eu tive o mesmo problema e, depois de muita luta, acabei com essa solução.
Basta adicionar isso ao seu código

global $wp_rewrite;
$wp_rewrite->flush_rules(); 

function my_custom_post_type() {
    $labels = array(
        'name' => _x('Projects', 'post type general name'),
        'singular_name' => _x('Project', 'post type singular name'),
        'add_new' => _x('Add New', 'project item'),
        'add_new_item' => __('Add New Project'),
        'edit_item' => __('Edit Project'),
        'new_item' => __('New Project'),
        'view_item' => __('View Project'),
        'search_items' => __('Search Projects'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => '',
        'menu_name' => 'Projects' 
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
            'hierarchical' => false,
            'has_archive' => true,
        'rewrite' => array('slug'=>'work', 'with_front'=>false),
        'show_ui' => true,
        '_builtin' => false, // It's a custom post type, not built in!
        'capability_type' => 'post',
            'query_var' => true, // This goes to the WP_Query schema
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
    );

    register_post_type( 'work' , $args );

    global $wp_rewrite;   
    $wp_rewrite->flush_rules();    // this should help 
}
Dipesh KC
fonte
5
$ wp_rewrite-> flush_rules () não deve ser executado com tanta frequência, deve ser executado apenas nos ganchos de ativação ou desativação ou com a menor moderação possível. É o que diz aqui: codex.wordpress.org/Rewrite_API/flush_rules TAMBÉM é praticamente a mesma função como esta: codex.wordpress.org/Function_Reference/flush_rewrite_rules
Jared
Em outra nota, é assim que eu conseguido isso: pastebin.com/k7QvxKLi
Jared
@ Jared Obrigado por apontar, mas não consegui descobrir uma maneira de fazer isso quando isso estiver integrado ao nosso tema (ou seja, não via plugin). Por favor sugira.
Dipesh KC
O código entraria functions.phpnesse caso. O código para um plugin e um tema é exatamente o mesmo, a única diferença é em temas que sempre acontece em functions.phpou um arquivo incluídos nofunctions.php
Jared
2
Eu sugeriria usar o after_switch_themegancho, é novo no 3.3 (IIRC).
Cristian
0

Uma explicação mais detalhada está em outro post , mas aqui estão as partes básicas que você precisa adicionar:

  1. Registre suas taxonomias e cpt's como você faz. Verifique se a lesma reescrita do taxo é "basename" e se a reescrita slug do cpt é "basename /% tax_name%".

  2. Diga ao wordpress o que fazer com "% tax_name%" assim:

    function filter_post_type_link($link, $post)
    {
    if ($post->post_type != 'custom_post_type_name')
        return $link;
    
    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%',array_pop($cats)->term_id, link); // see custom function defined below
    }
    return $link;
    }
    add_filter('post_type_link', 'filter_post_type_link', 10, 2);
    
Jeff
fonte