Дочерний CPT WordPress отображает 404 после реализации пользовательских правил перезаписиPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Дочерний CPT WordPress отображает 404 после реализации пользовательских правил перезаписи

Сообщение Anonymous »

Для этого мне нужна очень специфическая структура URL. На веб-сайте перечислены врачи, и каждый врач находится в разделе веб-сайт.com/practitioner/doctor-name
Врач является квалификационным врачом.
Сложность заключается в том, что у каждого врача есть 3 «внутренние страницы», и они должны иметь следующий URL-адрес (уникальный для каждого врача):
website.com/practitioner/doctor-name/inner-page-title.

Кроме того, они будут иметь тот же верхний и нижний колонтитул, что и врач. (то есть с той же информацией, что и контакты и т. д.)

Вот код:

Код: Выделить всё

add_action( 'init', 'doctor_type_cpt' );
function doctor_type_cpt() {
$labels = array(
'name'                  => 'Doctors',
'singular_name'         => 'Doctor',
'menu_name'             => 'Doctors',
'name_admin_bar'        => 'Doctor',
'all_items'             => 'All Doctors',
'add_new_item'          => 'Add New Doctor',
'add_new'               => 'New Doctor',
'edit_item'             => 'Edit Doctor',
'update_item'           => 'Update Doctor',
'view_item'             => 'View Doctor',
'view_items'            => 'View Doctors',
'search_items'          => 'Search doctors',
'not_found'             => 'No records available!',
'not_found_in_trash'    => 'No records found in Trash!',
'featured_image'        => 'Doctor Image',
'set_featured_image'    => 'Set doctor image',
'remove_featured_image' =>'Remove doctor image',
'use_featured_image'    => 'Use as doctor image',
);

$args = array(
'label'             => 'Doctor',
'labels'            => $labels,
'menu_icon'         => 'dashicons-businessman', //dashicons-plus
'description'       => 'Doctors information pages.',
'hierarchical'          => true,
'public'            => true,
'menu_position'     => 20,
'supports'          => array( 'title', 'editor', 'thumbnail', 'page-attributes', 'custom-fields' ),
'show_ui'           => true,
'show_in_menu'      => true,
'show_in_admin_bar' => true,
'show_in_nav_menus' => true,
'can_export'        => true,
'register_meta_box_cb' => 'add_doctor_metaboxes',
'rewrite'           => array('slug' => 'practitioner')
);
register_post_type( 'Doctor', $args);

$labels = array(
'name'                  => 'Doctor Inner Pages',
'singular_name'         => 'Doctor Inner Page',
'menu_name'             => 'Doctor Inner Pages',
'name_admin_bar'        => 'Doctor Inner Pages'
);
$args = array(
'label'                 => 'Doctor Inner Pages',
'labels'                => $labels,
'hierarchical'          => false,
'show_in_menu'  =>  'edit.php?post_type=doctor',
'public'                => true,
'rewrite'           => array('slug' => '/')
);
register_post_type( 'inner_page', $args );

}
Затем я воспользовался этим руководством, чтобы реализовать желаемую структуру URL-адресов. Вот мой код:

Код: Выделить всё

function my_add_meta_boxes() {
add_meta_box( 'page-parent', 'Page Parent', 'inner_attributes_meta_box', 'inner_page', 'side', 'high' );
}
add_action( 'add_meta_boxes', 'my_add_meta_boxes' );
function inner_attributes_meta_box( $post ) {
$post_type_object = get_post_type_object( $post->post_type );
$pages = wp_dropdown_pages( array( 'post_type' => 'doctor', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __( '(no parent)' ), 'sort_column'=> 'menu_order, post_title', 'echo' => 0 ) );
if ( ! empty( $pages ) ) {
echo $pages;
}
}

function my_add_rewrite_rules() {
add_rewrite_tag('%inner_page%', '([^/]+)', 'inner_page=');
add_permastruct('inner_page', 'practitioner/%doctor%/%inner_page%', false);
add_rewrite_rule('^inner_page/([^/]+)/([^/]+)/?','index.php?inner_page=$matches[2]','top');
}
add_action( 'init', 'my_add_rewrite_rules' );

function my_permalinks($permalink, $post, $leavename) {
$post_id = $post->ID;
if($post->post_type != 'inner_page' || empty($permalink) || in_array($post->post_status, array('draft', 'pending', 'auto-draft')))
return $permalink;
$parent = $post->post_parent;
$parent_post = get_post( $parent );
$permalink = str_replace('%doctor%', $parent_post->post_name, $permalink);
return $permalink;
}
add_filter('post_type_link', 'my_permalinks', 10, 3);
Я могу прекрасно создать экземпляр доктора, URL-адреса заполняются, но когда я создаю внутреннюю страницу и назначаю ей родительский элемент, это не работает. (Это также не работает без родителя). Все, что он делает, это перенаправляет меня на 404.

Может быть, это из-за отсутствия шаблона? Я попробовал очистить структуру постоянных ссылок. Я бьюсь над этим уже несколько часов и не могу найти решение.

РЕДАКТИРОВАТЬ: я отключил все, что касается дочерних родительских элементов и изменений ссылок, но cpt внутренней страницы все еще выдает 404.

Редактировать 2: я отключил перезапись, и все заработало. Затем, когда я снова включил его, он продолжал работать, но как только я меняю постоянную ссылку на нужную структуру, он снова выдает мне ошибку 404.

Подробнее здесь: https://stackoverflow.com/questions/549 ... rite-rules
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»