<?php class Customify_Posts_Layout { public $args = array(); public $customizer_args = array(); public $entry_class = ''; function set_args($customizer_args = array()) { $args = array( 'layout' => Customify()->get_setting($customizer_args['prefix'] . '_layout'), 'excerpt_type' => Customify()->get_setting($customizer_args['prefix'] . '_excerpt_type'), 'excerpt_length' => Customify()->get_setting($customizer_args['prefix'] . '_excerpt_length'), 'excerpt_more' => Customify()->get_setting($customizer_args['prefix'] . '_excerpt_more'), 'more_text' => Customify()->get_setting($customizer_args['prefix'] . '_more_text'), 'more_display' => Customify()->get_setting($customizer_args['prefix'] . '_more_display'), 'thumbnail_size' => Customify()->get_setting($customizer_args['prefix'] . '_thumbnail_size'), 'hide_thumb_if_empty' => Customify()->get_setting($customizer_args['prefix'] . '_hide_thumb_if_empty'), 'meta_config' => Customify()->get_setting($customizer_args['prefix'] . '_meta_config'), 'meta_sep' => Customify()->get_setting($customizer_args['prefix'] . '_meta_sep'), 'author_avatar' => Customify()->get_setting($customizer_args['prefix'] . '_author_avatar'), 'media_hide' => Customify()->get_setting($customizer_args['prefix'] . '_media_hide'), 'use_ratio' => Customify()->get_setting($customizer_args['prefix'] . '_use_ratio', true), ); $size = Customify()->get_setting($customizer_args['prefix'] . '_avatar_size'); if (is_array($size) && isset($size['value'])) { $args['avatar_size'] = absint($size['value']); } $pagination = array( 'show_paging' => Customify()->get_setting($customizer_args['prefix'] . '_pg_show_paging'), 'show_nav' => Customify()->get_setting($customizer_args['prefix'] . '_pg_show_nav'), 'mid_size' => Customify()->get_setting($customizer_args['prefix'] . '_pg_mid_size'), 'prev_text' => Customify()->get_setting($customizer_args['prefix'] . '_pg_prev_text'), 'next_text' => Customify()->get_setting($customizer_args['prefix'] . '_pg_next_text'), ); $args['pagination'] = is_array($pagination) ? $pagination : array(); $this->customizer_args = $customizer_args; $_args = wp_parse_args( $args, array( 'layout' => '', 'columns' => '', 'excerpt_length' => '', 'excerpt_more' => '', 'more_text' => '', 'more_display' => 1, 'thumbnail_size' => '', 'hide_thumb_if_empty' => 1, 'pagination' => array(), 'meta_config' => array(), 'meta_sep' => null, ) ); if (!$_args['layout'] || is_array($_args['layout'])) { $_args['layout'] = 'blog_classic'; } $_args['pagination'] = wp_parse_args( $_args['pagination'], array( 'show_paging' => 1, 'show_number' => 1, 'show_nav' => 1, 'prev_text' => '', 'next_text' => '', 'mid_size' => 3, ) ); if (!$_args['columns']) { $c = $this->get_predefined($_args['layout']); if ($c) { $_args['columns'] = $c['columns']; } } $_args['columns'] = absint($_args['columns']); if ($_args['columns'] < 1) { $_args['columns'] = 1; } if ((!isset($args['columns']) || !$args['columns']) && 'blog_masonry' == $_args['layout']) { $_args['columns'] = 3; } if (in_array($_args['layout'], array('blog_lateral', 'blog_classic'))) { // phpcs:ignore $_args['columns'] = 1; } $_args['pagination']['mid_size'] = absint($_args['pagination']['mid_size']); if (empty($_args['meta_config'])) { $_args['meta_config'] = array( array( '_key' => 'author', ), array( '_key' => 'date', ), array( '_key' => 'categories', ), array( '_key' => 'comment', ), ); } $this->args = $_args; $this->args['header_fields'] = array( array( '_visibility' => '', '_key' => 'title', ), array( '_key' => 'meta', '_visibility' => '', ), ); $this->args['body_fields'] = array( array( '_key' => 'excerpt', '_visibility' => '', ), ); $this->args['footer_fields'] = array( array( '_key' => 'readmore', '_visibility' => '', ), ); $this->args['media_fields'] = array(); if (isset($this->customizer_args['_overwrite'])) { $this->args = array_merge($this->args, $this->customizer_args['_overwrite']); } Customify_Post_Entry()->set_config($this->args); } function has_only_field($fields, $field = 'category') { $check = false; $n = 0; $c = false; foreach ((array) $fields as $item) { $item = wp_parse_args( $item, array( '_key' => '', '_visibility' => '', ) ); if ('hidden' !== $item['_visibility']) { $n++; if ($item['_key'] == $field) { $c = true; } } } if ($c && $n < 2) { $check = true; } else { $check = false; } return $check; } function count_item_visibility($fields) { $n = 0; foreach ((array) $fields as $item) { $item = wp_parse_args( $item, array( '_key' => '', '_visibility' => '', ) ); if ('hidden' !== $item['_visibility']) { $n++; } } return $n; } function item_part($part = '', $post = null, $inner_class = '') { $n = $this->count_item_visibility($this->args[$part . '_fields']); if (isset($this->args[$part . '_fields']) && $n > 0) { if ('media' == $part && $this->has_only_field($this->args[$part . '_fields'])) { Customify_Post_Entry()->build_fields($this->args[$part . '_fields'], $post); } else { $only_more = $this->has_only_field($this->args[$part . '_fields'], 'readmore'); $classes = array(); $classes[] = 'entry-article-part entry-article-' . $part; if ($only_more) { $classes[] = 'only-more'; } echo '<div class="' . esc_attr(join(' ', $classes)) . '">'; if ($inner_class) { echo '<div class="' . esc_attr($inner_class) . '">'; } Customify_Post_Entry()->build_fields($this->args[$part . '_fields'], $post); if ($inner_class) { echo '</div>'; } echo '</div>'; } } } function layout($post = null) { $media_fields = array( array( '_key' => 'thumbnail', ), ); if ($this->args['media_hide']) { $show_media = false; } else { $show_media = true; if (!has_post_thumbnail($post)) { if ($this->args['hide_thumb_if_empty']) { $show_media = false; } } } $media_classes = ['entry-media']; if ( $this->args['use_ratio'] ) { $media_classes[] = 'use-ratio'; } else { $media_classes[] = 'no-ratio'; } switch ($this->args['layout']) { case 'blog_column': $this->item_part('header', $post); if ($show_media && $this->count_item_visibility($this->args['header_fields'])) { ?> <div class="entry-article-part <?php echo join( ' ', $media_classes ); // WPCS: XSS ok. ?>"> <a class="entry-media-link " href="<?php echo esc_url(get_permalink($post)); ?>" title="<?php the_title_attribute(); ?>" rel="bookmark"></a> <?php Customify_Post_Entry()->build_fields($media_fields, $post); $this->item_part('media', $post, 'media-content-inner'); ?> </div> <?php } ?> <div class="entry-content-data"> <?php $this->item_part('body', $post); $this->item_part('footer', $post); ?> </div> <?php break; default: if ($show_media && $this->count_item_visibility($this->args['header_fields'])) { ?> <div class="<?php echo join( ' ', $media_classes ); // WPCS: XSS ok. ?>"> <a class="entry-media-link " href="<?php echo esc_url(get_permalink($post)); ?>" title="<?php the_title_attribute(); ?>" rel="bookmark"></a> <?php Customify_Post_Entry()->build_fields($media_fields, $post); $this->item_part('media', $post, 'media-content-inner'); ?> </div> <?php } ?> <div class="entry-content-data"> <?php $this->item_part('header', $post); $this->item_part('body', $post); $this->item_part('footer', $post); ?> </div> <?php } } function blog_item($post = null, $class = null) { $entry_class = array('entry'); if (is_numeric($this->args['columns']) && $this->args['columns'] > 1) { $entry_class[] = 'customify-col'; } elseif (is_array($this->args['columns'])) { $entry_class[] = 'customify-col'; } if ($class) { $entry_class[] = $class; } if ($this->entry_class) { $entry_class[] = $this->entry_class; } $key = 'loop'; if (is_single()) { $key = 'single'; } Customify_Post_Entry()->set_post($post); /** * Hook before each post * * @since 0.2.0 */ do_action("customify/before-post/{$key}"); ?> <article <?php post_class(join(' ', $entry_class), $post); ?>> <div class="entry-inner"> <?php $this->layout($post); ?> </div> </article><!-- /.entry post --> <?php /** * Hook after each post * * @since 0.2.0 */ do_action("customify/after-post/{$key}"); } function get_predefined($layout) { if (!is_string($layout)) { return false; } $presets = array( 'blog_classic' => array( 'columns' => 1, 'pagination' => array(), ), 'blog_lateral' => array( 'columns' => 1, 'pagination' => array(), ), 'blog_boxed' => array( 'columns' => 2, 'pagination' => array(), ), ); if (!empty($layout)) { if (isset($presets[$layout]) && $presets[$layout]) { return $presets[$layout]; } } return false; } function render($customizer_args = array()) { $this->set_args($customizer_args); $classes = array(); $atts = array(); if (is_numeric($this->args['columns']) && $this->args['columns'] > 1) { $classes['grid'] = 'customify-grid-' . $this->args['columns']; $atts['data-col'] = $this->args['columns']; } elseif (is_array($this->args['columns'])) { $this->args['columns'] = wp_parse_args( $this->args['columns'], array( 'desktop' => 1, 'tablet' => 1, 'mobile' => 1, ) ); foreach ($this->args['columns'] as $d => $v) { $v = absint($v); if ($v < 1) { $v = 1; } elseif ($v > 12) { $v = 12; } $this->args['columns'][$d] = $v; $atts['data-col-' . $d] = $v; } $classes['grid'] = sprintf('customify-grid-%1$s_sm-%2$s_xs-%3$s', $this->args['columns']['desktop'], $this->args['columns']['tablet'], $this->args['columns']['mobile']); } $classes[] = 'posts-layout'; $classes[] = 'layout--' . $this->args['layout']; $s_atts = ''; foreach ($atts as $k => $v) { $s_atts .= " {$k}='" . esc_attr($v) . "' "; } do_action('customify/blog/before-render', $this); ?> <div class="posts-layout-wrapper"> <div class="<?php echo esc_attr(join(' ', $classes)); ?>" <?php echo $s_atts; // WPCS: XSS OK. ?>> <?php if ('blog_timeline' == $this->args['layout']) { echo '<div class="time-line"></div>'; } ?> <?php if (have_posts()) { global $post; /* Start the Loop */ $i = 1; while (have_posts()) { the_post(); $this->blog_item($post, (0 == $i % 2) ? 'even' : 'odd'); $i++; } } else { get_template_part('template-parts/content', 'none'); } ?> </div> <?php $this->render_pagination(); ?> </div> <?php do_action('customify/blog/after-render', $this); } function render_pagination() { if (!$this->args['pagination']['show_paging']) { return; } $prev_next = true; if ($this->args['pagination']['show_nav']) { $prev_text = $this->args['pagination']['prev_text']; $next_text = $this->args['pagination']['next_text']; if (!$prev_text) { $prev_text = _x('Previous', 'previous set of posts', 'customify'); } if (!$next_text) { $next_text = _x('Next', 'next set of posts', 'customify'); } } else { $prev_text = false; $next_text = false; $prev_next = false; } the_posts_pagination( array( 'mid_size' => ($this->args['pagination']['mid_size']) ? 3 : 0, 'prev_text' => $prev_text, 'next_text' => $next_text, 'prev_next' => $prev_next, ) ); } }