Индивидуальный тип цепочки для разбивки на страницы

13 января 2018

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


Введение

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

С момента выпуска пользовательских типов сообщений в WordPress 2.9 их разбивка на страницы оказалась сложной в зависимости от обстоятельств. Время от времени у некоторых профессионалов WordPress даже тяжело бьют.

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

Мой ключ к простой персонализированной разбивке по страницам использует шаблон archive-posttype.php для выполнения того, что я называю цепочкой, что означает, что мы используем их как включающие в другие файлы шаблонов WordPress, где требуется разбиение на страницы. То, что это делает, сокращается на пользовательскую разработку для разных обстоятельств, в которых разработчику хотелось бы разбивать на страницы. Подумайте об этом как о том, как использовать шаблон архива пользовательского типа, как индекс или общий доступ. На этом пути есть несколько поворотов, но это большая идея. Давай начнем.


Step 1 Paginatio

Поскольку кодирование является фундаментальной наукой, давайте начнем с вопроса о разбиении на страницы. Несмотря на то, что я склоняюсь перед величием плагина для разбивки на страницы, WP PageNavi, как недавно заметил Якоб Голдман, в этом нет необходимости. У WordPress есть своя функция разбиения на страницы, называемая paginate_links (), и, по-видимому, большинство разработчиков ничего не знают об этом. Обязательно прочитайте его документацию, но чтобы сэкономить время создания собственного кода для functions.php, здесь моя похожа на пример Codex:

function paginate() {
    global $wp_query, $wp_rewrite;
    $wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
    $pagination = array(
        'base' => @add_query_arg('page','%#%'),
        'format' => '',
        'total' => $wp_query->max_num_pages,
        'current' => $current,
        'show_all' => true,
        'type' => 'plain'
    );
    if ( $wp_rewrite->using_permalinks() ) $pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );
    if ( !empty($wp_query->query_vars['s']) ) $pagination['add_args'] = array( 's' => get_query_var( 's' ) );
    echo paginate_links( $pagination );
}

Мой метод цепочки был разработан с учетом этой функции. Использование WP PageNavi для персонализированного разбиения на страницы типа становится настоящим уродством, поэтому я не буду показывать вам, как это сделать по той же причине, что друзья не позволяют друзьям пнуть. Пожалуйста. Но давайте перейдем к тому, на что вы действительно пришли, - наконец, выясните, как сохранить персонализированную разбивку по страницам, чтобы сбрасывать 404 или всегда возвращаться на первую страницу.


Step 2 Пользовательский шаблон архива типа сообщения

Поскольку пользовательские типы сообщений не имеют своих собственных индексных страниц, и, как я уже говорил, я думаю о шаблоне archive-posttype.php как о своей резервной системе, потому что я используйте его как основу для разбивки на страницы во всех других шаблонах. Многие разработчики сначала подчеркивают шаблон страницы как индексную страницу, но 1.) Я, очевидно, не согласен и 2.), мы доберемся до них. Даже суперзвезда WordPress, Джастин Тадлок, соглашается, что пользовательские типы сообщений должны иметь по крайней мере вариант своих собственных индексных страниц.

К счастью, моя функция paginate () из коробки с шаблоном archive-posttype.php. Уф. Но проблема в том, что разбиение на страницы связано с настройкой для сообщений на странице в настройках> Чтение. И поскольку пользовательские типы сообщений - это просто таковые, девять раз из десяти, разработчик захочет, чтобы их сообщения на странице также были обычными. Чтобы сделать это, самый простой способ, которым я пришел, - написать фильтр в functions.php следующим образом:

function portfolio_posts_per_page( $query ) {
    if ( $query->query_vars['post_type'] == 'portfolio' ) $query->query_vars['posts_per_page'] = 1;
    return $query;
}
if ( !is_admin() ) add_filter( 'pre_get_posts', 'portfolio_posts_per_page' );

Этот метод пришел ко мне через пост Джонатана Кристофера под названием WordPress Posts Per Page Per Custom Post Type. Спасибо, Джонатан!

Что произойдет, если я не хочу, чтобы моя структура permalink имела одно и то же имя моего настраиваемого типа сообщений (например, портфолио http: company.com)? Я рад, что вы спросили. Это одна из причин, по которой разработчик предпочтет, чтобы шаблон страницы отображал свои пользовательские типы сообщений. Это дает пользователю полный контроль над структурой permalink, потому что они могут просто изменить имя страницы, использующей этот шаблон страницы. Это понятно, и мы скоро это сделаем, но для тех из нас, кто не нуждается в этом, или хочет еще одного способа в будущем, есть небольшое редактирование, которое мы можем сделать под капотом, чтобы согнуть эту структуру по нашей воле.

Функция создания настраиваемого типа post, register_post_type (), принимает аргумент, называемый rewrite. Значение этого аргумента передается как массив, и изменение значения slug изменяет структуру permalink. Вот пример:

'rewrite' => array( 'slug' => 'insertyourpermalinknamehere', 'with_front' => true ),

