DEBUG设置为TRUE的未定义常量

时间:2016-02-08 作者:James

我习惯于使用以下代码来更改“single”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\\u PATH-假定为“SINGLE\\u PATH”

我的函数在什么地方出错了吗?

3 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

你这里有很多问题。

尽可能不要定义全局变量和常量。全球范围是一个邪恶的地方。WordPress已经把全球范围搞得一团糟,不要再搞得一团糟了。可以在函数/过滤器中使用静态变量

避免使用TEMPLATEPATH. 您应该使用get_template_directory_uri(). IIRC,某处有一个关于未来折旧的通知TEMPLATEPATH, 但这需要引用locate_template() 对于仍在使用的TEMPLATEPATH. 但无论如何,使用get_template_path_directory_uri() 对于父主题,这是正确的方式

您想使用locate_template() 搜索特定模板,而不是file_exists. 让WordPress处理WordPress的内容。如果WordPress不提供本机函数/方法,则仅使用PHP(或自定义SQL)。本机函数用于处理使用自定义PHP时可能会忘记的其他内容

在新的背景下,如果我们使用locate_template(), 我们不需要使用get_template_directory_uir(). locate_template() 默认情况下,为我们处理该节。这就是为什么使用本机WordPress函数来处理特定作业很重要的原因

生成的文件名中有一个双斜杠。你的常数是/single/ 您的文件名是/single.php, 其中呈现/single//single.php. 您需要删除一条斜线,以避免重复斜线

  • single-{$post_type}.php 默认情况下用于自定义帖子类型

    如果您在循环外处理单个post页面的post对象,请使用get_queried_object() 这比$post 全球的

    尽管您的语法有效,但最好使用花括号({}) 而不是:endforeach 语法。这也适用于条件语句的语法。我更喜欢卷发,因为如果代码失败,它们很容易调试

    如果您像以前一样创建自定义层次结构,请始终设置index.php 作为最终回退模板index.php 所有主题都需要

    让我们正确地重写代码(NOTE: 我使用的闭包有一个缺点,就是不能通过remove_filter(), 所以,如果你愿意的话,把它改成普通的意大利面)。我们将使用内部逻辑get_single_template() 来帮助我们

    代码需要PHP 5.4+,并且untested

    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\\u 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;
    });
    

  • SO网友:phatskat

    关于您从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\\u DEBUG”设置为TRUE

    注意如何WP_DEBUG 定义如下:

    define( \'WP_DEBUG\', true );
    
    但在以后的代码中,您可以不加引号地调用它:

    var_dump( WP_DEBUG ); // bool(true)
    

    SO网友:Seth M

    如果您使用的是“模板零件”文件夹,这将起作用-作用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;
    });
    

    相关推荐