Как определить, какой шаблон подключён в данный момент?

205
26 февраля 2017, 10:35

Здравствуйте. Допустим в админке wordpress для главной страницы магазина назначен определённый шаблон, т.е. в котором есть Template Name: Имя шаблона. В файле content-product.php, который вызывается по умолчанию для всех страниц магазина в цикле, я делаю проверку:

$classes = '';
if(is_page_template('content-main.php')){
    $woocommerce_loop['loop']++;
    if ($woocommerce_loop['name'] == 'product_cat') { ?>
        

Но эта проверка не срабатывает, т.е. вызывается стандартный код, расположенный в тегах li. А мне нужно обернуть товар в другие блоки, в зависимости от страницы и шорткода. Файл content-main.php в данном случае является шаблон для главной страницы

Answer 1

is_page_template() не работает внутри цикла WordPress.

Скорее всего, дело в этом и проверку надо вынести за пределы цикла.

Можно попробовать выяснить используемый шаблон альтернативным способом, через мета-поля страницы:

if ( get_page_template_slug( get_the_ID() ) == 'content-main.php' ) {}

Второй способ должен работать и внутри цикла.

UPDATE

Второй способ работает для цикла по страницам, а WooCommerce осуществляет свой цикл по продуктам, и get_the_ID() здесь не работает. В случае с WooCommerce определить используемый шаблон можно следующим образом.

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

function filter_template_include( $t ) {
    $GLOBALS['current_template'] = basename($t);
    return $t;
}
add_filter( 'template_include', 'filter_template_include', 1000 );
function get_current_template() {
    if( !isset( $GLOBALS['current_template'] ) )
        return false;
    return $GLOBALS['current_template'];
}

В файле content-product.php использовать эту функцию для получения имени текущего шаблона.

if (get_current_template() == 'content-main.php') {}

Напоминаю, что content-product.php лучше скопировать в подпапку своей темы /wp-content/themes/my-theme/woocommerce/ и править там. Так он сохранится при обновлении WooCommerce.

Для теста была создана страница на тестовом сайте. Ей назначен шаблон woo-test. Содержание файла so632379.php

<?php
/*
Template Name: woo-test
*/
echo do_shortcode('[products]');
?>

В content-product.php добавлена строка вывода названия шаблона

// Ensure visibility
if ( empty( $product ) || ! $product->is_visible() ) {
    return;
}
echo "Current template = " . get_current_template();
?>
<li <?php post_class(); ?>>

Результат здесь.

READ ALSO
Как спарсить ответ json

Как спарсить ответ json

get посылаю так:

276
Каким образом обфусцирован этот код? [требует правки]

Каким образом обфусцирован этот код? [требует правки]

Каким способом зашифрован этот код? Обычные обфускаторы либо через eval , либо просто заменой переменных шифруют

221