PluginProbe
Code Snippets / 3.10.0-beta.1
Code Snippets v3.10.0-beta.1
4.0.0-beta.2 3.10.2 3.10.1 3.10.0 3.10.0-beta.2 3.10.0-beta.1 4.0.0-beta.1 3.9.6 trunk 2.10.0 2.10.1 2.12.0 2.12.1 2.13.0 2.13.1 2.13.2 2.13.3 2.14.0 2.14.1 2.14.2 2.14.3 2.14.4 2.14.5 2.14.6 3.0.0 All 65 releases
code-snippets / php / Admin / Menus / Manage / Manage_Menu.php

Manage_Menu.php in Code Snippets 3.10.0-beta.1, at php/Admin/Menus/Manage/Manage_Menu.php

248 lines 6.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Code_Snippets\Admin\Menus\Manage;
4
5 use Code_Snippets\Admin\Contextual_Help;
6 use Code_Snippets\Admin\Menus\Admin_Menu;
7 use Code_Snippets\Controller\Cloud_Search_Controller;
8 use function Code_Snippets\code_snippets;
9 use function Code_Snippets\Settings\get_setting;
10 use const Code_Snippets\PLUGIN_FILE;
11 use const Code_Snippets\PLUGIN_VERSION;
12
13 /**
14 * Provides the manage snippets admin menu.
15 */
16 class Manage_Menu extends Admin_Menu {
17
18 /**
19 * Default number of snippets shown per page in the manage table.
20 */
21 private const DEFAULT_SNIPPETS_PER_PAGE = 100;
22
23 /**
24 * Manage menu asset service.
25 *
26 * @var Manage_Menu_Assets
27 */
28 private Manage_Menu_Assets $assets;
29
30 /**
31 * Manage menu Screen Options.
32 *
33 * @var Manage_Menu_Screen_Options
34 */
35 private Manage_Menu_Screen_Options $screen_options;
36
37 /**
38 * Class constructor.
39 */
40 public function __construct() {
41 parent::__construct(
42 'manage',
43 _x( 'All Snippets', 'menu label', 'code-snippets' ),
44 __( 'Snippets', 'code-snippets' )
45 );
46
47 if ( code_snippets()->is_compact_menu() ) {
48 add_action( 'admin_menu', array( $this, 'register_compact_menu' ), 2 );
49 add_action( 'network_admin_menu', array( $this, 'register_compact_menu' ), 2 );
50 }
51
52 $this->screen_options = new Manage_Menu_Screen_Options();
53 new Manage_Menu_Bulk_Download();
54
55 add_action( 'admin_menu', array( $this, 'register_upgrade_menu' ), 500 );
56 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_menu_css' ) );
57 add_action( 'wp_ajax_update_code_snippet', array( $this, 'ajax_callback' ) );
58 add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_menu_css' ] );
59 }
60
61 /**
62 * Register the top-level 'Snippets' menu and associated 'Manage' subpage
63 */
64 public function register() {
65 add_menu_page(
66 __( 'Snippets', 'code-snippets' ),
67 _x( 'Snippets', 'top-level menu label', 'code-snippets' ),
68 code_snippets()->get_cap(),
69 code_snippets()->get_menu_slug(),
70 [ $this, 'render' ],
71 'none', // Added through CSS as a mask to prevent loading 'blinking'.
72 apply_filters( 'code_snippets/admin/menu_position', is_network_admin() ? 21 : 67 )
73 );
74
75 parent::register();
76 }
77
78 /**
79 * Render the snippets table interface.
80 *
81 * @return void
82 */
83 public function render() {
84 echo '<div id="manage-snippets-container" class="wrap"></div>';
85 }
86
87 /**
88 * Register the 'upgrade' menu item.
89 *
90 * @return void
91 */
92 public function register_upgrade_menu() {
93 if ( code_snippets()->licensing->is_licensed() || get_setting( 'general', 'hide_upgrade_menu' ) ) {
94 return;
95 }
96
97 $menu_title = sprintf(
98 '<span class="button button-primary code-snippets-upgrade-button">%s %s</span>',
99 _x( 'Go Pro', 'top-level menu label', 'code-snippets' ),
100 '<span class="dashicons dashicons-external" aria-hidden="true"></span>'
101 );
102
103 $hook = add_submenu_page(
104 code_snippets()->get_menu_slug(),
105 __( 'Upgrade to Pro', 'code-snippets' ),
106 $menu_title,
107 code_snippets()->get_cap(),
108 'code_snippets_upgrade',
109 '__return_empty_string',
110 100
111 );
112
113 add_action( "load-$hook", [ $this, 'load_upgrade_menu' ] );
114 }
115
116 /**
117 * Print CSS required for the admin menu icon.
118 *
119 * @return void
120 */
121 public function enqueue_menu_css() {
122 wp_enqueue_style(
123 'code-snippets-menu',
124 plugins_url( 'dist/menu.css', PLUGIN_FILE ),
125 [],
126 PLUGIN_VERSION
127 );
128 }
129
130 /**
131 * Redirect the user upon opening the upgrade menu.
132 *
133 * @return void
134 */
135 public function load_upgrade_menu() {
136 wp_safe_redirect( 'https://snipco.de/JE2f' );
137 exit;
138 }
139
140 /**
141 * Retrieve every hookname registered by this menu, including the compact
142 * Tools submenu hookname when compact mode is active.
143 *
144 * @return string[]
145 */
146 public function get_hooknames(): array {
147 $hooknames = parent::get_hooknames();
148
149 if ( code_snippets()->is_compact_menu() ) {
150 $hooknames[] = get_plugin_page_hookname( $this->base_slug, 'tools.php' );
151 }
152
153 return $hooknames;
154 }
155
156 /**
157 * Add menu pages for the compact menu
158 */
159 public function register_compact_menu() {
160 if ( ! code_snippets()->is_compact_menu() ) {
161 return;
162 }
163
164 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Value is matched to known classes.
165 $sub = code_snippets()->get_menu_slug( isset( $_GET['sub'] ) ? sanitize_key( $_GET['sub'] ) : 'snippets' );
166 $classmap = [
167 'snippets' => 'manage',
168 'add-snippet' => 'edit',
169 'edit-snippet' => 'edit',
170 'import-code-snippets' => 'import',
171 'snippets-settings' => 'settings',
172 ];
173 $menus = code_snippets()->admin->menus;
174 $class = isset( $classmap[ $sub ], $menus[ $classmap[ $sub ] ] ) ? $menus[ $classmap[ $sub ] ] : $this;
175
176 $hook = add_submenu_page(
177 'tools.php',
178 __( 'Snippets', 'code-snippets' ),
179 _x( 'Snippets', 'tools submenu label', 'code-snippets' ),
180 code_snippets()->get_cap(),
181 code_snippets()->get_menu_slug(),
182 [ $class, 'render' ]
183 );
184
185 add_action( 'load-' . $hook, [ $class, 'load' ] );
186 }
187
188 /**
189 * Executed when the admin page is loaded.
190 */
191 public function load() {
192 parent::load();
193
194 $this->screen_options->load();
195
196 $contextual_help = new Contextual_Help( 'edit' );
197 $contextual_help->load();
198 }
199
200 /**
201 * Enqueue scripts and stylesheets for the admin page.
202 */
203 public function enqueue_assets() {
204 $assets = new Manage_Menu_Assets( $this->screen_options );
205 $assets->enqueue( self::$script_deps, self::$style_deps );
206 }
207
208 /**
209 * Get the number of snippets to show per page in the cloud search.
210 *
211 * The value defaults to the user's local snippets-per-page preference but can
212 * be overridden independently via the `code_snippets/cloud_search/per_page` filter.
213 * The result is clamped to the REST API's per_page maximum of 100.
214 *
215 * @return int
216 */
217 public static function get_cloud_search_per_page(): int {
218 $per_page = intval( apply_filters( 'code_snippets/cloud_search/per_page', self::get_snippets_per_page() ) );
219 return min( Cloud_Search_Controller::MAX_RESULTS_PER_PAGE, max( 1, $per_page ) );
220 }
221
222 /**
223 * Get the default number of snippets to show per page.
224 *
225 * @return int
226 */
227 public static function get_default_snippets_per_page(): int {
228 $default = apply_filters( 'code_snippets/snippets_per_page_default', self::DEFAULT_SNIPPETS_PER_PAGE );
229 return max( 1, intval( $default ) );
230 }
231
232 /**
233 * Get the number of snippets to show per page.
234 *
235 * @return int
236 */
237 public static function get_snippets_per_page(): int {
238 $per_page = intval( get_user_option( 'snippets_per_page' ) );
239
240 return intval(
241 apply_filters(
242 'snippets_per_page',
243 $per_page > 0 ? $per_page : self::get_default_snippets_per_page()
244 )
245 );
246 }
247 }
248