2014-11-06 1 views
0

Ниже успешно позволяет мне использовать программы и Программы FAQ на моем сайте WordPress, как пользовательских типов почтовых, но я борюсь с постоянными ссылками на страницах.WordPress таможенного пост типа не может получить доступ к ребенку страницу

Когда я создаю новый страницу часто задаваемых вопросов я поставил родителей в качестве программы это прекрасно, но его постоянную ссылку, что я не могу показаться, чтобы получить работу.

Если к примеру, программа назывались Футболом Я хотел бы посетить domain.com/programmes/football, то я бы создать программу Справку с тем же именем футболом и установить родитель в футболе из программы и постоянная ссылка на часто задаваемые вопросы станет domain.com/programme_faq/football/football

Когда я пытаюсь посетить эту страницу, он появляется как 404 не найден. Если я удалю родительский вариант на странице часто задаваемых вопросов, то постоянная ссылка станет domain.com/programme_faq/football, и это сработает.

В идеале я бы предпочел страницы, сделанные в Program FAQ в конечном итоге, как domain.com/programmes/football/faq

add_action('init', 'register_cpt_programmes'); 
add_action('init', 'register_cpt_programmes_faq'); 

function register_cpt_programmes() { 

    $labels = array( 
     'name'    => __('Programmes', 'text_domain'), 
     'singular_name'  => __('single programme name', 'text_domain'), 
     'add_new'   => _x('Add Programme', '${4:Name}', 'text_domain'), 
     'add_new_item'  => __('Add Programme', 'text_domain}'), 
     'edit_item'   => __('Edit this Programme', 'text_domain'), 
     'new_item'   => __('New Programme', 'text_domain'), 
     'view_item'   => __('View Programme', 'text_domain'), 
     'search_items'  => __('Search Programmes', 'text_domain'), 
     'not_found'   => __('No Programmes found', 'text_domain'), 
     'not_found_in_trash' => __('No Programmes found in Trash', 'text_domain'), 
     'parent_item_colon' => __('Parent single post type name:', 'text_domain'), 
     'menu_name'   => __('Programmes', 'text_domain'), 
    ); 

    $args = array( 
     'labels'    => $labels, 
     'hierarchical'  => true, 
     'description'   => 'description', 
     //'taxonomies'   => array('category'), 
     'public'    => true, 
     'show_ui'    => true, 
     'show_in_menu'  => true, 
     'menu_position'  => 5, 
     //'menu_icon'   => '', 
     'show_in_nav_menus' => true, 
     'publicly_queryable' => true, 
     'exclude_from_search' => false, 
     'has_archive'   => true, 
     'query_var'   => true, 
     'can_export'   => true, 
     'rewrite'    => true, 
     'capability_type'  => 'page', 
     'supports'   => array( 
      'title', 'editor', 'author', 'page-attributes', 'thumbnail', 'excerpt', 'custom-fields', 'revisions', 'comments' 
     ), 
     'rewrite' => array(
      'with_front' => false, 
      'slug'  => 'programmes' 
     ) 
    ); 

    register_post_type('programmes', $args); 
} 

function register_cpt_programmes_faq() { 

    $labels = array( 
     'name'    => __('Programme FAQ', 'text_domain'), 
     'singular_name'  => __('single programme faq', 'text_domain'), 
     'add_new'   => _x('Add Programme FAQ', '${4:Name}', 'text_domain'), 
     'add_new_item'  => __('Add Programme FAQ', 'text_domain}'), 
     'edit_item'   => __('Edit this Programme FAQ', 'text_domain'), 
     'new_item'   => __('New Programme FAQ', 'text_domain'), 
     'view_item'   => __('View Programme FAQ', 'text_domain'), 
     'search_items'  => __('Search Programme FAQ', 'text_domain'), 
     'not_found'   => __('No Programme FAQs found', 'text_domain'), 
     'not_found_in_trash' => __('No Programmes FAQs found in Trash', 'text_domain'), 
     'parent_item_colon' => __('Parent single post type name:', 'text_domain'), 
     'menu_name'   => __('Programme FAQ', 'text_domain'), 
    ); 

    $args = array( 
     'labels'    => $labels, 
     'hierarchical'  => true, 
     'description'   => 'description', 
     //'taxonomies'   => array('category'), 
     'public'    => true, 
     'show_ui'    => true, 
     'show_in_menu'  => true, 
     'menu_position'  => 5, 
     //'menu_icon'   => '', 
     'show_in_nav_menus' => true, 
     'publicly_queryable' => true, 
     'exclude_from_search' => false, 
     'has_archive'   => true, 
     'query_var'   => true, 
     'can_export'   => true, 
     'rewrite'    => true, 
     'capability_type'  => 'page', 
     'supports'   => array( 
      'title', 'editor', 'author', 'page-attributes', 'thumbnail', 'excerpt', 'custom-fields', 'revisions', 'comments' 
     ), 
     'rewrite' => array(
      'with_front' => false, 
      'slug'  => 'programme_faq' 
     ) 
    ); 

    register_post_type('programme_faq', $args); 
} 
add_action('admin_menu', function() { 
    remove_meta_box('pageparentdiv', 'programme_faq', 'normal'); 
}); 

