通过插件添加的页面模板未保存在古登堡

时间:2019-04-11 作者:saurav.rox

我通过插件添加了页面模板。它在classic editor中工作得非常好,但在使用Gutenberg时,如果指定了页面模板,则无法发布页面。然而,通过主题添加的页面模板工作正常,页面也会保存。但通过插件添加的页面模板会产生问题,因为页面无法在分配了这些页面模板(通过插件添加)的情况下发布。

这是我如何通过插件添加页面模板的:

/**
 * Destination template.
*/

function wpte_get_destination_template( $template ) {
    $post = get_post();
    $page_template = get_post_meta( $post->ID, \'_wp_page_template\', true );
    if( $page_template == \'templates/template-destination.php\' ){
        $template_path = locate_template( array( \'template-destination.php\' ) );
        if(!$template_path)
        {
            $template_path = BASE_PATH . \'/includes/templates/template-destination.php\';
        }
        return $template_path;
    }
    return $template;
}

/**
 * Destination template returned.
*/
function wpte_filter_admin_page_templates( $templates ) {
    $templates[\'templates/template-destination.php\'] = __( \'Destination Template\',\'\' );
    return $templates;
}

/**
 * Destination template added.
*/
add_action( \'wp_loaded\', array( $this, \'wpte_add_destination_templates\' ) );
function wpte_add_destination_templates() {
    if( is_admin() ) {
        add_filter( \'theme_page_templates\', array( $this, \'wpte_filter_admin_page_templates\' ) );
    }
    else {
        add_filter( \'page_template\', array( $this, \'wpte_get_destination_template\' ) );
    }
}
这是在选择插件的页面模板后按下“发布”按钮时在控制台上看到的错误:

    {"code":"rest_invalid_param","message":"Invalid parameter(s): template","data":{"status":400,"params":{"template":"template is not one of templates\\/about.php, templates\\/contact.php, templates\\/team.php, templates\\/testimonial.php."}}}
所有这些模板都是主题模板。此处未列出通过插件添加的页面模板。但是,它们可以在“模板”下拉列表中找到。

任何帮助都是非常可观的。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

(修改后的答案)

Gutenberg(或块编辑器)在处理页面/帖子(创建、更新等)时使用WordPress REST API,REST API将通过WP_REST_Posts_Controller::check_template() 当模板无效时,错误template is not one of 将被抛出。

正如我(最近)在this answer:

默认情况下,is_admin() 退货false 在REST API端点/URL上。例如,如果你在http://example.com/wp-json/wp/v2/posts (或者您向该端点发出API请求),然后:

if ( is_admin() ) {
    // code here does **not** run
}
这应该可以回答这个问题,你的wpte_add_destination_templates 功能is_admin() 检查失败,自定义模板未添加到有效/注册模板列表中;最终导致错误template is not one of.

可能的解决方案wp_loadedrest_api_init

add_action( \'wp_loaded\', array( $this, \'wpte_add_destination_templates\' ) );     // for admin requests
add_action( \'rest_api_init\', array( $this, \'wpte_add_destination_templates\' ) ); // for REST requests
wpte_add_destination_templates 功能:

// If REST_REQUEST is defined (by WordPress) and is a TRUE, then it\'s a REST API request.
$is_rest_route = ( defined( \'REST_REQUEST\' ) && REST_REQUEST );
if (
    ( is_admin() && ! $is_rest_route ) || // admin and AJAX (via admin-ajax.php) requests
    ( ! is_admin() && $is_rest_route )    // REST requests only
) {
    add_filter( \'theme_page_templates\', array( $this, \'wpte_filter_admin_page_templates\' ) );
}

或直接挂钩到theme_page_templates

//add_action( \'wp_loaded\', array( $this, \'wpte_add_destination_templates\' ) ); // remove
add_filter( \'theme_page_templates\', array( $this, \'wpte_filter_admin_page_templates\' ) );
然后你的wpte_filter_admin_page_templates 将是:

function wpte_filter_admin_page_templates( $templates ) {
    // If it\'s an admin or a REST API request, then filter the templates.
    if ( is_admin() || ( defined( \'REST_REQUEST\' ) && REST_REQUEST ) ) {
        $templates[\'templates/template-destination.php\'] = __( \'Destination Template\',\'\' );
    } // else, do nothing (i.e. don\'t modify $templates)

    return $templates;
}

相关推荐