set_attribute( $attr );
return $this->build_content( $attr );
}
/**
* Render element for backend editor
*
* @param array $attr Options.
* @param string $column_class Column class.
*
* @return mixed
*/
public function render_backend( $attr, $column_class ) {
$this->set_attribute( $attr );
return $this->build_content( $attr );
}
/**
* Build block content
* Extended by each element
*/
public function build_content() {
return null;
}
/**
* Render element
*
* @param array $attr Options.
* @param string $column_class Column class.
*/
public function render_element( $attr, $column_class ) {
$this->set_attribute( $attr );
return $this->build_content( $attr );
}
/**
* Render result element
*
* @param array $result Result element.
* @param array $attr Options.
*/
public function render_result_element( $result, $attr ) {
$this->set_attribute( $attr );
return $this->build_content( $attr );
}
/**
* Build URL element from given setting
*
* @param array $attr URL options.
* @param string $additional_id ID.
* @param string $additional_class Class.
* @param string $child_element Element wrapped by URL.
* @param string $data_attribute Data attribute.
*
* @return string
*/
protected function render_url_element( $attr, $additional_id = null, $additional_class = null, $child_element = null, $data_attribute = null ) {
$id = ! empty( $additional_id ) ? ' id="' . $additional_id . '" ' : '';
$class = ! empty( $additional_class ) ? ' class="' . $additional_class . '" ' : '';
$target = 'on' === $attr['is_external'] ? ' target="_blank" ' : '';
$nofollow = 'on' === $attr['nofollow'] ? ' rel="nofollow" ' : '';
$custom_attributes = ' ';
foreach ( explode( ',', $attr['custom_attributes'] ) as $attribute ) {
if ( $attribute ) {
$value = explode( '|', $attribute );
$custom_attributes = $custom_attributes . ' ' . $value[0] . '="' . $value[1] . '" ';
}
}
return wp_kses_post( '' . $child_element . '' );
}
/**
* Build image element from given setting
*
* @param array $attr Image options.
* @param string $image_size Image size.
* @param string $additional_id ID.
* @param string $additional_class Class.
* @param string $additional_alt Alt.
*
* @return string
*/
protected function render_image_element( $attr, $image_size = 'thumbnail', $additional_id = null, $additional_class = null, $additional_alt = null ) {
if ( ! empty( $attr['id'] ) ) {
$attachment_id = $attr['id'];
unset( $attr['id'] );
if ( ! empty( $additional_id ) ) {
$attr['id'] = $additional_id;
}
if ( ! empty( $additional_class ) ) {
$attr['class'] = $additional_class;
}
if ( ! empty( $additional_alt ) ) {
$attr['alt'] = $additional_alt;
}
foreach ( $attr as $key => $data ) {
if ( empty( $data ) ) {
unset( $attr[ $key ] );
}
}
$attr = apply_filters( 'jkit_render_image_element', $attr, $this->attribute );
return wp_get_attachment_image( $attachment_id, $image_size, false, $attr );
}
$id = ! empty( $additional_id ) ? ' id="' . $additional_id . '"' : '';
$class = ! empty( $additional_class ) ? ' class="' . $additional_class . '"' : '';
$alt = ! empty( $additional_alt ) ? ' alt="' . $additional_alt . '"' : ( isset( $attr['alt'] ) && ! empty( $attr['alt'] ) ? ' alt="' . $attr['alt'] . '"' : '' );
$width = ! empty( $attr['width'] ) ? ' width="' . $attr['width'] . '"' : '';
$height = ! empty( $attr['height'] ) ? ' height="' . $attr['height'] . '"' : '';
$attachment = ! empty( $attr['id'] ) ? wp_get_attachment_image_src( $attr['id'], $image_size ) : '';
$image = ! empty( $attachment[0] ) ? '
' : '';
$image = ! empty( $attr['url'] ) && empty( $image ) ? '
' : $image;
ob_start();
\Elementor\Utils::print_wp_kses_extended( $image, array( 'image' ) );
return ob_get_clean();
}
/**
* Build icon element from given setting. Use Elementor Icon Manager. Render as string
*
* @param array $icon Icon options from the setting.
* @param array $attr Additonal attribute. Default: aria-hidden true.
*
* @return string
*/
protected function render_icon_element( $icon, $attr = array() ) {
$attr = array_merge( $attr, array( 'aria-hidden' => 'true' ) );
ob_start();
Icons_Manager::render_icon( $icon, $attr );
$output = ob_get_contents();
ob_end_clean();
return $output;
}
/**
* Build element with wrapper
*
* @param string $element_name Element name.
* @param string $inner Inner element.
* @param array $array_classes Classes.
* @param array $array_data Data attribute.
* @param array $id Element ID.
*
* @return string
*/
protected function render_wrapper( $element_name, $inner, $array_classes = array(), $array_data = array(), $id = null ) {
$classes = '';
$data = '';
foreach ( $array_classes as $class ) {
$classes = $classes . ' ' . $class;
}
foreach ( $array_data as $key => $value ) {
$data = $data . ' data-' . $key . '="' . esc_attr( $value ) . '"';
}
if ( $id ) {
$id = 'id="' . esc_attr( $id ) . '"';
}
$classes = esc_attr( 'jeg-elementor-kit jkit-' . $element_name . $classes . ' ' . $this->unique_id );
return '
' . $inner . '
';
}
/**
* Get post date
*
* @param int|\WP_Post $post Post.
* @param string $format Format.
* @param string $type Type.
* @param string $custom Custom format.
*
* @return false|string
*/
public function get_post_date( $post, $format, $type, $custom ) {
if ( 'ago' === $format ) {
$output = jkit_get_post_ago_time( $type, $post );
} elseif ( 'custom' === $format ) {
$output = jkit_get_post_date( $custom, $post, $type );
} else {
$output = jkit_get_post_date( null, $post, $type );
}
return $output;
}
/**
* Get color scheme
*
* @return mixed
*/
public function color_scheme() {
return isset( $this->attribute['scheme'] ) ? $this->attribute['scheme'] : '';
}
/**
* Return empty content element
*
* @return mixed
*/
public function empty_content() {
$no_content = '' . esc_attr( $this->attribute['st_nocontent_text'] ) . '
';
return apply_filters( 'jeg_module_no_content', $no_content );
}
/**
* Get post thumbnail
*
* @param int $post_id Post ID.
* @param string $size Image size.
* @return mixed
*/
public function get_thumbnail( $post_id, $size ) {
$additional_class = '';
if ( ! has_post_thumbnail( $post_id ) ) {
$additional_class = 'no_thumbnail';
}
$thumbnail =
'
' . get_the_post_thumbnail( $post_id, $size, array( 'loading' => 'lazy' ) ) . '
';
return $thumbnail;
}
/**
* Render result block element
*
* @param array $results Results.
*/
public function render_result_block_element( $results ) {
$pagination = $this->render_pagination( true, false, intval( $this->attribute['max_num_pages'] ) );
$pagination_align = isset( $this->attribute['pagination_align'] ) ? esc_attr( $this->attribute['pagination_align'] ) : '';
if ( ! empty( $results ) ) {
$content = $this->build_column( $results );
} else {
$content = $this->empty_content();
}
$block = '' . apply_filters( 'jkit_module_block_container_extend', $content, $this->attribute ) . '
';
$pagination = '';
if ( 'nextprev' === $this->attribute['pagination_mode'] && 'top' === $this->attribute['pagination_position'] ) {
$wrapper = $pagination . $block;
} else {
$wrapper = $block . $pagination;
}
return $wrapper;
}
/**
* Render pagination
*
* @param bool $next Next.
* @param bool $prev Previous.
* @param int $total Total page.
* @return string
*/
protected function render_pagination( $next = false, $prev = false, $total = 1 ) {
$output = '';
if ( isset( $this->attribute['pagination_mode'] ) ) {
$pagination_align = isset( $this->attribute['pagination_align'] ) ? esc_attr( $this->attribute['pagination_align'] ) : '';
if ( 'nextprev' === $this->attribute['pagination_mode'] ) {
$pagination_button_display = isset( $this->attribute['pagination_button_display'] ) ? esc_attr( $this->attribute['pagination_button_display'] ) : '';
$prev_class = $prev ? '' : 'disabled';
$next_class = $next ? '' : 'disabled';
if ( 'text' === $pagination_button_display ) {
$prev = isset( $this->attribute['pagination_prev_text'] ) ? $this->attribute['pagination_prev_text'] : '';
$next = isset( $this->attribute['pagination_next_text'] ) ? $this->attribute['pagination_next_text'] : '';
} elseif ( 'icon' === $pagination_button_display ) {
$prev = $this->render_icon_element( $this->attribute['pagination_prev_icon'] );
$next = $this->render_icon_element( $this->attribute['pagination_next_icon'] );
}
$class = sprintf(
'jkit-block-%s jkit-nextprev-%s',
$this->attribute['pagination_mode'],
isset( $this->attribute['pagination_style'] ) ? $this->attribute['pagination_style'] : ''
);
$output =
'';
$output = '';
} elseif ( in_array( $this->attribute['pagination_mode'], array( 'loadmore', 'scrollload' ), true ) && $next ) {
$icon = $this->render_icon_element( $this->attribute['pagination_icon'] );
$icon_position = esc_attr( $this->attribute['pagination_icon_position'] );
$output = '' . esc_attr( $this->attribute['pagination_loadmore_text'] ) . '';
if ( ! empty( $icon ) ) {
if ( 'before' === $icon_position ) {
$output = $icon . $output;
} else {
$output = $output . $icon;
}
}
$output = '';
$output = '';
}
}
return $output;
}
/**
* Render Preloader
*
* @return string
*/
protected function render_preloader() {
$output = '';
if ( ( isset( $this->attribute['pagination_mode'] ) && 'nextprev' === $this->attribute['pagination_mode'] ) || ( isset( $this->attribute['sg_content_sorting'] ) && 'yes' === $this->attribute['sg_content_sorting'] ) ) {
$output =
'';
}
return $output;
}
/**
* Get settings attribute
*
* @return string
*/
protected function render_settings() {
if ( $this->unique_id ) {
$keys = array_merge( $this->get_ajax_param(), array_keys( jeg_get_enabled_custom_taxonomy() ) );
$attr = array_filter(
$this->attribute,
function ( $key ) use ( $keys ) {
return in_array( $key, $keys, true );
},
ARRAY_FILTER_USE_KEY
);
$attr['paged'] = 1;
$attr['class'] = $this->id;
return htmlspecialchars( wp_json_encode( $attr ), ENT_QUOTES, 'UTF-8' );
}
}
/**
* Build query for ajax request
*
* @param array $attr Array of attribute.
* @return mixed
*/
public function build_ajax_query( $attr ) {
$args = $attr['attr'];
$args['paged'] = $attr['current_page'];
$args['number_post'] = $attr['attr']['number_post'];
if ( is_array( $attr['attr']['pagination_number_post'] ) ) {
$args['pagination_number_post'] = 'nextprev' === $attr['attr']['pagination_mode'] ? $attr['attr']['number_post']['size'] : $attr['attr']['pagination_number_post']['size'];
} else {
$args['pagination_number_post'] = 'nextprev' === $attr['attr']['pagination_mode'] ? $attr['attr']['number_post'] : $attr['attr']['pagination_number_post'];
}
return $args;
}
/**
* Ajax request handler. Override in element view class.
*/
public function ajax_request() {}
/**
* Render column method
*
* @param array $result Result.
* @return mixed|string
*/
public function render_column( $result ) {
return '
' . $this->build_column( $result ) . '
';
}
/**
* Render alt column method (ajax request)
*
* @param array $result Result.
* @return mixed|string
*/
public function render_column_alt( $result ) {
return $this->build_column( $result );
}
/**
* Get Current Page
*
* @return mixed
*/
public function get_current_page() {
$page = get_query_var( 'page' ) ? get_query_var( 'page' ) : 1;
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
return max( $page, $paged );
}
/**
* Render block element
*
* @return mixed
*/
public function render_block_element() {
if ( isset( $this->attribute['results'] ) ) {
$results = $this->attribute['results'];
} else {
$results = $this->build_query( $this->attribute );
}
if ( ! empty( $results['result'] ) ) {
$content = $this->render_column( $results['result'] );
} else {
$content = $this->empty_content();
}
$pagination = $this->render_pagination( $results['next'], $results['prev'], $results['total_page'] );
$block = '' . apply_filters( 'jkit_module_block_container_extend', $content, $this->attribute ) . $this->render_preloader() . '
';
if ( ( isset( $this->attribute['pagination_mode'] ) && 'nextprev' === $this->attribute['pagination_mode'] ) && 'top' === $this->attribute['pagination_position'] ) {
$wrapper = $pagination . $block;
} else {
$wrapper = $block . $pagination;
}
return $wrapper;
}
/**
* Filter attribute for post query
*
* @param array $attr Attributes.
*
* @return array
*/
public function filter_post_attribute( $attr ) {
if ( isset( $attr['content_selection'] ) && 'related' === $attr['content_selection'] ) {
$post_id = get_the_ID();
$post_type = get_post_type( $post_id );
$category = $post_tag = array();
if ( in_array( $attr['related_filter'], array( 'category', 'both' ), true ) ) {
$cats = get_the_category( $post_id );
if ( $cats ) {
foreach ( $cats as $cat ) {
$category[] = $cat->term_id;
}
}
}
if ( in_array( $attr['related_filter'], array( 'tag', 'both' ), true ) ) {
$tags = get_the_tags( $post_id );
if ( $tags ) {
foreach ( $tags as $tag ) {
$post_tag[] = $tag->term_id;
}
}
}
if ( ! is_archive() && ! is_search() ) {
if ( ! empty( $attr['exclude_post'] ) ) {
$attr['exclude_post'] .= ',' . $post_id;
} else {
$attr['exclude_post'] = $post_id;
}
}
if ( ! empty( $post_type ) ) {
$attr['post_type'] = $post_type;
} else {
$attr['post_type'] = array();
}
$attr['include_tag'] = implode( ',', $post_tag );
$attr['include_category'] = implode( ',', $category );
$this->attr = $attr;
add_filter(
'jeg_default_query_args',
array( $this, 'custom_jeg_query_args' ),
10,
2
);
}
if ( jkit_is_multilanguage() ) {
$attr['lang'] = jkit_get_current_language();
}
return $attr;
}
/**
* Custom Jeg Query Args
*
* @param array $args
* @param array $filtered_attr
*
* @return array $args
*/
public function custom_jeg_query_args( $args, $filtered_attr ) {
if ( isset( $this->attr['content_selection'] ) && 'related' === $this->attr['content_selection'] ) {
if ( in_array( $this->attr['related_filter'], array( 'tag', 'both' ), true ) ) {
if ( empty( $this->attr['include_tag'] ) ) {
$args['tag__in'] = array( 0 );
}
}
if ( in_array( $this->attr['related_filter'], array( 'category', 'both' ), true ) ) {
if ( empty( $this->attr['include_category'] ) ) {
$args['category__in'] = array( 0 );
}
}
if ( $this->attr['related_filter'] === 'none' ) {
if ( is_archive() || is_search() ) {
$args = array_merge( $args, $GLOBALS['wp_query']->query );
}
}
}
remove_filter( 'jeg_default_query_args', array( $this, 'custom_jeg_query_args' ) );
return $args;
}
/**
* Check if current page is on the Elementor editor
*
* @return boolean
*/
protected function is_on_editor() {
if ( isset( $_REQUEST['action'] ) ) {
if ( ( $_REQUEST['action'] === 'elementor' || $_REQUEST['action'] === 'elementor_ajax' ) ) {
return true;
}
}
return false;
}
/**
* Build block content separately
*/
protected function build_content_separately( $name ) {
if ( $this->is_on_editor() || is_preview() ) {
return $this->build_content_backend( $name );
} else {
return $this->build_content_frontend( $name );
}
}
protected function build_content_backend( $name ) {}
protected function build_content_frontend( $name ) {}
protected function build_column( $result ) {}
}