Slug для архива произвольного типа записей

14 мая 2012 г., 17:51:18
Просмотры: 20.2K
Голосов: 3

Я создал новый произвольный тип записей 'Projects' и хочу, чтобы архив всех записей этого типа был доступен по адресу mysite.com/projects. На данный момент все отдельные записи проектов отображаются со следующим slug-ом mysite.com/projects/project-title, но когда я перехожу на mysite.com/projects, получаю ошибку 404.

Вот как я создал произвольный тип записей:

/* Создание произвольного типа записей Project ------------------------------------------*/
function create_post_type_project() 
{
$labels = array(
    'name' => __( 'Projects' ),
    'singular_name' => __( 'Project' ),
    'add_new' => __('Add New'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Project'),
    'not_found' =>  __('No project found'),
    'not_found_in_trash' => __('No project found in Trash'), 
    'parent_item_colon' => ''
  );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'exclude_from_search' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'query_var' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'menu_position' => null,
    // Раскомментируйте следующую строку, чтобы изменить slug; 
    // Вам также нужно сохранить структуру постоянных ссылок, чтобы избежать ошибок 404
    'rewrite' => array( 'slug' => 'projects' ),
    'has_archive' => true,
    'supports' => array('title','editor','thumbnail'),

  ); 

  register_post_type(__( 'project' ),$args);
}
0
Все ответы на вопрос 2
5

Кажется, всё верно — (и я предполагаю, что вы уже сохранили структуру постоянных ссылок, чтобы сбросить правила перезаписи, как предлагается в комментариях? :)).

Я бы порекомендовал использовать этот плагин для выявления проблем с перенаправлением URL: http://wordpress.org/extend/plugins/monkeyman-rewrite-analyzer/ — обновите свой вопрос с результатами, и кто-нибудь сможет предложить решение.

Однако (хотя, вероятно, это не причина вашей проблемы) не следует переводить название типа записи. Используйте:

register_post_type('project',$args);

вместо

register_post_type(__( 'project' ),$args);

Переводы предназначены для удобства пользователя, поэтому их следует применять только к меткам — внутренние имена в WordPress не должны зависеть от перевода.

14 мая 2012 г. 18:25:53
Комментарии

projects/?$ post_type: project (.?.+?)(/[0-9]+)?/?$ pagename: projects page: (.+?)/?$ category_name: projects

urok93 urok93
14 мая 2012 г. 19:55:09

Сейчас при переходе на /projects я получаю просто пустую белую страницу

urok93 urok93
14 мая 2012 г. 19:56:09

У меня была лишняя скобка. Сейчас удалил. Можешь приложить скриншот страницы анализатора перезаписи с этими результатами?

Stephen Harris Stephen Harris
14 мая 2012 г. 20:01:12

@drtranz - Я проверил ваш код. Он работает. Проблема должна быть в другом плагине. Отключите их все, переключитесь на Twenty Eleven, сбросьте правила перезаписи - и затем попробуйте код. Включайте плагины по одному - сбрасывая правила и тестируя после каждого, пока не найдете виновника. В конце - попробуйте тему.

Stephen Harris Stephen Harris
14 мая 2012 г. 20:04:37

Спасибо, я только что заставил это работать, оказалось, мне просто нужно было исправить некоторые файлы шаблонов в текущей теме. Глупая ошибка, спасибо за помощь!

urok93 urok93
15 мая 2012 г. 19:24:46
1

Предоставленный вами код не содержит ошибок, однако то, что вы хотите достичь, также можно реализовать с помощью 'rewrite' => true

http://codex.wordpress.org указывает:

has_archive (логическое значение или строка) (необязательно) Включает архивы типа записи. По умолчанию использует $post_type как слаг архива.

По умолчанию: false

Примечание: Сгенерирует правильные правила перезаписи, если rewrite включен. Также используйте rewrite для изменения используемого слага.

Возможное решение вашей проблемы может заключаться в том, что шаблон для пользовательского типа записи не работает или не создан. Вы можете попробовать добавить следующий код в functions.php или функции плагина:

function _post_type_template_smart(){

    global $post;

    $single_template_name = 'single-projects.php';
    $archive_template_name = 'archive-projects.php';

    if ( is_single() && 'projects' == get_post_type() ){

        $template = locate_template(array($single_template_name), true);

        if(empty($template)) {

          include(PLUGIN_DIR . 'template/' . $single_template_name);

          exit();
        }

    }else if( is_archive() && 'projects' == get_post_type() ){

        $template = locate_template(array($archive_template_name), true);

        if(empty($template)) {

          include(PLUGIN_DIR . 'template/' . $archive_template_name);

          exit();
        }

    }

}
add_filter('template_redirect', '_post_type_template_smart');

и на ваших страницах 'single-projects.php'/'archive-projects.php' создайте цикл/запрос/get_pages (в зависимости от предпочтений) для отображения контента:

    $args = array(
        //'child_of' => 0,
        'sort_order' => 'ASC',
        'sort_column' => 'post_modified',
        'hierarchical' => 1,
        'parent' => 0,
        'post_type' => 'projects',
        'post_status' => 'publish'
    );
    $pages = get_pages( $args );
    foreach ( $pages as $project ){
        $project_id = $project->ID;
        $project_link = get_page_link($project->ID);
        $project_title = $project->post_title;
        $content = $project->post_content;
        $author = $project->post_author;
        $posted_on = $project->post_date;

        if(empty($content)){
            $content = 'Описание для этого пакета отсутствует';
        }
        echo '<div class="content">';
        echo $content;
        echo '</div>';      

    }

Надеюсь, это поможет!

14 мая 2012 г. 19:33:06
Комментарии

Ошибка 404 — это не проблема шаблона. Страница 404 используется только в случае, если контент не найден или не может быть определен. Если WordPress не может найти шаблон, он переключается на более общий шаблон согласно иерархии шаблонов. Кроме того, в шаблоне вам не нужно использовать get_pages или get_posts — WordPress уже извлек контент из базы данных, и вам нужен только цикл have_posts() для его отображения.

Stephen Harris Stephen Harris
14 мая 2012 г. 19:37:32