Неопределенная константа с отладочным значением true
Я использовал следующий код для изменения расположения "одиночных" шаблонов Wordpress.
define(SINGLE_PATH, TEMPLATEPATH.'/single/');
add_filter('single_template', 'lsmwp_custom_single');
function lsmwp_custom_single($single) {
global $wp_query, $post;
if ($post->post_type == "cpt_operator"){
if(file_exists(SINGLE_PATH . '/single-' . $post->post_type . '.php'))
return SINGLE_PATH . '/single-' . $post->post_type . '.php';
}
foreach((array)get_the_category() as $cat) :
if(file_exists(SINGLE_PATH . '/single-cat-' . $cat->slug . '.php'))
return SINGLE_PATH . '/single-cat-' . $cat->slug . '.php';
elseif(file_exists(SINGLE_PATH . '/single-cat-' . $cat->term_id . '.php'))
return SINGLE_PATH . '/single-cat-' . $cat->term_id . '.php';
endforeach;
if(file_exists(SINGLE_PATH . '/single.php'))
return SINGLE_PATH . '/single.php';
elseif(file_exists(SINGLE_PATH . '/default.php'))
return SINGLE_PATH . '/default.php';
return $single;
}
Функция работает нормально, и Worpdress ищет отдельные шаблоны в новой папке. Однако, если у меня WP_DEBUG
установлено значение TRUE
, я получаю следующую ошибку:
Использование неопределенной константы SINGLE_PATH - предполагаемый "SINGLE_PATH"
Я где-то ошибся со своей функцией?
3 answers
У вас здесь много проблем.
Держитесь подальше от определения глобалов и констант, если можете. Глобальный масштаб - это место, где должно быть зло. WordPress уже создал огромный беспорядок в глобальном масштабе, не делайте его еще большим беспорядком, чем он уже есть. Вы можете использовать статическую переменную внутри своей функции/фильтра
Избегайте использования
TEMPLATEPATH
. Вы должны использоватьget_template_directory_uri()
. IIRC, где-то было уведомление о будущем снижении стоимостиTEMPLATEPATH
, но необходима цитата на этом какlocate_template()
для одного все еще используетсяTEMPLATEPATH
. Но в любом случае, используйтеget_template_path_directory_uri()
для родительских тем, это правильный способ-
Вы хотели бы использовать
locate_template()
для поиска определенного шаблона, а неfile_exists
. Позвольте WordPress обрабатывать материалы WordPress. Используйте только PHP ( или, если на то пошло, пользовательский SQL), если WordPress не предоставляет встроенную функцию/средства для выполнения чего-либо. Собственные функции предназначены для того, чтобы позаботиться о других вещах, о которых вы можете забыть при использовании пользовательских PHPВ новом контексте, если мы используем
locate_template()
, нам не нужно использоватьget_template_directory_uir()
.locate_template()
по умолчанию обрабатывает этот раздел для нас. Вот почему важно использовать собственные функции WordPress для выполнения определенной работыУ вас есть двойная косая черта в сгенерированных именах файлов. Ваша константа
/single/
, а имя файла/single.php
, которое отображает/single//single.php
. Вам нужно удалить косую черту в одном из двух, чтобы избежать повторяющейся косой черты single-{$post_type}.php
по умолчанию используется для пользовательских типы сообщенийЕсли вы работаете с объектом post одной страницы публикации вне цикла, лучше используйте
get_queried_object()
, который намного надежнее, чем глобальный$post
.Хотя ваш синтаксис допустим, лучше использовать фигурные скобки (
{}
) вместо синтаксиса:
иendforeach
. Это также относится к синтаксису ваших операторов conditionl. Я предпочитаю кудряшки, так как их легко отлаживать в случае сбоя моего кодаЕсли вы создадите пользовательский иерархия, как и у вас, всегда устанавливайте
index.php
в качестве своего окончательного запасного шаблона, посколькуindex.php
требуется для всех тем
Давайте правильно перепишем ваш код ( ПРИМЕЧАНИЕ: Я использую замыкания, у которых есть недостаток, что они не могут быть удалены с помощью remove_filter()
, поэтому измените их на обычные спагетти, если хотите.). Мы будем использовать логику внутри get_single_template()
, чтобы помочь нам здесь
( Код требует PHP 5.4+ и является непроверенный)
add_filter( 'single_template', function ( $template )
{
// Get the current single post object
$post = get_queried_object();
// Set our 'constant' folder path
$path = 'single/';
// Set our variable to hold our templates
$templates = [];
// Lets handle the custom post type section
if ( 'post' !== $post->post_type ) {
$templates[] = $path . 'single-' . $post->post_type . '-' . $post->post_name . '.php';
$templates[] = $path . 'single-' . $post->post_type . '.php';
}
// Lets handle the post post type stuff
if ( 'post' === $post->post_type ) {
// Get the post categories
$categories = get_the_category( $post->ID );
// Just for incase, check if we have categories
if ( $categories ) {
foreach ( $categories as $category ) {
// Create possible template names
$templates[] = $path . 'single-cat-' . $category->slug . '.php';
$templates[] = $path . 'single-cat-' . $category->term_id . '.php';
} //endforeach
} //endif $categories
} // endif
// Set our fallback templates
$templates[] = $path . 'single.php';
$templates[] = $path . 'default.php';
$templates[] = 'index.php';
/**
* Now we can search for our templates and load the first one we find
* We will use the array ability of locate_template here
*/
$template = locate_template( $templates );
// Return the template rteurned by locate_template
return $template;
});
РЕДАКТИРОВАТЬ
Приведенный выше код протестирован и работает должным образом.
ПРАВКА 2 - До PHP 5.4 (T_REX все еще бродит во тьме)
add_filter( 'single_template', function ( $template )
{
// Get the current single post object
$post = get_queried_object();
// Set our 'constant' folder path
$path = 'single/';
// Set our variable to hold our templates
$templates = array();
// Lets handle the custom post type section
if ( 'post' !== $post->post_type ) {
$templates[] = $path . 'single-' . $post->post_type . '-' . $post->post_name . '.php';
$templates[] = $path . 'single-' . $post->post_type . '.php';
}
// Lets handle the post post type stuff
if ( 'post' === $post->post_type ) {
// Get the post categories
$categories = get_the_category( $post->ID );
// Just for incase, check if we have categories
if ( $categories ) {
foreach ( $categories as $category ) {
// Create possible template names
$templates[] = $path . 'single-cat-' . $category->slug . '.php';
$templates[] = $path . 'single-cat-' . $category->term_id . '.php';
} //endforeach
} //endif $categories
} // endif
// Set our fallback templates
$templates[] = $path . 'single.php';
$templates[] = $path . 'default.php';
$templates[] = 'index.php';
/**
* Now we can search for our templates and load the first one we find
* We will use the array ability of locate_template here
*/
$template = locate_template( $templates );
// Return the template rteurned by locate_template
return $template;
});
Примечание о фактическом сообщении, которое вы получаете от PHP. Когда вы определяете константу, вы должны делать это со строкой.
define(SINGLE_PATH, TEMPLATEPATH.'/single/');
Первым параметром является имя константы - при вызове define
константа еще не существует.
Это позаботится о сообщении от PHP:
define('SINGLE_PATH', TEMPLATEPATH.'/single/');
Полный пример использования константы:
<?php
define( 'SOME_CONSTANT', true );
if ( SOME_CONSTANT ) {
echo 'Constant was true';
}
Также
Если у меня для 'WP_DEBUG' установлено значение TRUE
Обратите внимание, как определяется WP_DEBUG
:
define( 'WP_DEBUG', true );
Но в своем коде позже вы назовете его без кавычек:
var_dump( WP_DEBUG ); // bool(true)
Если вместо этого вы используете папку "части шаблона", это будет работать. -function.php
add_filter( 'single_template', function ( $template )
{
// Get the current single post object
$post = get_queried_object();
// Set our 'constant' folder path
$path = 'template-parts/';
// Set our variable to hold our templates
$templates = array();
// Lets handle the custom post type section
if ( 'post' !== $post->post_type ) {
$templates[] = $path . 'content-' . $post->post_type . '-' . $post->post_name . '.php';
$templates[] = $path . 'content-' . $post->post_type . '.php';
}
// Lets handle the post post type stuff
if ( 'post' === $post->post_type ) {
// Get the post categories
$categories = get_the_category( $post->ID );
// Just for incase, check if we have categories
if ( $categories ) {
foreach ( $categories as $category ) {
// Create possible template names
$templates[] = $path . 'content-' . $category->slug . '.php';
$templates[] = $path . 'content-' . $category->term_id . '.php';
} //endforeach
} //endif $categories
} // endif
// Set our fallback templates
$templates[] = $path . 'single.php';
$templates[] = 'index.php';
/**
* Now we can search for our templates and load the first one we find
* We will use the array ability of locate_template here
*/
$template = locate_template( $templates );
// Return the template rteurned by locate_template
return $template;
});