PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.9-a.1
Jetpack – WP Security, Backup, Speed, & Growth v15.9-a.1
15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / json-endpoints / class.wpcom-json-api-list-dropdown-pages-endpoint.php
jetpack / json-endpoints Last commit date
jetpack 4 weeks ago class.wpcom-json-api-add-widget-endpoint.php 6 months ago class.wpcom-json-api-autosave-post-v1-1-endpoint.php 6 months ago class.wpcom-json-api-bulk-delete-post-endpoint.php 6 months ago class.wpcom-json-api-bulk-restore-post-endpoint.php 6 months ago class.wpcom-json-api-bulk-update-comments-endpoint.php 6 months ago class.wpcom-json-api-comment-endpoint.php 6 months ago class.wpcom-json-api-delete-media-endpoint.php 6 months ago class.wpcom-json-api-delete-media-v1-1-endpoint.php 6 months ago class.wpcom-json-api-edit-media-v1-2-endpoint.php 6 months ago class.wpcom-json-api-get-autosave-v1-1-endpoint.php 6 months ago class.wpcom-json-api-get-comment-counts-endpoint.php 6 months ago class.wpcom-json-api-get-comment-endpoint.php 6 months ago class.wpcom-json-api-get-comment-history-endpoint.php 6 months ago class.wpcom-json-api-get-comments-tree-endpoint.php 6 months ago class.wpcom-json-api-get-comments-tree-v1-1-endpoint.php 6 months ago class.wpcom-json-api-get-comments-tree-v1-2-endpoint.php 6 months ago class.wpcom-json-api-get-customcss.php 6 months ago class.wpcom-json-api-get-media-endpoint.php 6 months ago class.wpcom-json-api-get-media-v1-1-endpoint.php 6 months ago class.wpcom-json-api-get-media-v1-2-endpoint.php 6 months ago class.wpcom-json-api-get-post-counts-v1-1-endpoint.php 6 months ago class.wpcom-json-api-get-post-endpoint.php 6 months ago class.wpcom-json-api-get-post-v1-1-endpoint.php 6 months ago class.wpcom-json-api-get-site-endpoint.php 4 weeks ago class.wpcom-json-api-get-site-v1-2-endpoint.php 3 months ago class.wpcom-json-api-get-taxonomies-endpoint.php 1 month ago class.wpcom-json-api-get-taxonomy-endpoint.php 6 months ago class.wpcom-json-api-get-term-endpoint.php 6 months ago class.wpcom-json-api-list-comments-endpoint.php 6 months ago class.wpcom-json-api-list-dropdown-pages-endpoint.php 6 months ago class.wpcom-json-api-list-embeds-endpoint.php 6 months ago class.wpcom-json-api-list-media-endpoint.php 6 months ago class.wpcom-json-api-list-media-v1-1-endpoint.php 6 months ago class.wpcom-json-api-list-media-v1-2-endpoint.php 6 months ago class.wpcom-json-api-list-post-type-taxonomies-endpoint.php 6 months ago class.wpcom-json-api-list-post-types-endpoint.php 6 months ago class.wpcom-json-api-list-posts-endpoint.php 6 months ago class.wpcom-json-api-list-posts-v1-1-endpoint.php 6 months ago class.wpcom-json-api-list-posts-v1-2-endpoint.php 6 months ago class.wpcom-json-api-list-roles-endpoint.php 6 months ago class.wpcom-json-api-list-shortcodes-endpoint.php 6 months ago class.wpcom-json-api-list-terms-endpoint.php 6 months ago class.wpcom-json-api-list-users-endpoint.php 6 months ago class.wpcom-json-api-menus-v1-1-endpoint.php 6 months ago class.wpcom-json-api-post-endpoint.php 6 months ago class.wpcom-json-api-post-v1-1-endpoint.php 1 month ago class.wpcom-json-api-render-embed-endpoint.php 6 months ago class.wpcom-json-api-render-embed-reversal-endpoint.php 6 months ago class.wpcom-json-api-render-endpoint.php 4 months ago class.wpcom-json-api-render-shortcode-endpoint.php 6 months ago class.wpcom-json-api-sharing-buttons-endpoint.php 6 months ago class.wpcom-json-api-site-settings-endpoint.php 2 months ago class.wpcom-json-api-site-settings-v1-2-endpoint.php 6 months ago class.wpcom-json-api-site-settings-v1-3-endpoint.php 6 months ago class.wpcom-json-api-site-settings-v1-4-endpoint.php 2 months ago class.wpcom-json-api-site-user-endpoint.php 6 months ago class.wpcom-json-api-taxonomy-endpoint.php 6 months ago class.wpcom-json-api-update-comment-endpoint.php 4 months ago class.wpcom-json-api-update-customcss.php 6 months ago class.wpcom-json-api-update-media-endpoint.php 6 months ago class.wpcom-json-api-update-media-v1-1-endpoint.php 6 months ago class.wpcom-json-api-update-post-endpoint.php 6 months ago class.wpcom-json-api-update-post-v1-1-endpoint.php 6 months ago class.wpcom-json-api-update-post-v1-2-endpoint.php 6 months ago class.wpcom-json-api-update-site-homepage-endpoint.php 6 months ago class.wpcom-json-api-update-site-logo-endpoint.php 6 months ago class.wpcom-json-api-update-taxonomy-endpoint.php 5 months ago class.wpcom-json-api-update-term-endpoint.php 6 months ago class.wpcom-json-api-update-user-endpoint.php 6 months ago class.wpcom-json-api-upload-media-endpoint.php 6 months ago class.wpcom-json-api-upload-media-v1-1-endpoint.php 6 months ago
class.wpcom-json-api-list-dropdown-pages-endpoint.php
226 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 if ( ! defined( 'ABSPATH' ) ) {
4 exit( 0 );
5 }
6
7 /**
8 * List dropdown pages endpoint.
9 */
10 new WPCOM_JSON_API_List_Dropdown_Pages_Endpoint(
11 array(
12
13 'description' => 'Get a list of pages to be displayed as options in a select-a-page-dropdown.',
14 'min_version' => '1.1',
15 'max_version' => '1.1',
16
17 'group' => 'posts',
18 'stat' => 'posts:dropdown-pages',
19
20 'method' => 'GET',
21 'path' => '/sites/%s/dropdown-pages/',
22 'path_labels' => array(
23 '$site' => '(int|string) Site ID or domain',
24 ),
25
26 'allow_fallback_to_jetpack_blog_token' => true,
27
28 'example_request' => 'https://public-api.wordpress.com/rest/v1.1/sites/en.blog.wordpress.com/dropdown-pages/',
29 )
30 );
31
32 /**
33 * Endpoint class responsible for listing pages to be displayed as options in a select-a-page-dropdown.
34 *
35 * /sites/%s/dropdown-pages/ -> $blog_id
36 *
37 * @phan-constructor-used-for-side-effects
38 */
39 class WPCOM_JSON_API_List_Dropdown_Pages_Endpoint extends WPCOM_JSON_API_Endpoint {
40
41 /**
42 * Page object format.
43 *
44 * @var array
45 */
46 public $dropdown_page_object_format = array(
47 'ID' => '(int) The page ID.',
48 'title' => '(string) The page title.',
49 'children' => '(array:dropdown_page) An array of child pages.',
50 );
51
52 /**
53 * The response format.
54 *
55 * @var array
56 */
57 public $response_format = array(
58 'found' => '(int) The number of pages found.',
59 'dropdown_pages' => '(array:dropdown_page) An array of dropdown_page objects.',
60 );
61
62 /**
63 * List of pages indexed by their page ID.
64 *
65 * @var array<int,WP_Post>
66 */
67 private $pages_by_id = array();
68
69 /**
70 * List of pages indexed by their parent page ID.
71 *
72 * @var array<int,WP_Post>
73 */
74 private $pages_by_parent = array();
75
76 /**
77 * API callback.
78 *
79 * @param string $path - the path.
80 * @param int $blog_id - the blog ID.
81 * @return stdClass[] $pages - An array of page objects. Each page object includes ID and title properties and may include children property. This makes each page object a tree-like data structure.
82 */
83 public function callback( $path = '', $blog_id = 0 ) {
84 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
85 if ( is_wp_error( $blog_id ) ) {
86 return $blog_id;
87 }
88
89 $pages = get_pages();
90
91 if ( empty( $pages ) ) {
92 return array(
93 'found' => 0,
94 'dropdown_pages' => array(),
95 );
96 }
97
98 $this->pages_by_id = self::to_pages_by_id( $pages );
99 $this->pages_by_parent = self::to_pages_by_parent( $pages );
100 $dropdown_pages = $this->create_dropdown_pages();
101 return array(
102 'found' => count( $dropdown_pages ),
103 'dropdown_pages' => $dropdown_pages,
104 );
105 }
106
107 /**
108 * Convert a list of pages to a list of pages by page ID.
109 *
110 * @param array<WP_Post> $pages - array of pages.
111 * @return array<int,WP_Post> $pages_by_page_id - indexed array of pages by page ID where index is page ID.
112 */
113 private static function to_pages_by_id( $pages ) {
114 $pages_by_page_id = array();
115 foreach ( $pages as $page ) {
116 if ( isset( $page->ID ) ) {
117 $pages_by_page_id[ $page->ID ] = $page;
118 }
119 }
120 return $pages_by_page_id;
121 }
122
123 /**
124 * Convert a list of pages to a list of pages by parent.
125 *
126 * @param array<WP_Post> $pages - array of pages.
127 * @return array<int,WP_Post> $pages_by_parent - indexed array of pages by parent where index is page ID.
128 */
129 private static function to_pages_by_parent( $pages ) {
130 $pages_by_parent = array();
131 foreach ( $pages as $page ) {
132 if ( empty( $page->post_parent ) ) {
133 $pages_by_parent['root'][] = $page;
134 } else {
135 $pages_by_parent[ $page->post_parent ][] = $page;
136 }
137 }
138 return $pages_by_parent;
139 }
140
141 /**
142 * Convert a list of pages to a list of dropdown pages.
143 *
144 * @return array<stdClass> $dropdown_pages - array of dropdown pages.
145 */
146 private function create_dropdown_pages() {
147 $dropdown_pages = array();
148
149 if ( ! empty( $this->pages_by_parent['root'] ) ) {
150 foreach ( $this->pages_by_parent['root'] as $root_page ) {
151 $dropdown_pages[] = $this->to_dropdown_page( $root_page );
152 }
153 }
154
155 if ( ! empty( $this->pages_by_id ) ) {
156 // In case there were some orphans
157 // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
158 foreach ( $this->pages_by_id as $_page_id => $page ) {
159 $dropdown_pages[] = $this->to_dropdown_page( $page );
160 }
161 }
162
163 return $dropdown_pages;
164 }
165
166 /**
167 * Convert a page to a dropdown page.
168 *
169 * @param WP_Post $page - the page.
170 * @return stdClass|false $dropdown_page - the dropdown page.
171 */
172 private function to_dropdown_page( $page ) {
173 if ( ! isset( $page->ID ) ) {
174 return false;
175 }
176
177 $title = $this->get_page_title( $page );
178
179 if ( ! isset( $this->pages_by_parent[ $page->ID ] ) ) {
180 unset( $this->pages_by_id[ $page->ID ] );
181 return (object) array(
182 'ID' => $page->ID,
183 'title' => $title,
184 );
185 }
186
187 $children = array();
188 foreach ( $this->pages_by_parent[ $page->ID ] as $child_page ) {
189 $children[] = $this->to_dropdown_page( $child_page );
190 }
191
192 unset( $this->pages_by_id[ $page->ID ] );
193 unset( $this->pages_by_parent[ $page->ID ] );
194 return (object) array(
195 'ID' => $page->ID,
196 'title' => $title,
197 'children' => $children,
198 );
199 }
200
201 /**
202 * Get the page title.
203 *
204 * @param WP_Post $page - the page.
205 * @return string $page_title - the page title.
206 */
207 private function get_page_title( $page ) {
208 $title = $page->post_title;
209 if ( '' === $title ) {
210 /* translators: %d: ID of a post. */
211 $title = sprintf( __( '#%d (no title)', 'jetpack' ), $page->ID );
212 }
213
214 /**
215 * Filters the page title when creating an HTML drop-down list of pages.
216 *
217 * @since 3.1.0
218 *
219 * @param string $title Page title.
220 * @param WP_Post $page Page data object.
221 */
222 $title = apply_filters( 'list_pages', $title, $page );
223 return $title;
224 }
225 }
226