Неопределенная константа с отладочным значением 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"

Я где-то ошибся со своей функцией?

 1
Author: Pieter Goosen, 2016-02-08

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;
});
 6
Author: Pieter Goosen, 2016-02-08 18:53:05

Примечание о фактическом сообщении, которое вы получаете от 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)
 2
Author: phatskat, 2016-02-08 14:45:49

Если вместо этого вы используете папку "части шаблона", это будет работать. -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;
});
 0
Author: Seth M, 2018-10-18 00:25:43