array( 'name' => __( '01 — Minimal', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'A label and a link. Perfect inside a paragraph run.', 'advanced-css3-related-posts-widget' ), 'layout' => 'list', 'group' => 'any', 'fields' => array( 'title' ), 'supports' => array( 'title', 'category', 'date', 'readtime' ), ), 'tpl-02' => array( 'name' => __( '02 — Editorial', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'A bordered "read next" box, made for mid-article placement.', 'advanced-css3-related-posts-widget' ), 'layout' => 'inline', 'group' => 'any', 'fields' => array( 'title', 'excerpt' ), 'supports' => array( 'image', 'title', 'excerpt', 'category', 'readtime', 'button' ), ), 'tpl-03' => array( 'name' => __( '03 — Image Card', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'The classic modern card: image, term, title, meta.', 'advanced-css3-related-posts-widget' ), 'layout' => 'grid', 'group' => 'any', 'fields' => array( 'image', 'category', 'title', 'readtime' ), 'supports' => array( 'image', 'title', 'excerpt', 'category', 'date', 'author', 'readtime', 'button', 'price', 'rating' ), ), 'tpl-04' => array( 'name' => __( '04 — Horizontal', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'Thumbnail on the left, copy on the right.', 'advanced-css3-related-posts-widget' ), 'layout' => 'horizontal', 'group' => 'any', 'fields' => array( 'image', 'title', 'excerpt', 'button' ), 'supports' => array( 'image', 'title', 'excerpt', 'category', 'date', 'author', 'readtime', 'button', 'price' ), ), 'tpl-05' => array( 'name' => __( '05 — Magazine Grid', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'One hero item beside a stack of smaller ones.', 'advanced-css3-related-posts-widget' ), 'layout' => 'grid', 'group' => 'any', 'fields' => array( 'image', 'category', 'title', 'date' ), 'supports' => array( 'image', 'title', 'excerpt', 'category', 'date', 'author', 'readtime' ), ), 'tpl-06' => array( 'name' => __( '06 — Numbered', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'A ranked list. Featherweight, no images.', 'advanced-css3-related-posts-widget' ), 'layout' => 'list', 'group' => 'any', 'fields' => array( 'title', 'date' ), 'supports' => array( 'title', 'category', 'date', 'author', 'readtime', 'price' ), ), 'tpl-07' => array( 'name' => __( '07 — Glass Cards', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'Frosted translucent cards with a soft accent glow.', 'advanced-css3-related-posts-widget' ), 'layout' => 'grid', 'group' => 'any', 'fields' => array( 'image', 'title', 'excerpt' ), 'supports' => array( 'image', 'title', 'excerpt', 'category', 'date', 'readtime', 'button', 'price' ), ), 'tpl-08' => array( 'name' => __( '08 — Featured Recommendation', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'A single large recommendation for long-form content.', 'advanced-css3-related-posts-widget' ), 'layout' => 'single', 'group' => 'any', 'fields' => array( 'image', 'category', 'title', 'excerpt', 'button' ), 'supports' => array( 'image', 'title', 'excerpt', 'category', 'date', 'author', 'readtime', 'button', 'price', 'cart' ), ), 'tpl-09' => array( 'name' => __( '09 — Compact Pills', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'Very low height. Ideal between paragraphs.', 'advanced-css3-related-posts-widget' ), 'layout' => 'compact', 'group' => 'any', 'fields' => array( 'title' ), 'supports' => array( 'image', 'title', 'category', 'price' ), ), 'tpl-10' => array( 'name' => __( '10 — Product Cards', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'Image, title, rating, price and Add to Cart.', 'advanced-css3-related-posts-widget' ), 'layout' => 'grid', 'group' => 'product', 'fields' => array( 'image', 'title', 'rating', 'price', 'cart', 'badge' ), 'supports' => array( 'image', 'title', 'excerpt', 'category', 'rating', 'price', 'cart', 'badge', 'button' ), ), 'tpl-11' => array( 'name' => __( '11 — Product Minimal', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'A tight row: thumbnail, name, price.', 'advanced-css3-related-posts-widget' ), 'layout' => 'list', 'group' => 'product', 'fields' => array( 'image', 'title', 'price' ), 'supports' => array( 'image', 'title', 'price', 'rating', 'category', 'cart' ), ), 'tpl-12' => array( 'name' => __( '12 — Carousel', 'advanced-css3-related-posts-widget' ), 'desc' => __( 'Sliding cards for long recommendation sets.', 'advanced-css3-related-posts-widget' ), 'layout' => 'carousel', 'group' => 'any', 'fields' => array( 'image', 'title', 'price' ), 'supports' => array( 'image', 'title', 'excerpt', 'category', 'date', 'readtime', 'price', 'rating', 'cart', 'button' ), ), ); self::$registry = apply_filters( 'srpp_templates', $templates ); return self::$registry; } /** * Get a template definition. * * @param string $id Template ID. * @return array */ public static function get( $id ) { $all = self::all(); if ( isset( $all[ $id ] ) ) { $all[ $id ]['id'] = $id; return $all[ $id ]; } $first = key( $all ); $all[ $first ]['id'] = $first; return $all[ $first ]; } /** * Does a template exist? * * @param string $id Template ID. * @return bool */ public static function exists( $id ) { $all = self::all(); return isset( $all[ $id ] ); } /** * Absolute path to a template file, honouring theme overrides in * /your-theme/advanced-css3-related-posts-widget/tpl-03.php * (the legacy /your-theme/stunning-related/ folder still works). * * @param string $id Template ID. * @return string */ public static function path( $id ) { $file = sanitize_file_name( $id . '.php' ); $theme = locate_template( array( 'advanced-css3-related-posts-widget/' . $file, 'stunning-related/' . $file, ) ); if ( $theme ) { return $theme; } $path = SRPP_PATH . 'templates/' . $file; return file_exists( $path ) ? $path : SRPP_PATH . 'templates/tpl-01.php'; } }