| @@ -1,51 +1,171 @@ | ||
| 1 | -<?php | |
| 2 | - | |
| 3 | -namespace Tableberg\Patterns; | |
| 4 | - | |
| 5 | -class RegisterPatterns | |
| 6 | -{ | |
| 7 | - | |
| 8 | - public static function from_dir($dir) | |
| 9 | - { | |
| 10 | - if (!file_exists($dir)) { | |
| 11 | - return; | |
| 12 | - } | |
| 13 | - $files = scandir($dir); | |
| 14 | - foreach ($files as $file) { | |
| 15 | - if ($file == '.' || $file == '..') { | |
| 16 | - continue; | |
| 17 | - } | |
| 18 | - $content = json_decode(file_get_contents($dir . '/' . $file), true); | |
| 19 | - register_block_pattern('tableberg/' . str_replace('.json', '', $file), $content); | |
| 20 | - } | |
| 21 | - } | |
| 22 | - | |
| 23 | - public static function upsells() | |
| 24 | - { | |
| 25 | - $dir = __DIR__ . '/upsells'; | |
| 26 | - if (!file_exists($dir)) { | |
| 27 | - return; | |
| 28 | - } | |
| 29 | - $files = scandir($dir); | |
| 30 | - foreach ($files as $file) { | |
| 31 | - if ($file == '.' || $file == '..') { | |
| 32 | - continue; | |
| 33 | - } | |
| 34 | - $content = json_decode(file_get_contents($dir . '/' . $file), true); | |
| 35 | - $content['content'] = str_replace('::PLUGIN_URL::', TABLEBERG_URL, $content['content']); | |
| 36 | - register_block_pattern('tableberg/' . str_replace('.json', '', $file), $content); | |
| 37 | - } | |
| 38 | - } | |
| 39 | - | |
| 40 | - public static function categories() | |
| 41 | - { | |
| 42 | - register_block_pattern_category('tableberg', array('label' => 'Tableberg')); | |
| 43 | - | |
| 44 | - register_block_pattern_category('comparison-table', array('label' => 'Comparison Table')); | |
| 45 | - register_block_pattern_category('featured-box', array('label' => 'Featured Box')); | |
| 46 | - register_block_pattern_category('pricing-table', array('label' => 'Pricing Table')); | |
| 47 | - register_block_pattern_category('pros-cons', array('label' => 'Pros & Cons')); | |
| 48 | - | |
| 49 | - register_block_pattern_category('other', array('label' => 'Other')); | |
| 50 | - } | |
| 51 | -} | |
| 1 | +<?php | |
| 2 | + | |
| 3 | +namespace Tableberg\Patterns; | |
| 4 | + | |
| 5 | +use WP_Block_Pattern_Categories_Registry; | |
| 6 | +use WP_Block_Patterns_Registry; | |
| 7 | + | |
| 8 | +use function register_rest_field; | |
| 9 | +use function trailingslashit; | |
| 10 | + | |
| 11 | +class RegisterPatterns { | |
| 12 | + static $image_path_segment = 'includes/Patterns/images'; | |
| 13 | + | |
| 14 | + public static function from_dir($dir) { | |
| 15 | + if (! file_exists($dir)) { | |
| 16 | + return; | |
| 17 | + } | |
| 18 | + $files = scandir($dir); | |
| 19 | + foreach ($files as $file) { | |
| 20 | + if ($file == '.' || $file == '..') { | |
| 21 | + continue; | |
| 22 | + } | |
| 23 | + $content = json_decode(file_get_contents($dir . '/' . $file), true); | |
| 24 | + register_block_pattern('tableberg/' . str_replace('.json', '', $file), $content); | |
| 25 | + } | |
| 26 | + } | |
| 27 | + | |
| 28 | + public static function upsells() { | |
| 29 | + $dir = __DIR__ . '/upsells'; | |
| 30 | + if (! file_exists($dir)) { | |
| 31 | + return; | |
| 32 | + } | |
| 33 | + $files = scandir($dir); | |
| 34 | + foreach ($files as $file) { | |
| 35 | + if ($file == '.' || $file == '..') { | |
| 36 | + continue; | |
| 37 | + } | |
| 38 | + $content = json_decode(file_get_contents($dir . '/' . $file), true); | |
| 39 | + $content['content'] = str_replace('::PLUGIN_URL::', TABLEBERG_URL, $content['content']); | |
| 40 | + register_block_pattern('tableberg/' . str_replace('.json', '', $file), $content); | |
| 41 | + } | |
| 42 | + } | |
| 43 | + | |
| 44 | + public static function categories() { | |
| 45 | + register_block_pattern_category('tableberg', array( 'label' => __('Tableberg', 'tableberg') )); | |
| 46 | + | |
| 47 | + register_block_pattern_category('comparison-table', array( 'label' => __('Comparison Table', 'tableberg') )); | |
| 48 | + register_block_pattern_category('featured-box', array( 'label' => __('Featured Box', 'tableberg') )); | |
| 49 | + register_block_pattern_category('pricing-table', array( 'label' => __('Pricing Table', 'tableberg') )); | |
| 50 | + register_block_pattern_category('pros-cons', array( 'label' => __('Pros & Cons', 'tableberg') )); | |
| 51 | + | |
| 52 | + register_block_pattern_category('other', array( 'label' => __('Other', 'tableberg') )); | |
| 53 | + } | |
| 54 | + | |
| 55 | + /** | |
| 56 | + * Generate the tableberg pattern name from the pattern id. | |
| 57 | + * | |
| 58 | + * Tableberg patterns are registered with the format of tableberg/{upsell-}?pattern-{pattern_name}. | |
| 59 | + * | |
| 60 | + * @param string $pattern_id ID of the pattern as it is registered to patterns api. | |
| 61 | + * | |
| 62 | + * @return false | string The tableberg pattern name or false if id of pattern is not from tableberg. | |
| 63 | + */ | |
| 64 | + public static function generate_tableberg_pattern_name($pattern_id) { | |
| 65 | + $generated_name = false; | |
| 66 | + $tableberg_prefix_matches = array(); | |
| 67 | + $match_status = preg_match('/^tableberg\/(.*)/', $pattern_id, $tableberg_prefix_matches); | |
| 68 | + | |
| 69 | + if ($match_status) { | |
| 70 | + $generated_name = $tableberg_prefix_matches[1]; | |
| 71 | + | |
| 72 | + // Check if the pattern is an upsell pattern. | |
| 73 | + $upsell_name_matches = array(); | |
| 74 | + $is_upsell = preg_match('/^upsell\-(.*)/', $generated_name, $upsell_name_matches); | |
| 75 | + if ($is_upsell) { | |
| 76 | + $generated_name = $upsell_name_matches[1]; | |
| 77 | + } | |
| 78 | + } | |
| 79 | + | |
| 80 | + return $generated_name; | |
| 81 | + } | |
| 82 | + | |
| 83 | + /** | |
| 84 | + * Register custom rest fields for tableberg patterns. | |
| 85 | + */ | |
| 86 | + public static function register_pattern_custom_rest_fields() { | |
| 87 | + $image_path_segment = static::$image_path_segment; | |
| 88 | + register_rest_field( | |
| 89 | + 'block-pattern', | |
| 90 | + 'tablebergPatternScreenshot', | |
| 91 | + array( | |
| 92 | + 'get_callback' => function ($pattern_obj) use ($image_path_segment) { | |
| 93 | + return self::generate_screenshot_path($pattern_obj, $image_path_segment); | |
| 94 | + }, | |
| 95 | + 'schema' => array( | |
| 96 | + 'description' => __('The screenshot url of the tableberg pattern.', 'tableberg'), | |
| 97 | + 'type' => 'string', | |
| 98 | + 'oneOf' => array( | |
| 99 | + array( | |
| 100 | + 'type' => 'string', | |
| 101 | + 'format' => 'uri', | |
| 102 | + ), | |
| 103 | + array( | |
| 104 | + 'type' => 'boolean', | |
| 105 | + 'enum' => false, | |
| 106 | + ), | |
| 107 | + ), | |
| 108 | + 'context' => array( 'view' ), | |
| 109 | + ), | |
| 110 | + ) | |
| 111 | + ); | |
| 112 | + } | |
| 113 | + | |
| 114 | + /** | |
| 115 | + * Generate the screenshot url for the tableberg pattern. | |
| 116 | + * | |
| 117 | + * @param array $pattern_obj The pattern object. | |
| 118 | + * @param string $image_path_segment The path segment to the images directory relative to the plugin root. | |
| 119 | + * | |
| 120 | + * @return string|false The screenshot url or false if the pattern is not from tableberg. | |
| 121 | + */ | |
| 122 | + public static function generate_screenshot_path($pattern_obj, $image_path_segment) { | |
| 123 | + $screenshot_url = false; | |
| 124 | + $pattern_name = $pattern_obj['name']; | |
| 125 | + | |
| 126 | + $pattern_name = self::generate_tableberg_pattern_name($pattern_name); | |
| 127 | + | |
| 128 | + // Only add rest field value if the pattern is from tableberg. | |
| 129 | + if ($pattern_name) { | |
| 130 | + $path_segment = sprintf('%s/%s.png', $image_path_segment, $pattern_name); | |
| 131 | + $screenshot_url = trailingslashit(TABLEBERG_URL) . $path_segment; | |
| 132 | + } | |
| 133 | + return $screenshot_url; | |
| 134 | + } | |
| 135 | + | |
| 136 | + /** | |
| 137 | + * Get all registered tableberg patterns. | |
| 138 | + * | |
| 139 | + * @return array The list of all registered tableberg patterns. | |
| 140 | + */ | |
| 141 | + public static function get_all_registered_tableberg_patterns() { | |
| 142 | + $available_block_patterns = WP_Block_Patterns_Registry::get_instance()->get_all_registered(); | |
| 143 | + | |
| 144 | + return array_values( | |
| 145 | + array_map( | |
| 146 | + function ($pattern_obj) { | |
| 147 | + $pattern_screenshot_url = self::generate_screenshot_path($pattern_obj, static::$image_path_segment); | |
| 148 | + $pattern_obj['tablebergPatternScreenshot'] = $pattern_screenshot_url; | |
| 149 | + | |
| 150 | + return $pattern_obj; | |
| 151 | + }, | |
| 152 | + array_filter( | |
| 153 | + $available_block_patterns, | |
| 154 | + function ($pattern_obj) { | |
| 155 | + $pattern_name = $pattern_obj['name']; | |
| 156 | + return self::generate_tableberg_pattern_name($pattern_name); | |
| 157 | + } | |
| 158 | + ) | |
| 159 | + ) | |
| 160 | + ); | |
| 161 | + } | |
| 162 | + | |
| 163 | + /** | |
| 164 | + * Get all registered block pattern categories. | |
| 165 | + * | |
| 166 | + * @return array The list of all available block pattern categories. | |
| 167 | + */ | |
| 168 | + public static function get_all_registered_tableberg_pattern_categories() { | |
| 169 | + return WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered(); | |
| 170 | + } | |
| 171 | +} | |