Intereting Posts
WP-FB-AutoConnect: невозможно войти в систему с учетной записью администратора Элементы панели управления все перестали работать Рекомендуемый размер изображения в панели ADMIN? Невозможно загрузить изображения в медиабиблиотеку. Получение этого erron на консоли wp-admin / async-upload.php 403 (Запрещено) Подготовка строки в массиве для локализации wp_ajax_nopriv_xxx не работает на одном сайте, работает на всех остальных. -1 для зарегистрированных пользователей Добавление аргумента в страницу результатов поиска как изменить текст в меню навигации Форма submit in admin не устанавливает is_admin () true Установите расписание липких сообщений (автоматическое) Используйте разделитель тысяч тысяч слов исключить идентификаторы через post__not_in Shortcode с атрибутом пользовательского контента? Модернизированная тема UnderStrap и потерянный стиль, любой способ восстановить? wp enqueue style на определенных шаблонах страниц

Есть ли способ установить разные шаблоны сообщений для родительских сообщений и дочерних сообщений в том же типе сообщений?

Рассмотрев вопросы, которые, возможно, получили мой ответ, я все еще не могу найти что-то, что я ссылаюсь на постфакторные php-файлы.

У меня есть два пользовательских типа сообщений, которые я пытаюсь объединить в один пост-тип. Я буду называть пользовательские типы сообщений «Клиент» и «Проект». То, что я сделал, это создать настраиваемый тип сообщений «Клиенты и проекты» и установить для каждого из «Клиентов» родительский и последующие «Проекты» для детей в «Клиентах и ​​проектах».

У меня уже созданы шаблоны PHP, и они отлично работают для каждого из типов сообщений отдельно, но я не могу понять, как установить один из шаблонов для загрузки для «Клиентов» (родительских постов) и другого шаблона загрузка для «проектов» (дочерние должности).

Именование файлов выглядит следующим образом:

  • Клиентами будут клиенты_projects_parent.php
  • Проекты будут client_projects_child.php

Я нашел этот фрагмент кода здесь , но это не решило мою проблему.

function switch_page_template() { global $post; // Checks if current post type is a page, rather than a post if (is_page()){ // Checks if page is parent, if yes, return if ($post->post_parent == 0) return true; else if ($post->post_parent != $post->ID){ $parent_page_template = get_post_meta($post->post_parent,'_wp_page_template',true); $template = TEMPLATEPATH . "/{$parent_page_template}"; if (file_exists($template)) { load_template($template); exit; } } } } add_action('template_redirect','switch_page_template'); 

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

Обновить:

Я возился и пытался:

 add_action('template_redirect', 'get_template'); function get_template(){ global $wp; global $wp_query; if(is_page('client_project') || '0' === $post->post_parent){ include(TEMPLATEPATH . '/single-client_project.php'); }elseif(is_page('client_project') || $post->post_parent > 0){ include(TEMPLATEPATH . '/single-client_project_child.php'); } else{ include(TEMPLATEPATH . '/single-client_project.php'); } } 

Я поместил условный оператор в шаблоны, которые я пытаюсь вызвать / перенаправить, и выглядит так:

 global $post; if ( is_page('client_project') || '0' == $post->post_parent ) { echo "<h1>This is a parent page</h1>"; echo "<p>post parent = " . $post->post_parent . "</p>"; } else { echo "<h1>This is a child page</h1>"; echo "<p>post parent = " . $post->post_parent . "</p>"; } 

Теперь, что происходит, когда сообщения загружаются, каждый из них дает правильную индикацию из эхо-цикла, который был помещен в файлы шаблона, т.е. parent post prints «Это родительская страница» и дает правильный родительский номер «0» , но шаблоны по-прежнему загружаются неправильно (эфир родительский или дочерний шаблон загружает не каждый для каждого типа) …

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

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ:

Я наконец получил шаблоны для замены. Хотя это то, что я могу себе представить, это худший возможный путь. Я в основном зашел в шаблон «parent» и разместил оператор if непосредственно перед кодом страницы. Это выглядит так:

 <?php global $post; if(is_page('client_project') || $post->post_parent > 0){ include(TEMPLATEPATH . '/single-client_project-child.php'); } ?> 

Я прочитал после того, как я получил это, чтобы работать, что TEMPLATEPATH был обесценен, поэтому я, скорее всего, поменю это, но я собираюсь называть это ответом, @GM, если бы вы этого хотели, я бы очень признателен, что вы написали правильный способ сделать это , или, по крайней мере, лучший способ. Я приглашаю всех, кто сталкивается с этим вопросом, делать то же самое. Cheeers!

Solutions Collecting From Web of "Есть ли способ установить разные шаблоны сообщений для родительских сообщений и дочерних сообщений в том же типе сообщений?"

single_template способ – использовать single_template filter hook (один из {$type}_template hooks ).

Он запускается WordPress для фильтрации файла шаблона, найденного для особых запросов на отправку сообщений.

 add_filter('single_template', function($template) { $queried = get_queried_object(); if ( $queried->post_type === 'clients_projects' ) { // only for this CPT // file name per OP requirements $file = 'clients_projects_'; $file .= $queried->post_parent ? 'child' : 'parent'; // using `locate_teplate` to be child theme friendly return locate_template("{$file}.php") ? : $template; } return $template; }); 

Как это работает

Когда вы посещаете URL-адрес сайта WordPress, WordPress переводит этот URL-адрес в набор аргументов запроса и запускает запрос базы данных, используя их.

Существуют разные типы запросов, для страницы, для архива, для сообщения и т. Д. Посмотрите страницу условных тегов на Codex, существует исчерпывающее описание всех типов запросов.

В вашем случае вам нужно настроить таргетинг на один тип запроса, потому что вы хотите изменить шаблон, используемый, если требуется один CPT.

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

Когда файл найден, прежде чем включать этот файл, WordPress фильтрует его с помощью 2 фильтров.

  • "{$type}_template" который является динамическим, и изменяет для каждого типа запроса
  • 'template_include' который запускается для всех шаблонов.

В приведенном выше коде я использовал фильтр 'single_template' для изменения шаблона, который будет загружен WordPress, возвращая другой шаблон из обратного вызова, привязанного к этому фильтру.

Тем не менее, этот фильтр запускается для каждого отдельного запроса, даже для стандартных сообщений и других CPT, поэтому перед изменением шаблона я проверил, является ли текущая запрошенная запись одним из CPT, мы хотим, чтобы цель. Чтобы получить текущий [get_queried_object()][6] я использовал [get_queried_object()][6] что в особых запросах возвращает объект post.

Если текущий пост не относится к типу post-post, я просто возвращаю файл WordPress, не изменяя его.

Если текущее сообщение является одним из типов post_parent типа, я создаю имя шаблона, смотря на атрибут post_parent сообщения: если в post есть родитель, я создаю 'clients_projects_child.php' если сообщение не имеет родителя, я возвращаю 'clients_projects_parent.php' .

Перед фактическим возвратом файла шаблона я использую locate_template чтобы увидеть, существует ли в теме (или в дочерней теме) этот файл шаблона или нет. Если он существует, я возвращаю его, таким образом WordPress вместо загрузки шаблона по умолчанию загружает настраиваемый шаблон, если шаблон не существует. Я возвращаю шаблон по умолчанию, то есть тот, который найден WordPress.