1: <?php
2:
3: 4: 5:
6: final class Papi_Admin_Menu {
7:
8: 9: 10:
11: public function __construct() {
12: $this->setup_actions();
13: }
14:
15: 16: 17:
18: public function admin_bar_menu() {
19: if ( $page_type = $this->get_page_type() ) {
20: $this->override_labels( $page_type );
21: }
22: }
23:
24: 25: 26: 27: 28:
29: private function get_page_type() {
30: if ( $page_type = papi_get_page_type_by_id( papi_get_page_type_id() ) ) {
31: return $page_type;
32: }
33: }
34:
35: 36: 37: 38: 39:
40: private function override_labels( Papi_Page_Type $page_type ) {
41: global $wp_post_types;
42:
43: $post_type = papi_get_post_type();
44:
45: if ( empty( $post_type ) || ! isset( $wp_post_types[$post_type] ) ) {
46: return;
47: }
48:
49: foreach ( $page_type->get_labels() as $key => $value ) {
50: if ( ! isset( $wp_post_types[$post_type]->labels->$key ) || empty( $value ) ) {
51: continue;
52: }
53:
54: $wp_post_types[$post_type]->labels->$key = $value;
55: }
56: }
57:
58: 59: 60: 61: 62: 63:
64: public function page_items_menu() {
65: $page_types = papi_get_all_page_types( false, null, true );
66:
67: foreach ( $page_types as $page_type ) {
68: if ( empty( $page_type->menu ) || empty( $page_type->name ) ) {
69: continue;
70: }
71:
72: $slug = 'papi/' . $page_type->get_id();
73:
74: add_submenu_page(
75: $page_type->menu,
76: $page_type->name,
77: $page_type->name,
78: $page_type->capability,
79: $slug,
80: [$page_type, 'render']
81: );
82: }
83: }
84:
85: 86: 87:
88: public function post_types_menu() {
89: global $submenu;
90:
91: $post_types = papi_get_post_types();
92:
93: foreach ( $post_types as $post_type ) {
94: if ( ! post_type_exists( $post_type ) ) {
95: continue;
96: }
97:
98: if ( $post_type === 'post' ) {
99: $edit_url = 'edit.php';
100: } else {
101: $edit_url = 'edit.php?post_type=' . $post_type;
102: }
103:
104: if ( ! isset( $submenu[$edit_url] ) || ! isset( $submenu[$edit_url][10] ) || ! isset( $submenu[$edit_url][10][2] ) ) {
105: $post_type_object = get_post_type_object( $post_type );
106: if ( ! $post_type_object->show_in_menu ) {
107: $submenu[$edit_url] = [
108: 10 => [
109: __( 'Add New', 'papi' ),
110: 'edit_posts',
111: 'post-new.php'
112: ]
113: ];
114: } else {
115: continue;
116: }
117: }
118:
119: $only_page_type = papi_filter_settings_only_page_type( $post_type );
120: $page_types = papi_get_all_page_types( false, $post_type );
121: $show_standard = false;
122:
123:
124:
125: if ( empty( $page_types ) ) {
126: continue;
127: }
128:
129:
130: if ( count( $page_types ) === 1 && empty( $only_page_type ) ) {
131: $show_standard = $page_types[0]->standard_type;
132: $show_standard = $show_standard ?
133: papi_filter_settings_show_standard_page_type( $post_type ) :
134: $show_standard;
135:
136: $only_page_type = $show_standard ? '' : $page_types[0]->get_id();
137: }
138:
139: if ( ! empty( $only_page_type ) && ! $show_standard ) {
140: $submenu[$edit_url][10][2] = papi_get_page_new_url(
141: $only_page_type,
142: false,
143: $post_type,
144: [
145: 'action',
146: 'message',
147: 'page_type',
148: 'post',
149: 'post_type'
150: ]
151: );
152: } else {
153: $page = 'papi-add-new-page,' . $post_type;
154: $start = strpos( $edit_url, 'post_type' ) === false ? '?' : '&';
155:
156: $submenu[$edit_url][10][2] = sprintf(
157: '%s%spage=%s',
158: $edit_url,
159: $start,
160: $page
161: );
162:
163:
164: add_menu_page(
165: __( 'Add New', 'papi' ),
166: __( 'Add New', 'papi' ),
167: 'read',
168: $page,
169: [$this, 'render_view']
170: );
171:
172:
173: remove_menu_page( $page );
174: }
175: }
176: }
177:
178: 179: 180:
181: public function render_view() {
182: if ( strpos( papi_get_qs( 'page' ), 'papi' ) !== false ) {
183: $page = str_replace( 'papi-', '', papi_get_qs( 'page' ) );
184: $res = preg_replace( '/\,.*/', '', $page );
185:
186: if ( is_string( $res ) ) {
187: $page_view = $res;
188: }
189: }
190:
191: if ( ! isset( $page_view ) ) {
192: $page_view = null;
193: }
194:
195: if ( ! is_null( $page_view ) ) {
196: $view = new Papi_Admin_View;
197: $view->render( $page_view );
198: } else {
199: echo '<h2>Papi - 404</h2>';
200: }
201: }
202:
203: 204: 205:
206: private function setup_actions() {
207: if ( is_admin() ) {
208: add_action( 'admin_init', [$this, 'admin_bar_menu'] );
209: add_action( 'admin_menu', [$this, 'page_items_menu'] );
210: add_action( 'admin_menu', [$this, 'post_types_menu'] );
211: } else {
212: add_action( 'admin_bar_menu', [$this, 'admin_bar_menu'] );
213: }
214: }
215: }
216:
217: new Papi_Admin_Menu;
218: