Reguły przepisywania WordPress dla niestandardowego typu postu i taksonomii

9

Przekonałem się, że to miejsce było dobrym źródłem informacji w przeszłości przez wiele Googlingów na temat problemów, które napotkałem. Moje pytanie dotyczy pełnych reguł przepisywania używanych przez WordPress.

Skonfigurowałem niestandardowy typ postu o nazwie projekt i zarejestrowałem niestandardową systematykę o nazwie projekty . Wszystko działa świetnie, z wyjątkiem opcji przepisywania informacji o błędzie, ponieważ mogą powodować konflikty - najprawdopodobniej z powodu reguł przepisywania.

Zasadniczo jest to struktura, którą chcę osiągnąć:

  • example.com/work/%taxonomy%/%post_name%/ (dla postów)
  • example.com/work/%taxonomy%/ (wymień posty należące do określonego terminu systematyki)
  • example.com/work/ (idzie do page-work.php, który zawiera taxonomy.php, aby wyświetlić listę wszystkich postów związanych z tą taksonomią)

Oto kod, który mam do tej pory, ale potrzebuję pomocy w pisaniu reguł WP_Rewrite, ponieważ jest to kawałek, na którym jestem trochę zaskoczony.

$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)
    )
);

Wielkie dzięki za Twoją pomoc! :-)

matt_d_rat
źródło
@ChristopherDavis Dzięki, przyjrzę się im trochę więcej i zobaczę, jak sobie radzę.
matt_d_rat
1
Myślę, że można odpowiedzieć na to pytanie, łącząc niestandardowe typy postów i struktury przepisywania taksonomii? Jeśli to pytanie ci nie pomoże, edytuj to pytanie, aby wskazać, jak jest różne.
Jan Fabry

Odpowiedzi:

1

Mam nadzieję, że to rozwiąże problem

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);

to, co musisz utworzyć, to archive-work.php (archiwum typu postu) i taxonomy.php, które wykorzystają do wyświetlenia niestandardowego archiwum taksonomii.

nonsensecreativity
źródło
nie zapomnij zmienić „taksonomii” dla własnej nazwy taksonomii. Nie używaj tej samej wartości, co typ postu. spróbuj użyć kategorii za pierwszym razem. praca / kategoria, register_taxonomy („kategoria, tablica („ praca ”), tablica (......
nonsensecreativity,
1

Miałem ten sam problem i po wielu zmaganiach skończyłem z tym rozwiązaniem.
Po prostu dodaj to do swojego kodu

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
źródło
5
$ wp_rewrite-> flush_rules () nie powinien być uruchamiany tak często, powinien być uruchamiany tylko przy aktywacji lub dezaktywacji haczyków lub tak oszczędnie, jak to możliwe. Tutaj jest napisane: codex.wordpress.org/Rewrite_API/flush_rules TAKŻE jest prawie taka sama jak ta: codex.wordpress.org/Function_Reference/flush_rewrite_rules
Jared
Z drugiej strony tak to osiągnąłem: pastebin.com/k7QvxKLi
Jared
@Jared Dziękuję za wskazanie, ale nie mogłem znaleźć sposobu, aby to osiągnąć, gdy jest to zintegrowane z naszym motywem (tj. Nie za pośrednictwem wtyczki). Proszę zasugeruj.
Dipesh KC
W takim przypadku kod by się functions.phppojawił. Kod wtyczki i motywu jest dokładnie taki sam, jedyną różnicą są motywy, w których zawsze się znajduje, functions.phplub plik zawartyfunctions.php
Jared
2
Sugerowałbym użycie after_switch_themehaka, jest nowy w wersji 3.3 (IIRC).
Cristian
0

Bardziej szczegółowe wyjaśnienie znajduje się w innym poście , ale oto podstawowe części, które musisz dodać:

  1. Zarejestruj swoje taksonomie i kpt. Upewnij się, że Twój podrożnik dla taksówki to „basename”, a przerób dla cpt to „basename /% nazwa_atrybutu%”.

  2. Powiedz wordpressowi, co zrobić z „% tax_name%” w następujący sposób:

    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
źródło