Niestandardowy typ postu single- {custom} .php nie działa


19

Zrobiłem niestandardowy typ postu z nazwą maszyny special_media_post, a wordpress po prostu nie widzi single-special_media_post.php. Całkowicie przegrałem. Domyślnie utrzymuje index.php

Oto mój kod dla mojego niestandardowego typu postu i jego taksonomii:

//Post and Taxonomy stuff
//Register Custom Post Type
function special_media_post() {
$labels = array(
    'name'                => _x( 'Media Posts', 'Post Type General Name', 'text_domain' ),
    'singular_name'       => _x( 'Media Post', 'Post Type Singular Name', 'text_domain' ),
    'menu_name'           => __( 'Media Post', 'text_domain' ),
    'parent_item_colon'   => __( 'Media Post:', 'text_domain' ),
    'all_items'           => __( 'All Media Posts', 'text_domain' ),
    'view_item'           => __( 'View Media Post', 'text_domain' ),
    'add_new_item'        => __( 'Add New Media Post', 'text_domain' ),
    'add_new'             => __( 'New Media Post', 'text_domain' ),
    'edit_item'           => __( 'Edit Media Post', 'text_domain' ),
    'update_item'         => __( 'Update Media Post', 'text_domain' ),
    'search_items'        => __( 'Search Media Posts', 'text_domain' ),
    'not_found'           => __( 'No media posts found', 'text_domain' ),
    'not_found_in_trash'  => __( 'No media posts found in Trash', 'text_domain' ),
);

$rewrite = array(
    'slug'                => 'mediapost',
    'with_front'          => true,
    'pages'               => true,
    'feeds'               => true,
);

$args = array(
    'label'               => __( 'mediapost', 'text_domain' ),
    'description'         => __( 'Post Type for Media', 'text_domain' ),
    'labels'              => $labels,
    'supports'            => array( 'title', 'editor', 'custom-fields', ),
    'taxonomies'          => array( 'year', 'type' ),
    'hierarchical'        => false,
    'public'              => true,
    'show_ui'             => true,
    'show_in_menu'        => true,
    'show_in_nav_menus'   => true,
    'show_in_admin_bar'   => true,
    'menu_position'       => 5,
    'can_export'          => true,
    'has_archive'         => true,
    'exclude_from_search' => false,
    'publicly_queryable'  => true,
    'query_var'           => 'mediapost',
    'rewrite'             => $rewrite,
    'capability_type'     => 'page',
);

register_post_type( 'special_media_post', $args );
}

// Register Custom Taxonomy
function media_year()  {
$labels = array(
    'name'                       => _x( 'Years', 'Taxonomy General Name', 'text_domain' ),
    'singular_name'              => _x( 'Year', 'Taxonomy Singular Name', 'text_domain' ),
    'menu_name'                  => __( 'Year', 'text_domain' ),
    'all_items'                  => __( 'All Years', 'text_domain' ),
    'parent_item'                => __( 'Parent Year', 'text_domain' ),
    'parent_item_colon'          => __( 'Parent Year:', 'text_domain' ),
    'new_item_name'              => __( 'New Year Name', 'text_domain' ),
    'add_new_item'               => __( 'Add New Year', 'text_domain' ),
    'edit_item'                  => __( 'Edit Year', 'text_domain' ),
    'update_item'                => __( 'Update Year', 'text_domain' ),
    'separate_items_with_commas' => __( 'Separate years with commas', 'text_domain' ),
    'search_items'               => __( 'Search years', 'text_domain' ),
    'add_or_remove_items'        => __( 'Add or remove years', 'text_domain' ),
    'choose_from_most_used'      => __( 'Choose from the most used yearss', 'text_domain' ),
);

$rewrite = array(
    'slug'                       => 'year',
    'with_front'                 => true,
    'hierarchical'               => true,
);

$capabilities = array(
    'manage_terms'               => 'manage_categories',
    'edit_terms'                 => 'manage_categories',
    'delete_terms'               => 'manage_categories',
    'assign_terms'               => 'edit_posts',
);

$args = array(
    'labels'                     => $labels,
    'hierarchical'               => true,
    'public'                     => true,
    'show_ui'                    => true,
    'show_admin_column'          => true,
    'show_in_nav_menus'          => true,
    'show_tagcloud'              => true,
    'query_var'                  => 'year',
    'rewrite'                    => $rewrite,
    'capabilities'               => $capabilities,
);

register_taxonomy( 'year', 'special_media_post', $args );
}

