: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Check wether self closing tag or not
* @param string $tag Element tag.
protected function is_self_closing_tag( $tag ) {
$self_closing_tags = array(
return in_array( $tag, $self_closing_tags, true );
* Check if required props is fulfilled
* @param string $contexts Element contexts data.
protected function is_required_props_fulfilled( $contexts ) {
$required_some_keys = et_()->array_get( $contexts, 'required_some', false );
if ( $required_some_keys ) {
if ( ! is_array( $required_some_keys ) ) {
$required_some_keys = explode( ',', $required_some_keys );
foreach ( $required_some_keys as $required_key => $required_value_compare ) {
// Handle zero indexed data.
if ( is_numeric( $required_key ) ) {
$fulfilled = $this->has_value( $required_value_compare );
$fulfilled = $this->has_value( $required_key, $required_value_compare );
// Break the loop once any of required props key is fulfilled.
// Bail early if required_some param is defined, no need to process further.
// The required_some param is prioritized over required param.
$required_keys = et_()->array_get( $contexts, 'required', array() );
// Bail early when the required parameter defined as false.
if ( false === $required_keys ) {
if ( $required_keys && ! is_array( $required_keys ) ) {
$required_keys = explode( ',', $required_keys );
// Populate the required keys from the content if it is empty.
if ( ! $required_keys ) {
$content = et_()->array_get( $contexts, 'content', '' );
if ( ! empty( $content ) && preg_match_all( $this->pattern, $content, $matches, PREG_SET_ORDER, 0 ) ) {
// Populate the required keys from the content.
foreach ( $matches as $match ) {
if ( ! isset( $match[1] ) ) {
$required_keys[] = $match[1];
// Bail early when the required keys is empty.
if ( ! $required_keys ) {
foreach ( $required_keys as $required_key => $required_value_compare ) {
if ( ( ! $required_value_compare && is_numeric( $required_key ) ) || ( ! $required_key && ! is_numeric( $required_key ) ) ) {
// Handle zero indexed data.
if ( is_numeric( $required_key ) ) {
$fulfilled = $this->has_value( $required_value_compare );
$fulfilled = $this->has_value( $required_key, $required_value_compare );
// Break the loop once any of required props key is not fulfilled.
* Sort conditionals values list by number of props and conditionals params.
* @param array $a Array data to compare.
* @param array $b Array data to compare.
public function sort_conditional_values( $a, $b ) {
$a_priority = count( $a['props'] ) + count( $a['conditionals'] );
$b_priority = count( $b['props'] ) + count( $b['conditionals'] );
if ( $a_priority === $b_priority ) {
return $a['order'] - $b['order'];
return ( $a_priority < $b_priority ) ? -1 : 1;
* The Module is restricted in scope. Hence we use this getter.
* @used-by ET_Builder_Module_Woocommerce_Description::multi_view_filter_value()
public function get_module_props() {
if ( ! isset( $this->props ) ) {