add_action('add_meta_boxes', function() { 
    add_meta_box('programmes-parent', 'Programmes', 'programmes_attributes_meta_box', 'programme_faq', 'side', 'high'); 
}); 

function programmes_attributes_meta_box($post) { 
    $post_type_object = get_post_type_object($post->post_type); 
    if ($post_type_object->hierarchical) { 
     $pages = wp_dropdown_pages(array('post_type' => 'programmes', '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; 
     } // end empty pages check 
    } // end hierarchical check. 
} 

ответ

2

Это мой первый раз, отвечая на переполнение стека. Прошу прощения за форматирование и вопросы правописания.

РЕЗЮМЕ:

Основные этапы достижения решения документируются в коде. Вот краткое изложение:

  1. Регистрация Типы таможенный пост
  2. Добавить «родительскую программу» мета окно на экране EDIT
  3. Добавление правила перезаписи, так WordPress правильно разбирает структуру пользовательских URL
  4. фильтр постоянную ссылку так ссылки на FAQ страницы отображаются правильно

КОД:

// 1a. register the Programmes post type 
function register_cpt_programmes() 
{ 
    $labels = array(
     'name'    => __('Programmes', 'text_domain'), 
     'singular_name'  => __('single programme name', 'text_domain'), 
     'add_new'   => _x('Add Programme', '${4:Name}', 'text_domain'), 
     'add_new_item'  => __('Add Programme', 'text_domain}'), 
     'edit_item'   => __('Edit this Programme', 'text_domain'), 
     'new_item'   => __('New Programme', 'text_domain'), 
     'view_item'   => __('View Programme', 'text_domain'), 
     'search_items'  => __('Search Programmes', 'text_domain'), 
     'not_found'   => __('No Programmes found', 'text_domain'), 
     'not_found_in_trash' => __('No Programmes found in Trash', 'text_domain'), 
     'parent_item_colon' => __('Parent single post type name:', 'text_domain'), 
     'menu_name'   => __('Programmes', 'text_domain'), 
    ); 

    $args = array(
     'labels'    => $labels, 
     'hierarchical'  => false, 
     'description'   => 'description', 
     'public'    => true, 
     'show_ui'    => true, 
     'show_in_menu'  => true, 
     'menu_position'  => 5, 
     'show_in_nav_menus' => true, 
     'publicly_queryable' => true, 
     'exclude_from_search' => false, 
     'has_archive'   => true, 
     'query_var'   => true, 
     'can_export'   => true, 
     'rewrite'    => true, 
     'capability_type'  => 'page', 
     'supports'   => array(
      'title', 
      'editor', 
      'author', 
      'page-attributes', 
      'thumbnail', 
      'excerpt', 
      'custom-fields', 
      'revisions', 
      'comments' 
     ), 
     'rewrite' => array(
      'with_front' => false, 
      'slug'  => 'programmes' 
     ) 
    ); 
    register_post_type('programmes', $args); 
} 
add_action('init', 'register_cpt_programmes'); 

// 1b. register the Programme FAQ post type 
function register_cpt_programme_faq() 
{ 
    $labels = array(
     'name'    => __('Programme FAQ', 'text_domain'), 
     'singular_name'  => __('single programme faq', 'text_domain'), 
     'add_new'   => _x('Add Programme FAQ', '${4:Name}', 'text_domain'), 
     'add_new_item'  => __('Add Programme FAQ', 'text_domain}'), 
     'edit_item'   => __('Edit this Programme FAQ', 'text_domain'), 
     'new_item'   => __('New Programme FAQ', 'text_domain'), 
     'view_item'   => __('View Programme FAQ', 'text_domain'), 
     'search_items'  => __('Search Programme FAQ', 'text_domain'), 
     'not_found'   => __('No Programme FAQs found', 'text_domain'), 
     'not_found_in_trash' => __('No Programmes FAQs found in Trash', 'text_domain'), 
     'parent_item_colon' => __('Parent single post type name:', 'text_domain'), 
     'menu_name'   => __('Programme FAQ', 'text_domain'), 
    ); 

    $args = array(
     'labels'    => $labels, 
     'hierarchical'  => false, 
     'description'   => 'description', 
     'public'    => true, 
     'show_ui'    => true, 
     'show_in_menu'  => true, 
     'menu_position'  => 5, 
     'show_in_nav_menus' => true, 
     'publicly_queryable' => true, 
     'exclude_from_search' => false, 
     'has_archive'   => true, 
     'query_var'   => true, 
     'can_export'   => true, 
     'rewrite'    => true, 
     'capability_type'  => 'page', 
     'supports'   => array(
      'title', 
      'editor', 
      'author', 
      'page-attributes', 
      'thumbnail', 
      'excerpt', 
      'custom-fields', 
      'revisions', 
      'comments' 
     ), 
     'rewrite' => array(
      'with_front' => false, 
      'slug'  => 'programme_faq' 
     ) 
    ); 
    register_post_type('programme_faq', $args); 
} 
add_action('init', 'register_cpt_programme_faq'); 

// 2a. meta box - add a custom meta box on the Programme FAQ edit page 
function pfaq_add_meta_boxes($post) 
{ 
    add_meta_box('pfaq-parent', 'Parent Programme', 'pfaq_parent_meta_box', $post->post_type, 'side', 'core'); 
} 
add_action('add_meta_boxes_programme_faq', 'pfaq_add_meta_boxes'); 

// 2b. select box - add a select input inside the Parent Programme meta box 
function pfaq_parent_meta_box($post) 
{ 
    $parents = get_posts(
     array(
      'post_type' => 'programmes', 
      'orderby'  => 'title', 
      'order'  => 'ASC', 
      'numberposts' => -1 
     ) 
    ); 

    if(!empty($parents)) 
    { 
     echo '<select name="parent_id" class="widefat">'; 

     foreach($parents as $parent) 
     { 
      printf('<option value="%s"%s>%s</option>', esc_attr($parent->ID), selected($parent->ID, $post->post_parent, false), esc_html($parent->post_title)); 
     } 

     echo '</select>'; 
    } 
} 

// 3. rewrite rule - teach WordPress to parse the custom URL pattern 
function pfaq_rewrite_rule() 
{ 
    add_rewrite_rule('^programmes/([^/]+)/faq/?', 'index.php?programme_faq=$matches[1]-faq', 'top'); 
} 
add_action('init', 'pfaq_rewrite_rule'); 

// 4. permalink - filter all Programme FAQ permalinks to match the desired URL pattern 
function pfaq_post_type_link($post_link, $post, $leavename, $sample) 
{ 
    if($post->post_type == 'programme_faq') 
    { 
     $parent = get_post($post->post_parent); 
     $post_link = get_bloginfo('url') . '/programmes/' . $parent->post_name . '/faq'; 
    } 

    return $post_link; 
} 
add_filter('post_type_link', 'pfaq_post_type_link', 1, 4); 

ПРИМЕЧАНИЕ:

Я повторил код от первоначального вопроса, чтобы отразить несколько важных изменения:

  • решения требует Неиерархических почтовых типов
  • переименованы функций для согласованности
  • исправлены проблемы с кодом мета-кода
  • исправлена ​​«программа» vs.«программы», в которых была затронута функциональность.

Префикс «pfaq» был выбран, так как большинство настроек зависает по типу сообщения «Часто задаваемые вопросы».

КРЕДИТЫ:

WordPress ядро, WordPress Codex, @justintadlock, @tareq_cse

Смежные вопросы