// Register Custom Taxonomy
function media_type()  {
$labels = array(
    'name'                       => _x( 'Types', 'Taxonomy General Name', 'text_domain' ),
    'singular_name'              => _x( 'Type', 'Taxonomy Singular Name', 'text_domain' ),
    'menu_name'                  => __( 'Type', 'text_domain' ),
    'all_items'                  => __( 'All Types', 'text_domain' ),
    'parent_item'                => __( 'Parent Type', 'text_domain' ),
    'parent_item_colon'          => __( 'Parent Type:', 'text_domain' ),
    'new_item_name'              => __( 'New Type Name', 'text_domain' ),
    'add_new_item'               => __( 'Add New Type', 'text_domain' ),
    'edit_item'                  => __( 'Edit Type', 'text_domain' ),
    'update_item'                => __( 'Update Type', 'text_domain' ),
    'separate_items_with_commas' => __( 'Separate types with commas', 'text_domain' ),
    'search_items'               => __( 'Search types', 'text_domain' ),
    'add_or_remove_items'        => __( 'Add or remove types', 'text_domain' ),
    'choose_from_most_used'      => __( 'Choose from the most used types', 'text_domain' ),
);

$rewrite = array(
    'slug'                       => 'type',
    'with_front'                 => true,
    'hierarchical'               => true,
);

$capabilities = array(
    'manage_terms'               => 'manage_categories',
    'edit_terms'                 => 'manage_categories',
    'delete_terms'               => 'manage_categories',
    'assign_terms'               => 'edit_posts',
);

$args = array(
    'labels'                     => $labels,
    'hierarchical'               => true,
    'public'                     => true,
    'show_ui'                    => true,
    'show_admin_column'          => true,
    'show_in_nav_menus'          => true,
    'show_tagcloud'              => true,
    'query_var'                  => 'media_type',
    'rewrite'                    => $rewrite,
    'capabilities'               => $capabilities,
);

register_taxonomy( 'type', 'special_media_post', $args );
}

// Hook into the 'init' action
add_action( 'init', 'special_media_post', 0 );

// Hook into the 'init' action
add_action( 'init', 'media_year', 0 );

// Hook into the 'init' action
add_action( 'init', 'media_type', 0 );

Jeśli jest coś jeszcze, co musisz zobaczyć, mogę to postawić, ale nawet tego nie zobaczy, jeśli dodam echo „Hello World”. Więc po prostu nie widzi ani single-special_media_post.php ani archive-special_media_post.php

Odpowiedzi:


57

Odwiedź stronę permalinks (która ją opróżni) i sprawdź ponownie. WordPress prawdopodobnie wystarczy, by rozpoznać twój dodatek do hierarchii.


2
łał! działa jak urok, zmarnowany 1 godzinę :(
Mohammed Sufian

5

Zmień kod

Od :

 'has_archive'         => true,

Do :

 'has_archive'         => false,

A potem przejdź do strony permalink, zmień na domyślną i wróć do „ładnego bezpośredniego linku”

% postname% /

Teraz powinno działać.

Powodem, dla którego nie przejdzie na stronę single- {custom_post_type} .php, jest spowodowane has_archive. Gdy parametr has_archive jest ustawiony na wartość true, zamiast pojedynczej strony szuka archiwum {custom_post_type} .php.

Mam nadzieję, że to zadziałało.


1
Nie jestem pewien, czy to prawda. Widok pojedynczego wpisu jest widokiem pojedynczego wpisu, niezależnie od tego, czy typ wpisu obsługuje widoki indeksu archiwum, czy nie.
Chip Bennett,

To rozwiązanie, które opublikowałem, to sposób, w jaki rozwiązałem mój problem w moim własnym opracowaniu. Kiedy moja strona z jednym typem posta pokaże mi teraz, co chciałem zobaczyć.
Wesley Cheung,

3
Możliwe, że poprawka polega na zresetowaniu struktury permalink, co z kolei opróżniło reguły przepisywania.
Chip Bennett,

2
ustawienie „has_archive” nie ma wpływu na to, czy szablon single- {post_type} .php zostanie użyty do pojedynczego żądania.
Jules

Działa jak marzenie. Dzięki stary!
user1202416,

1

Dobra praktyka wykorzystuje również register_activation_hook() i register_deactivation_hook()podczas tworzenia nowych typów treści.

Wygląda na to, że nowe, nowe typy treści zawsze nie zostaną przepisane. Aby tego uniknąć, należy wprowadzić funkcję zwrotną register_activation_hook () flush_rewrite_rules()i funkcję rejestracji nowej treści. Nie wiem dlaczego, ale robienie tego wydaje się unikać tego problemu. Popatrz:

register_activation_hook( __FILE__, 'your_active_hook' );

function your_active_hook() {
    special_media_post();
    flush_rewrite_rules();
}

0

Skopiowałem twój kod, opróżniłem reguły przepisywania przez Administratora, a teraz Theme używa odpowiednich szablonów, kiedy odwiedzam Media Post.

Musisz raz opróżnić reguły przepisywania za pomocą haka after_switch_theme. Zapewni to, że reguły przepisywania zostaną automatycznie usunięte po aktywacji motywu przez użytkownika.

Możesz użyć tego kodu (prosto z Kodeksu):

add_action( 'init', 'theme_prefix_cpt_init' );
function theme_prefix_cpt_init() {
    register_post_type( ... );
}

function theme_prefix_rewrite_flush() {
    flush_rewrite_rules();
}
add_action( 'after_switch_theme', 'theme_prefix_rewrite_flush' );

Więcej informacji można znaleźć w Kodeksie WordPress: http://codex.wordpress.org/Function_Reference/register_post_type

EDYCJA: W takim przypadku Inspect Rewrite Rules Plugin jest bardzo przydatny, ponieważ pozwala zobaczyć reguły związane z niestandardowym typem posta: http://wordpress.org/extend/plugins/rewrite-rules-inspector/

Na marginesie należy również pamiętać, że zalecanym miejscem umieszczania niestandardowych typów postów jest wtyczka, a nie motyw.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.