创建页面模板目录破坏了一切!

时间:2015-12-15 作者:N00b

我决定用FTP组织我的工作,因为我现在已经有超过25个模板,而且主题根目录中的文件/目录列表越来越长。

我偶然发现article 我从中了解到,默认情况下,主题根目录中的页面模板是可读的,一切都应该正常。

我使用is_page_template() 以便仅在需要时加载。

问题是is_page_template() 现在不读取模板。。Why? 我是否需要在函数中声明或定义任何内容。php还是什么?

Currently: wp内容/主题/我的主题/页面模板/模板。php

Previously: wp内容/主题/我的主题/模板。php

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

将页面分配给模板时,此模板选择将保存在post meta表的键下_wp_page_template. 这些模板值如下

  • default 如果未明确设置页面模板

  • {$template}.php 对于根目录中的模板

  • subfolder/{$template}.php 对于子文件夹中的模板,其中子文件夹应为子文件夹的名称

is_page_template() 将传递给它的模板名称中的值与中存储的值进行显式比较_wp_page_template. 注意,页面模板由返回get_page_template_slug() 在…内is_page_template(). 如果这两个值不匹配,则返回false

示例:

如果我们有一个名为template.php 我们会将其与is_page_template( \'template.php\' ), 因为_wp_page_template 对于特定页面template.php.

当我们将此模板移动到名为subfolderreassign 页面模板到页面的_wp_page_template 将是subfolder/template.php, 显然会失败is_page_template( \'template.php\' ) 因为\'template.php\' !== \'subfolder/template.php\'

您需要手动将条件语句调整为is_page_template( \'subfolder/template.php ) 匹配移动到子文件夹,因为我看不到可以安全更改此内容的筛选器。

从注释编辑更改结构,即将模板移动到目录,如前所述,将模板移动到子文件夹会破坏当前结构

重新分配页面模板您需要重新将页面分配到正确的模板。如果移动模板,我们的示例是template.php 正在移入subfolder)的值_wp_page_template 不会改变。旧值(,即template.php 在我们的示例中,保留为db。考虑到这一点,批量更新所有页面并将正确的页面模板重新分配给页面非常容易。

我们需要做的就是从db中获取旧值,然后使用subfolder/ 附加到旧模板名称。我已经写了一个小动作来实现这一点,不需要再手动操作;-)。您只需添加一个页面名称数组,该数组已移动到value 中的参数meta_query , 这将获得所有分配了这些旧模板的页面,然后您只需附加subfolder/ 并重新保存它们。

当操作运行时admin_init, 您只需加载一次任何管理页面,即可完成。,之后,可以删除该函数。只需注意一点,在运行操作之前,请确保所有值都是正确的,因为它会更改数据库中的值。还将数据库的备份存储在某处

add_action( \'admin_init\', function ()
{
    // Get all pages in order to change the template paths to subfolder
    $args = [
        \'post_type\'      => \'page\',
        \'posts_per_page\' => -1,
        \'fields\'         => \'ids\',
        \'meta_query\'     => [
            [
                \'key\' => \'_wp_page_template\',
                \'value\' => [\'template.php\'] // Set all the templates you have moved into an array
            ]
        ]
    ];
    $q = get_posts( $args );

    if ( !$q )
        return;

    foreach ( $q as $id ) {
        // Get the current template name saved
        $template = get_post_meta( $id, \'_wp_page_template\', true );
        // The name of the subfolder with trailing slash
        $subfolder_name = \'subfolder/\';
        // Update the templates to add the subfolder name. Change name as needed
        update_post_meta( 
            $id, // Page ID
            \'_wp_page_template\', //Meta key under which the page template name is saved
            $subfolder_name . $template, //the new value of the template name, in this case subfolder/{$template}.php
            $template // Old value of the template name
        );
    }
});
添加page-templates/ 每个的路径is_page_template() 我的每一个代码

我不确定3号。因为我从文章中读到的是,WP默认情况下“知道”模板是否在页面模板/目录中

Wordpress有not 我知道这一点。抄本上又错了一个,又错了一个。Wordpress使用中存储的值_wp_page_template 根据返回的值从根文件夹或子文件夹加载正确的模板。不知道_wp_page_template, Wordpress将不知道为页面分配了哪个模板以及在哪里查找模板。template.php 表示页面模板位于根目录中,subfolder/template.php 表示模板位于被调用的子文件夹中subfolder.

通过查看的源代码,可以查看如何为页面加载模板get_page_template()

SO网友:Kvvaradha

在澄清问题之前。简单解释一下,模板系统是如何在WordPress中工作的。

您可以在php文件上创建一个模板文件,其中包含以下代码,并将其放在主题根目录中。

 <?php
  /**
   * Template Name : My template page
   **/?>
然后通过移动到来选择页面的模板wp-admin. 当您在此处选择模板时,它将在posts meta表中存储一个post meta,其中包含您在下面选择的模板文件的路径_wp_page_template meta和它的价值是my-template.php 它位于主题文件的根文件夹中。我指的是同一个目录style.css.
因此它会查询路径,并在查看页面时获取路径。现在,如果您将文件移动到另一个文件夹。路径现在变得无效。

如果您将文件移动到另一个子目录。应该是这样的sub-directory/my-template.php. 这样才能完美地工作。

所以问题是当您移动到另一个文件夹时文件的路径。解决方案是

你必须一个接一个地移动文件,一旦文件被移动,只需转到网站的后端,然后转到页面,然后选择要编辑的页面,再次从列表中选择模板并再次更新页面。

就是这样。

Edit: 我不是在猜测,请参阅附带的屏幕截图。我创建了一个新文件,并用自己的自定义模板代码保存了它。然后,我通过选择模板在后端创建了一个页面。然后可以看到posts\\u元表。我检查了其中的两个字段,帖子ID是11。并检查元ID21. 无论我是猜测还是给出实际工作。您可以在编辑器顶部看到文件路径。

First screenshot

在第一个屏幕截图之后,我将文件移动到子目录inc. 然后我再次保存了模板页面,并拍摄了另一个屏幕截图。

Second Screenshot After changes