$style ){ $new = ''; foreach( $style as $property => $value ){ if( $value == '' ){ $new .= $property; }else { $new .= " $property: $value;"; } } $output .= "$selector { $new }"; } return $output; } } // Advanced Post Block class AdvancedPostBlock { protected static $_instance = null; function __construct(){ add_action( 'enqueue_block_assets', [$this, 'enqueue_block_assets'] ); add_action( 'wp_enqueue_scripts', [$this, 'enqueue_assets'] ); if ( version_compare( $GLOBALS['wp_version'], '5.8-alpha-1', '<' ) ) { add_filter( 'block_categories', [$this, 'categories'] ); } else { add_filter( 'block_categories_all', [$this, 'categories'] ); } add_action( 'wp_loaded', [$this, 'register'] ); add_action( 'rest_api_init', [$this, 'custom_rest'] ); add_filter( 'excerpt_more', [$this, 'excerptMore'] ); } public static function instance(){ if( self::$_instance === null ){ self::$_instance = new self(); } return self::$_instance; } function enqueue_block_assets(){ wp_enqueue_script( 'swiperJS', AP_BLOCK_ASSETS_DIR . 'js/swiper-bundle.min.js', [], AP_BLOCK_PLUGIN_VERSION, true ); } function enqueue_assets(){ wp_enqueue_style( 'dashicons' ); } function categories( $categories ){ return array_merge( [ [ 'slug' => 'APBlock', 'title' => 'Advanced Post Block', ] ], $categories ); } // Categories function register(){ wp_register_script( 'ap_block_editor_script', plugins_url( 'dist/editor.js', __FILE__ ), [ 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-rich-text', 'jquery', 'swiperJS' ], AP_BLOCK_PLUGIN_VERSION, false ); // Backend Script wp_register_style( 'ap_block_editor_style', plugins_url( 'dist/editor.css', __FILE__ ), [ 'wp-edit-blocks' ], AP_BLOCK_PLUGIN_VERSION ); // Backend Style wp_register_script( 'ap_block_script', plugins_url( 'dist/script.js', __FILE__ ), [ 'jquery', 'swiperJS' ], AP_BLOCK_PLUGIN_VERSION, true ); // Frontend Script wp_register_style( 'ap_block_style', plugins_url( 'dist/style.css', __FILE__ ), [ 'wp-editor' ], AP_BLOCK_PLUGIN_VERSION ); // Frontend Style // Register Blocks register_block_type( 'ap-block/posts', [ 'editor_script' => 'ap_block_editor_script', 'editor_style' => 'ap_block_editor_style', 'script' => 'ap_block_script', 'style' => 'ap_block_style', 'render_callback' => [$this, 'render'] ] ); // Translate wp_set_script_translations( 'ap_block_editor_script', 'advanced-post-block', plugin_dir_path( __FILE__ ) . 'languages' ); } // Register function render( $attributes ) { extract( $attributes ); $align = $align ?? 'wide'; $cId = $cId ?? ''; $layout = $layout ?? 'grid'; $columns = $columns ?? [ 'desktop' => 3, 'tablet' => 2, 'mobile' => 1 ]; $columnGap = $columnGap ?? 15; $rowGap = $rowGap ?? 15; $isContentEqualHight = $isContentEqualHight ?? true; $sliderHeight = $sliderHeight ?? '350px'; $postType = $postType ?? 'post'; $selectedCategories = $selectedCategories ?? []; $isPostsPerPageAll = $isPostsPerPageAll ?? false; $postsPerPage = $postsPerPage ?? 12; $postsOrderBy = $postsOrderBy ?? 'date'; $postsOrder = $postsOrder ?? 'desc'; $contentAlign = $contentAlign ?? 'left'; $contentBG = $contentBG ?? [ 'color' => '#f4f2fc' ]; $contentPadding = $contentPadding ?? [ 'vertical' => '20px', 'horizontal' => '25px' ]; $border = $border ?? [ 'radius' => '5px' ]; $sliderIsPage = $sliderIsPage ?? true; $sliderPageColor = $sliderPageColor ?? '#4527a4'; $sliderPageWidth = $sliderPageWidth ?? '15px'; $sliderPageHeight = $sliderPageHeight ?? '15px'; $sliderPageBorder = $sliderPageBorder ?? [ 'radius' => '50%' ]; $sliderIsPrevNext = $sliderIsPrevNext ?? true; $sliderPrevNextColor = $sliderPrevNextColor ?? '#4527a4'; $isFImg = $isFImg ?? true; $titleTypo = $titleTypo ?? [ 'fontFamily' => 'Roboto', 'fontSize' => 25, 'googleFontLink' => 'https://fonts.googleapis.com/css2?family=Roboto&display=swap' ]; $titleColor = $titleColor ?? '#4527a4'; $titleMargin = $titleMargin ?? [ 'bottom' => '15px' ]; $metaTypo = $metaTypo ?? [ 'fontSize' => 13, 'textTransform' => 'uppercase' ]; $metaTextColor = $metaTextColor ?? '#333'; $metaLinkColor = $metaLinkColor ?? '#8344c5'; $metaIconColor = $metaIconColor ?? '#4527a4'; $metaMargin = $metaMargin ?? [ 'bottom' => '15px' ]; $excerptAlign = $excerptAlign ?? 'justify'; $excerptTypo = $excerptTypo ?? [ 'fontSize' => 15 ]; $excerptColor = $excerptColor ?? '#333'; $excerptMargin = $excerptMargin ?? [ 'bottom' => '10px' ]; $readMoreAlign = $readMoreAlign ?? 'left'; $readMoreTypo = $readMoreTypo ?? [ 'fontSize' => 14, 'textTransform' => 'uppercase', 'fontWeight' => 600 ]; $readMoreColors = $readMoreColors ?? [ 'color' => '#fff', 'bg' => '#8344c5' ]; $readMoreHovColors = $readMoreHovColors ?? [ 'color' => '#fff', 'bg' => '#4527a4' ]; $readMorePadding = $readMorePadding ?? [ 'vertical' => '12px', 'horizontal' => '35px' ]; $readMoreBorder = $readMoreBorder ?? [ 'radius' => '3px' ]; // Generate Styles $apbPostsStyles = new APBlockStyleGenerator(); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost", [ 'margin-bottom' => 'masonry' === $layout ? $rowGap.'px' : '0px', $border['styles'] ?? 'border-radius: 5px;' => '' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPostDefault, #apbAdvancedPosts-$cId .apbPostSideImage", [ 'text-align' => $contentAlign, $contentBG['styles'] ?? 'background-color: #f4f2fc;' => '' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostText", [ 'padding' => $contentPadding['styles'] ?? '20px 25px' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPostOverlay .apbPostText", [ $contentBG['styles'] ?? 'background-color: #f4f2fc;' => '', 'align-items' => 'left' === $contentAlign ? 'flex-start' : ( 'right' === $contentAlign ? 'flex-end' : ( 'center' === $contentAlign ? 'center' : 'stretch' ) ) ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostTitle", [ 'text-align' => $contentAlign, $titleTypo['styles'] ?? 'font-size: 25px;' => '', 'color' => $titleColor, 'margin' => $titleMargin['styles'] ?? '0 0 15px 0' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostTitle a", [ 'color' => $titleColor ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostMeta", [ 'text-align' => $contentAlign, $metaTypo['styles'] ?? 'font-size: 13px; text-transform: uppercase;' => '', 'color' => $metaTextColor, 'margin' => $metaMargin['styles'] ?? '0 0 15px 0' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostMeta a", [ 'color' => $metaLinkColor ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostMeta .dashicons", [ 'color' => $metaIconColor ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostFImgCats", [ $metaTypo['styles'] ?? 'font-size: 13px; text-transform: uppercase;' => '' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostExcerpt", [ 'text-align' => $excerptAlign, $excerptTypo['styles'] ?? 'font-size: 15px;' => '', 'color' => $excerptColor, 'margin' => $excerptMargin['styles'] ?? '0 0 10px 0' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostReadMore", [ 'text-align' => $readMoreAlign ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostReadMore a", [ $readMoreTypo['styles'] ?? 'font-size: 14px; text-transform: uppercase; font-weight: 600;' => '', $readMoreColors['styles'] ?? 'color: #fff; background: #8344c5;' => '', 'padding' => $readMorePadding['styles'] ?? '12px 35px', $readMoreBorder['styles'] ?? 'border-radius: 3px;' => '' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbPost .apbPostReadMore a:hover", [ $readMoreHovColors['styles'] ?? 'color: #fff; background: #4527a4;' => '' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbGridPosts", [ 'grid-gap' => $rowGap .'px '. $columnGap .'px', 'align-items' => false === $isContentEqualHight ? 'start' : 'initial' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbMasonryPosts", [ 'gap' => $columnGap . 'px' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbSliderPosts, #apbAdvancedPosts-$cId .apbSliderPosts .swiper-slide", [ 'min-height' => $sliderHeight ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbSliderPosts .swiper-pagination .swiper-pagination-bullet", [ 'background' => $sliderPageColor, 'width' => $sliderPageWidth, 'height' => $sliderPageHeight, $sliderPageBorder['styles'] ?? 'border-radius: 50%;' => '' ] ); $apbPostsStyles::addStyle( "#apbAdvancedPosts-$cId .apbSliderPosts .swiper-button-prev, #apbAdvancedPosts-$cId .apbSliderPosts .swiper-button-next", [ 'color' => $sliderPrevNextColor ] ); // All Posts $defaultPostFilter = 'post' === $postType ? [ 'category' => $selectedCategories ] : []; $posts = get_posts( array_merge( [ 'post_type' => $postType, 'posts_per_page' => $isPostsPerPageAll ? -1 : $postsPerPage, 'orderby' => $postsOrderBy, 'order' => $postsOrder ], $defaultPostFilter ) ); $jsonData = wp_json_encode( [ 'layout' => $layout, 'columns' => $columns, 'columnGap' => $columnGap, 'sliderIsLoop' => $sliderIsLoop ?? true, 'sliderIsTouchMove' => $sliderIsTouchMove ?? false, 'sliderIsAutoplay' => $sliderIsAutoplay ?? true, 'sliderSpeed' => $sliderSpeed ?? 1.5, 'sliderEffect' => $sliderEffect ?? 'slide', 'sliderIsPageClickable' => $sliderIsPageClickable ?? true, 'sliderIsPageDynamic' => $sliderIsPageDynamic ?? true ] ); ob_start(); ?>