После того, как вы изменили это, перейдите в «Настройки»> «Постоянная ссылка» и нажмите кнопку «Сохранить изменения», чтобы сбросить кеш перезаписи. Посетите свой сайт и обновите страницу, чтобы просмотреть изменения. Сделано и сделано. Опять же, единственный недостаток этого метода - неспециализированные пользователи не смогут изменить имя своей структуры постоянной ссылки из графического интерфейса администратора, если, конечно, они не отправятся в Редактор тем, чтобы изменить эту перезапись.


Step 3 Шаблоны страниц

Для разработчиков нередко отображать и разбивать свои пользовательские типы сообщений на странице статического фронта посредством шаблона страницы. Причина этого - в два раза; он дает пользователю возможность изменять отношения имен имен для постоянной ссылки, о которых мы только что говорили, и позволяет им отображать пользовательские типы сообщений на первой странице своего сайта. Но здесь все может быть некрасиво. Мне стыдно говорить, что я однажды закодировал персонализированную разбивку по страницам трех разных способов в одной теме. Отчасти это связано с использованием WP PageNavi, но у меня есть этот смущающий факт, чтобы подчеркнуть, что весь этот процесс может быть ошеломляющим для разработчиков тем, которые не находятся в «знании».

Давайте назовем нашу страницу Template page-portfolio.php в соответствии с соглашением об именах для пользовательских шаблонов типа сообщений, даже если это не одно. Вот код:

/* Template Name: Portfolio */
$paged = 1;
if ( get_query_var('paged') ) $paged = get_query_var('paged');
if ( get_query_var('page') ) $paged = get_query_var('page');
query_posts( '&post_type=portfolio&paged=' . $paged );
require_once( 'archive-portfolio.php' );

Это первый раз, когда вы видите шаблон archive-posttype.php, прикованный к другому шаблону. И это работает! Но что, черт возьми, происходит? Этот janky $ paged variable business подчеркивает точные проблемы, с которыми разработчики, похоже, сталкиваются с таргетингом пользовательских сообщений. В принципе, если это исправление (кашель) отсутствует на месте, и пользователь нажимает кнопку просмотра страницы 2, как и тот, кто был наброшен на голову, WordPress запутался и не знает, где он находится. И чтобы добавить оскорбление к травме, очевидно, что WordPress знает об этом и принимает его как обычную процедуру разработки, публикуя эту заметку в разделе «Параметры страницы» страницы Codex для WP_Query ():

Pagination Note: вы должны установить get_query_var ('page'); если вы хотите, чтобы ваш запрос работал с разбиением на страницы. Начиная с WordPress 3.0.2 вы получаете get_query_var ('page') вместо get_query_var ('paged'). Параметр pagination 'paged' для WP_Query () остается неизменным.

Мне кажется, что разработчики должны иметь возможность установить эту переменную и указать на определенную страницу. Что не имеет смысла, так это то, почему разбиение на страницы по своей сути работает со стандартными типами сообщений (например, post, page, attachment), но не с пользовательскими.

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


Step 4 Шаблон главной страницы

Использование шаблона front-page.php блокирует пользователей на пользовательскую главную страницу без возможности ее изменения (если они не удаляют файл или не переименовывают его временно). Вот почему большинство разработчиков выбирают метод шаблонов страниц для создания статических передних страниц, но ради моего метода предположим, что мы используем первый. Чтобы достичь персонализированной разбивки на страницы для этого шаблона, нам нужно просто включить то, что мы сделали для archive-posttype.php, например:

require_once( 'page-portfolio.php' );

Step 5 Таксономии пользовательских почтовых сообщений

Шаблон таксономии-posttype-taxonomy.php работает так же, как и шаблон front-page.php, но вместо включения шаблона page-portfolio.php вы вместо этого include наш index, archive-posttype.php, вот так:

require_once( 'archive-posttype.php' );

Это завершает степень моего метода. Где я когда-то стучал головой о стол в два часа ночи, я сейчас спокойно двигаюсь по проектам в два часа дня. Победа! Ну, по крайней мере пока. Я не настолько наивен, чтобы думать, что я не могу найти себя в ситуации, когда этот метод не работает для таргетинга пользовательских сообщений, но я еще этого не сделал.


Заключение

В отличие от других моих должностей, я надеюсь, что это станет устаревшим. Я надеюсь, что WordPress будет действовать в рамках недавнего опроса, который показывает, что 92% всех разработчиков используют WordPress как CMS и второй взгляд на то, как разбиение на страницы работает на их платформе. Команда в WordPress - это не что иное, как профессионал. Я представляю себе будущее, в котором встроены инструменты разбивки на страницы и, возможно, настраиваемая страница администрирования почтового типа в разделе «Настройки» для администрирования сообщений на страницу для каждого настраиваемого типа сообщений. Но на данный момент я надеюсь, что этот метод цепочки помогает многим разработчикам, которых я видел, страдает на форумах WordPress. Пожалуйста, не стесняйтесь загружать, использовать и злоупотреблять следующими заархивированными файлами в качестве рамки для успешной персонализации страницы. Наслаждайтесь!

Таможенный тип разбиения на страницы (Pagination Chaining Method Framework) (ZIP)