【问题标题】:Why Divi shortcodes don't render in wp-json?为什么 Divi 短代码不在 wp-json 中呈现?
【发布时间】:2019-04-08 01:47:12
【问题描述】:

我正在尝试使用 the_content 过滤器来处理 Divi 简码,但简码仍然出现。特别是 et_pb_section、et_pb_column、et_pb_text,如果这很重要的话。

add_action( 'rest_api_init', function () {
    register_rest_field(
        'post',
        'content',
        array(
            'get_callback'    => 'ap3_divi_do_shortcodes',
            'update_callback' => null,
            'schema'          => null,
        )
    );

    register_rest_field(
        'post',
        'excerpt',
        array(
            'get_callback'    => 'ap3_divi_do_shortcodes',
            'update_callback' => null,
            'schema'          => null,
        )
    );
});

function ap3_divi_do_shortcodes( $object, $field_name, $request ) {

    global $post;
    $post = get_post($object['id']);

    // Set is_singular to true to avoid "read more issue"
    // Issue come from is_singular () in divi-builder.php line 73
    global $wp_query;
    $wp_query->is_singular = true;

    $output = array(
        'protected' => false
    );

    switch( $field_name ) {
        case 'content':
            $output['rendered'] =  apply_filters( 'the_content', $post->post_content );
            break;
        case 'excerpt':
            $output['rendered'] =  apply_filters( 'the_excerpt', $post->post_excerpt );
            break;
    }

    return $output;
}

【问题讨论】:

  • 您是否正在为 Divi 构建 GatsbyJS 无头前端?
  • 我使用的是 AppPresser 插件。

标签: wordpress wordpress-rest-api


【解决方案1】:

我自己想通了。我需要打电话给et_builder_add_main_elements(),但我也必须确保我只打过一次电话。

define('ONLY_ONCE_ap3_divi_do_shortcodes', true);

这就是我最终的结果。

<?php

/**
 * Render the Divi shortcode in wp-json API
 * Placed in the wp-content/mu-plugins/ folder
 */

add_action( 'rest_api_init', function () {
    register_rest_field(
        'post',
        'content',
        array(
            'get_callback'    => 'ap3_divi_do_shortcodes',
            'update_callback' => null,
            'schema'          => null,
        )
    );

    register_rest_field(
        'post',
        'excerpt',
        array(
            'get_callback'    => 'ap3_divi_do_shortcodes',
            'update_callback' => null,
            'schema'          => null,
        )
    );
});

function ap3_divi_do_shortcodes( $object, $field_name, $request ) {

    // Set is_singular to true to avoid "read more issue"
    // Issue come from is_singular () in divi-builder.php line 73
    global $wp_query;
    $wp_query->is_singular = true;

    // Set divi shortcode
    // The 2 function below are define in 'init' but they are call in 'wp'
    // REST Api exit after 'parse_request' hook, it's before 'wp' so divi's shortcode are not set
    if( !defined('ONLY_ONCE_ap3_divi_do_shortcodes') && function_exists('et_builder_init_global_settings') && function_exists('et_builder_add_main_elements') ) {
        define('ONLY_ONCE_ap3_divi_do_shortcodes', true);
        et_builder_add_main_elements();
    }

    //Define $post, if not defined, divi will not add outter_content and inner_content warper
    //Issue come from get_the_ID() in divi-builder.php line 69
    global $post;
    $post = get_post($object['id']);

    $output = array();

    //Apply the_content's filter, one of them interpret shortcodes
    switch( $field_name ) {
        case 'content':
            $output['rendered'] =  apply_filters( 'the_content', $post->post_content );
            break;
        case 'excerpt':
            $output['rendered'] =  apply_filters( 'the_excerpt', $post->post_excerpt );
            break;
    }

    $output['protected'] = false;

    return $output;
}

【讨论】:

  • 这篇文章是救命稻草。谢谢。
【解决方案2】:

添加下面的代码解决了我的问题,谢谢

if (function_exists('et_builder_add_main_elements')) {
    et_builder_add_main_elements();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2019-02-12
    • 2023-01-19
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多