diff --git a/inc/class-settings.php b/inc/class-settings.php index c620310..cbb4929 100644 --- a/inc/class-settings.php +++ b/inc/class-settings.php @@ -12,6 +12,8 @@ namespace Ogre\Sort; use Ogre\Singleton; use Ogre\Sort as Plugin; +use WP_Post_Type; +use WP_Taxonomy; defined('ABSPATH') || exit; @@ -29,21 +31,24 @@ final class Settings { public function register_relationships(array $relationships):array { // Post Types foreach ($this->get('post_types') as $post_type) { - $relationships[] = ['post_type' => $post_type]; + $relationships[] = [ + 'post_type' => $post_type, + ]; } // Taxonomies foreach ($this->get('taxonomies') as $taxonomy) { - $relationships[] = ['taxonomy' => $taxonomy]; + $relationships[] = [ + 'taxonomy' => $taxonomy, + ]; } // Taxonomy Posts - foreach ($this->get('taxonomy_post_types') as $key) { - $parts = explode('~', $key); - if (count($parts) == 2) { - $relationships = [ - 'post_type' => $parts[0], - 'taxonomy' => $parts[1], + foreach ($this->get_post_types('names') as $post_type) { + foreach ($this->get($post_type) as $taxonomy) { + $relationships[] = [ + 'post_type' => $post_type, + 'taxonomy' => $taxonomy, ]; } } @@ -67,56 +72,102 @@ final class Settings { add_options_page(sprintf(Plugin::__('%s Settings'), Plugin::get_title()), Plugin::get_title(), self::CAPABILITY, Plugin::get_id(), [$this, 'page']); } + private function get_post_types(string $output = 'objects'):array { + $post_types = array_filter( + get_post_types( + [ + 'show_ui' => true, + 'show_in_menu' => true, + ], + 'objects' + ), + fn (WP_Post_Type $post_type):bool => $post_type->name !== 'attachment' + ); + if ($output == 'names') { + return wp_list_pluck($post_types, 'name'); + } else { + return $post_types; + } + } + + private function get_taxonomies(string $output = 'objects'):array { + $taxonomies = array_filter( + get_taxonomies( + [ + 'show_ui' => true, + ], + 'objects' + ), + fn (WP_Taxonomy $taxonomy):bool => $taxonomy->name !== 'post_format' + ); + if ($output == 'names') { + return wp_list_pluck($taxonomies, 'name'); + } else { + return $taxonomies; + } + } + + private function get_object_taxonomies(string $object_type, string $output = 'objects'):array { + $taxonomies = array_filter( + get_object_taxonomies($object_type, 'objects'), + fn (WP_Taxonomy $taxonomy):bool => $taxonomy->show_ui + ); + if ($output == 'names') { + return wp_list_pluck($taxonomies, 'name'); + } else { + return $taxonomies; + } + } + public function init() { - register_setting('options', Plugin::get_id()); + $post_types = $this->get_post_types(); + $taxonomies = $this->get_taxonomies(); - add_settings_section('post_types', Plugin::__('Post Types'), [$this, 'section'], Plugin::get_id()); + register_setting(Plugin::get_id(), Plugin::get_id()); - foreach (get_post_types(output: 'objects') as $post_type) { + add_settings_section('default', Plugin::__('Sortable Objects'), [$this, 'section'], Plugin::get_id()); + + if (!empty($post_types)) { add_settings_field( - Plugin::get_id() . '_post_type_' . $post_type->name, - $post_type->label, - [$this, 'checkbox'], + Plugin::get_id() . '_post_types', + Plugin::__('Post Types'), + [$this, 'field'], Plugin::get_id(), - 'post_types', - [ + args: [ 'name' => 'post_types', - 'value' => $post_type->name, + 'options' => $post_types, ] ); } - add_settings_section('taxonomies', Plugin::__('Taxonomies'), [$this, 'section'], Plugin::get_id()); - - foreach (get_taxonomies(output: 'objects') as $taxonomy) { + if (!empty($taxonomies)) { add_settings_field( - Plugin::get_id() . '_taxonomy_' . $post_type->name, - $post_type->label, - [$this, 'checkbox'], + Plugin::get_id() . '_taxonomies', + Plugin::__('Taxonomies'), + [$this, 'field'], Plugin::get_id(), - 'taxonomies', - [ + args: [ 'name' => 'taxonomies', - 'value' => $taxonomy->name, + 'options' => $taxonomies, ] ); } - add_settings_section('taxonomy_post_types', Plugin::__('Taxonomy Posts'), [$this, 'section'], Plugin::get_id()); - - foreach (get_post_types(output: 'objects') as $post_type) { - foreach (get_object_taxonomies($post_type->name, 'objects') as $taxonomy) { - add_settings_field( - Plugin::get_id() . '_post_type_' . $post_type->name . '_taxonomy_' . $taxonomy->name, - sprintf('%s: %s', $post_type->label, $taxonomy->label), - [$this, 'checkbox'], - Plugin::get_id(), - 'taxonomy_post_types', - [ - 'name' => 'taxonomy_post_types', - 'value' => $post_type->name . '~' . $taxonomy->name, - ] - ); + if (!empty($post_types)) { + foreach ($post_types as $post_type) { + $object_taxonomies = $this->get_object_taxonomies($post_type->name); + if (!empty($object_taxonomies)) { + add_settings_field( + Plugin::get_id() . '_post_type_' . $post_type->name, + sprintf(Plugin::__('%s Taxonomies'), $post_type->labels->singular_name), + [$this, 'field'], + Plugin::get_id(), + args: [ + 'name' => $post_type->name, + 'options' => $object_taxonomies, + ] + ); + } } } } @@ -124,9 +175,6 @@ final class Settings { public function page() { if (!current_user_can(self::CAPABILITY)) return; - // Show update message - if (isset($_GET['settings-updated'])) add_settings_error(Plugin::get_id(), 'updated', Plugin::__('Settings Saved'), 'updated'); - // Show error/update messages settings_errors(Plugin::get_id()); ?> @@ -145,12 +193,18 @@ final class Settings { public function field(array $args):void { extract($args); - printf( - '', - esc_attr($name), - esc_attr($value), - checked($this->is_checked($name, $value), display: false) - ); + + echo implode('
', array_map( + fn (object $option):string => sprintf( + '', + esc_attr(Plugin::get_id()), + esc_attr($name), + esc_attr($option->name), + checked($this->is_checked($name, $option->name), display: false), + esc_html($option->label) + ), + $options + )); } public static function get_url():string {