: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
if ( ! defined( 'ET_THEME_BUILDER_DIR' ) ) {
define( 'ET_THEME_BUILDER_DIR', ET_BUILDER_DIR . 'frontend-builder/theme-builder/' );
if ( ! defined( 'ET_THEME_BUILDER_THEME_BUILDER_POST_TYPE' ) ) {
define( 'ET_THEME_BUILDER_THEME_BUILDER_POST_TYPE', 'et_theme_builder' );
if ( ! defined( 'ET_THEME_BUILDER_TEMPLATE_POST_TYPE' ) ) {
define( 'ET_THEME_BUILDER_TEMPLATE_POST_TYPE', 'et_template' );
if ( ! defined( 'ET_THEME_BUILDER_HEADER_LAYOUT_POST_TYPE' ) ) {
define( 'ET_THEME_BUILDER_HEADER_LAYOUT_POST_TYPE', 'et_header_layout' );
if ( ! defined( 'ET_THEME_BUILDER_BODY_LAYOUT_POST_TYPE' ) ) {
define( 'ET_THEME_BUILDER_BODY_LAYOUT_POST_TYPE', 'et_body_layout' );
if ( ! defined( 'ET_THEME_BUILDER_FOOTER_LAYOUT_POST_TYPE' ) ) {
define( 'ET_THEME_BUILDER_FOOTER_LAYOUT_POST_TYPE', 'et_footer_layout' );
if ( ! defined( 'ET_THEME_BUILDER_SETTING_SEPARATOR' ) ) {
// Must be a single character.
define( 'ET_THEME_BUILDER_SETTING_SEPARATOR', ':' );
if ( ! defined( 'ET_THEME_BUILDER_DYNAMIC_CONTENT_REGEX' ) ) {
define( 'ET_THEME_BUILDER_DYNAMIC_CONTENT_REGEX', '/@ET-DC@(.*?)@/' );
require_once ET_THEME_BUILDER_DIR . 'ThemeBuilderApiErrors.php';
require_once ET_THEME_BUILDER_DIR . 'ThemeBuilderRequest.php';
require_once ET_THEME_BUILDER_DIR . 'template-setting-validations.php';
require_once ET_THEME_BUILDER_DIR . 'api.php';
require_once ET_THEME_BUILDER_DIR . 'admin.php';
require_once ET_THEME_BUILDER_DIR . 'frontend.php';
require_once ET_THEME_BUILDER_DIR . 'dynamic-content.php';
if ( et_is_woocommerce_plugin_active() ) {
require_once ET_THEME_BUILDER_DIR . 'woocommerce.php';
require_once ET_THEME_BUILDER_DIR . 'WoocommerceProductVariationPlaceholder.php';
require_once ET_THEME_BUILDER_DIR . 'WoocommerceProductVariablePlaceholder.php';
require_once ET_THEME_BUILDER_DIR . 'WoocommerceProductVariablePlaceholderDataStoreCPT.php';
if ( et_core_is_wpml_plugin_active() ) {
require_once ET_THEME_BUILDER_DIR . 'wpml.php';
* Register all relevant Theme Builder entities such as post types.
function et_theme_builder_register_entities() {
$publicly_queryable = isset( $_GET['et_fb'] ) && '1' === $_GET['et_fb'] && et_pb_is_allowed( 'use_visual_builder' );
register_post_type( ET_THEME_BUILDER_THEME_BUILDER_POST_TYPE, array(
'name' => esc_html__( 'Theme Builders', 'et_builder' ),
'singular_name' => esc_html__( 'Theme Builder', 'et_builder' ),
'add_new' => esc_html__( 'Add New', 'et_builder' ),
'add_new_item' => esc_html__( 'Add New Theme Builder', 'et_builder' ),
'edit_item' => esc_html__( 'Edit Theme Builder', 'et_builder' ),
'new_item' => esc_html__( 'New Theme Builder', 'et_builder' ),
'all_items' => esc_html__( 'All Theme Builders', 'et_builder' ),
'view_item' => esc_html__( 'View Theme Builder', 'et_builder' ),
'search_items' => esc_html__( 'Search Theme Builders', 'et_builder' ),
'not_found' => esc_html__( 'Nothing found', 'et_builder' ),
'not_found_in_trash' => esc_html__( 'Nothing found in Trash', 'et_builder' ),
'parent_item_colon' => '',
'capability_type' => 'post',
'publicly_queryable' => false,
'supports' => array( 'title', 'author' ),
register_post_type( ET_THEME_BUILDER_TEMPLATE_POST_TYPE, array(
'name' => esc_html__( 'Templates', 'et_builder' ),
'singular_name' => esc_html__( 'Template', 'et_builder' ),
'add_new' => esc_html__( 'Add New', 'et_builder' ),
'add_new_item' => esc_html__( 'Add New Template', 'et_builder' ),
'edit_item' => esc_html__( 'Edit Template', 'et_builder' ),
'new_item' => esc_html__( 'New Template', 'et_builder' ),
'all_items' => esc_html__( 'All Templates', 'et_builder' ),
'view_item' => esc_html__( 'View Template', 'et_builder' ),
'search_items' => esc_html__( 'Search Templates', 'et_builder' ),
'not_found' => esc_html__( 'Nothing found', 'et_builder' ),
'not_found_in_trash' => esc_html__( 'Nothing found in Trash', 'et_builder' ),
'parent_item_colon' => '',
'capability_type' => 'post',
'publicly_queryable' => $publicly_queryable,
'supports' => array( 'title', 'author' ),
register_post_type( ET_THEME_BUILDER_HEADER_LAYOUT_POST_TYPE, array(
'name' => esc_html__( 'Header Layouts', 'et_builder' ),
'singular_name' => esc_html__( 'Header Layout', 'et_builder' ),
'add_new' => esc_html__( 'Add New', 'et_builder' ),
'add_new_item' => esc_html__( 'Add New Header Layout', 'et_builder' ),
'edit_item' => esc_html__( 'Edit Header Layout', 'et_builder' ),
'new_item' => esc_html__( 'New Header Layout', 'et_builder' ),
'all_items' => esc_html__( 'All Header Layouts', 'et_builder' ),
'view_item' => esc_html__( 'View Header Layout', 'et_builder' ),
'search_items' => esc_html__( 'Search Header Layouts', 'et_builder' ),
'not_found' => esc_html__( 'Nothing found', 'et_builder' ),
'not_found_in_trash' => esc_html__( 'Nothing found in Trash', 'et_builder' ),
'parent_item_colon' => '',
'capability_type' => 'post',
'publicly_queryable' => $publicly_queryable,
'supports' => array( 'title', 'editor', 'author', 'revisions', 'comments' ),
register_post_type( ET_THEME_BUILDER_BODY_LAYOUT_POST_TYPE, array(
'name' => esc_html__( 'Body Layouts', 'et_builder' ),
'singular_name' => esc_html__( 'Body Layout', 'et_builder' ),
'add_new' => esc_html__( 'Add New', 'et_builder' ),
'add_new_item' => esc_html__( 'Add New Body Layout', 'et_builder' ),
'edit_item' => esc_html__( 'Edit Body Layout', 'et_builder' ),
'new_item' => esc_html__( 'New Body Layout', 'et_builder' ),
'all_items' => esc_html__( 'All Body Layouts', 'et_builder' ),
'view_item' => esc_html__( 'View Body Layout', 'et_builder' ),
'search_items' => esc_html__( 'Search Body Layouts', 'et_builder' ),
'not_found' => esc_html__( 'Nothing found', 'et_builder' ),
'not_found_in_trash' => esc_html__( 'Nothing found in Trash', 'et_builder' ),
'parent_item_colon' => '',
'capability_type' => 'post',
'publicly_queryable' => $publicly_queryable,
'supports' => array( 'title', 'editor', 'author', 'revisions', 'comments' ),
register_post_type( ET_THEME_BUILDER_FOOTER_LAYOUT_POST_TYPE, array(
'name' => esc_html__( 'Footer Layouts', 'et_builder' ),
'singular_name' => esc_html__( 'Footer Layout', 'et_builder' ),
'add_new' => esc_html__( 'Add New', 'et_builder' ),
'add_new_item' => esc_html__( 'Add New Footer Layout', 'et_builder' ),
'edit_item' => esc_html__( 'Edit Footer Layout', 'et_builder' ),
'new_item' => esc_html__( 'New Footer Layout', 'et_builder' ),
'all_items' => esc_html__( 'All Footer Layouts', 'et_builder' ),
'view_item' => esc_html__( 'View Footer Layout', 'et_builder' ),
'search_items' => esc_html__( 'Search Footer Layouts', 'et_builder' ),
'not_found' => esc_html__( 'Nothing found', 'et_builder' ),
'not_found_in_trash' => esc_html__( 'Nothing found in Trash', 'et_builder' ),
'parent_item_colon' => '',
'capability_type' => 'post',
'publicly_queryable' => $publicly_queryable,
'supports' => array( 'title', 'editor', 'author', 'revisions', 'comments' ),
add_action( 'init', 'et_theme_builder_register_entities', 11 );
* Get array of post types that can be layouts within templates.
function et_theme_builder_get_layout_post_types() {
ET_THEME_BUILDER_HEADER_LAYOUT_POST_TYPE,
ET_THEME_BUILDER_BODY_LAYOUT_POST_TYPE,
ET_THEME_BUILDER_FOOTER_LAYOUT_POST_TYPE,
* Convert 'header', 'body', 'footer' to the appropriate layout post type name.
* @param string $layout_type
function et_theme_builder_get_valid_layout_post_type( $layout_type ) {
'header' => ET_THEME_BUILDER_HEADER_LAYOUT_POST_TYPE,
'body' => ET_THEME_BUILDER_BODY_LAYOUT_POST_TYPE,
'footer' => ET_THEME_BUILDER_FOOTER_LAYOUT_POST_TYPE,
if ( ! isset( $map[ $layout_type ] ) ) {
return $map[ $layout_type ];
* Get whether post type is a Theme Builder layout type.
* @param string $post_type
function et_theme_builder_is_layout_post_type( $post_type ) {
return in_array( $post_type, et_theme_builder_get_layout_post_types(), true );
* Get list of post content module slugs.
function et_theme_builder_get_post_content_modules() {
return array( 'et_pb_post_content', 'et_pb_fullwidth_post_content' );
* Filter post types with builder support by default.
function et_theme_builder_filter_builder_default_post_types( $post_types ) {
return array_merge( $post_types, et_theme_builder_get_layout_post_types() );
add_filter( 'et_builder_default_post_types', 'et_theme_builder_filter_builder_default_post_types' );
add_filter( 'et_library_builder_post_types', 'et_theme_builder_filter_builder_default_post_types' );
* Filter post types which should be blocklisted from appearing as options when enabling/disabling the builder.
function et_theme_builder_filter_builder_post_type_options_blocklist( $post_types ) {
et_theme_builder_get_layout_post_types(),
array( ET_THEME_BUILDER_TEMPLATE_POST_TYPE )
add_filter( 'et_builder_post_type_options_blocklist', 'et_theme_builder_filter_builder_default_post_types' );
* Filter builder status for template area posts.
function et_theme_builder_filter_enable_builder_for_post_types( $enabled, $post_id ) {
$post_type = get_post_type( $post_id );
if ( et_theme_builder_is_layout_post_type( $post_type ) ) {
add_filter( 'et_builder_fb_enabled_for_post', 'et_theme_builder_filter_enable_builder_for_post_types', 10, 2 );
* Get the theme builder post.
* @param boolean $live Get the live version or the draft one.
* @param boolean $create Create the post if it does not exist.
function et_theme_builder_get_theme_builder_post_id( $live, $create = true ) {
$status = $live ? 'publish' : 'auto-draft';
$query = new WP_Query( array(
'post_type' => ET_THEME_BUILDER_THEME_BUILDER_POST_TYPE,
'post_status' => $status,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
if ( ! empty( $query->posts ) ) {
$post_id = wp_insert_post( array(
'post_type' => ET_THEME_BUILDER_THEME_BUILDER_POST_TYPE,
'post_status' => $status,
'post_title' => 'Theme Builder',
* Get the theme builder post's template IDs.
* @param boolean $live Get the live version or the draft one.
function et_theme_builder_get_theme_builder_template_ids( $live ) {
$post_id = et_theme_builder_get_theme_builder_post_id( $live, false );
$template_ids = get_post_meta( $post_id, '_et_template', false );
$template_ids = is_array( $template_ids ) ? $template_ids : array();
$template_ids = array_map( 'intval', $template_ids );
* Get the theme builder post's templates.
* @param boolean $live Get the live version or the draft one.
function et_theme_builder_get_theme_builder_templates( $live ) {
return array_filter( array_map(
'et_theme_builder_get_template',
et_theme_builder_get_theme_builder_template_ids( $live )
* Returns an empty array if the template is not found.
* @param integer $template_id
function et_theme_builder_get_template( $template_id ) {
$post = get_post( $template_id );
if ( null === $post || ET_THEME_BUILDER_TEMPLATE_POST_TYPE !== $post->post_type ) {
$autogenerated_title = '1' === get_post_meta( $template_id, '_et_autogenerated_title', true );
$header_id = (int) get_post_meta( $post->ID, '_et_header_layout_id', true );
$header_enabled = get_post_meta( $post->ID, '_et_header_layout_enabled', true ) === '1';
$body_id = (int) get_post_meta( $post->ID, '_et_body_layout_id', true );
$body_enabled = get_post_meta( $post->ID, '_et_body_layout_enabled', true ) === '1';
$footer_id = (int) get_post_meta( $post->ID, '_et_footer_layout_id', true );
$footer_enabled = get_post_meta( $post->ID, '_et_footer_layout_enabled', true ) === '1';
$use_on = get_post_meta( $post->ID, '_et_use_on', false );
$exclude_from = get_post_meta( $post->ID, '_et_exclude_from', false );
'default' => get_post_meta( $post->ID, '_et_default', true ) === '1',
'enabled' => get_post_meta( $post->ID, '_et_enabled', true ) === '1',
'title' => $autogenerated_title ? '' : $post->post_title,
'enabled' => $header_enabled,
'override' => 0 !== $header_id || false === $header_enabled,
'enabled' => $body_enabled,
'override' => 0 !== $body_id || false === $body_enabled,
'enabled' => $footer_enabled,
'override' => 0 !== $footer_id || false === $footer_enabled,
'use_on' => is_array( $use_on ) ? $use_on : array(),
'exclude_from' => is_array( $exclude_from ) ? $exclude_from : array(),
* Trash the theme builder draft and any unused theme builder templates and layouts.
function et_theme_builder_trash_draft_and_unused_posts() {
$mark_meta_key = '_et_theme_builder_marked_as_unused';
$live_id = et_theme_builder_get_theme_builder_post_id( true, false );
$draft_id = et_theme_builder_get_theme_builder_post_id( false, false );
wp_trash_post( $draft_id );
$used_templates = get_post_meta( $live_id, '_et_template', false );
$used_templates = is_array( $used_templates ) ? array_map( 'intval', $used_templates ) : array();
foreach ( $used_templates as $template_id ) {
$used_posts[] = $template_id;
$used_posts[] = (int) get_post_meta( $template_id, '_et_header_layout_id', true );
$used_posts[] = (int) get_post_meta( $template_id, '_et_body_layout_id', true );
$used_posts[] = (int) get_post_meta( $template_id, '_et_footer_layout_id', true );
$used_posts = array_filter( $used_posts );
// Unmark all used posts.
foreach ( $used_posts as $post_id ) {
delete_post_meta( $post_id, $mark_meta_key );
// Mark unreferenced layouts for trashing.
$posts_to_mark = new WP_Query( array(
ET_THEME_BUILDER_TEMPLATE_POST_TYPE,
ET_THEME_BUILDER_HEADER_LAYOUT_POST_TYPE,
ET_THEME_BUILDER_BODY_LAYOUT_POST_TYPE,
ET_THEME_BUILDER_FOOTER_LAYOUT_POST_TYPE,
'post__not_in' => $used_posts,