1: <?php
2:
3: /**
4: * Core class that implements a Papi type.
5: */
6: class Papi_Core_Type {
7:
8: /**
9: * The core meta method that can be used
10: * instead of `$_meta_method`. If `$_meta_method` is
11: * used the `$_core_meta_method` will not be used.
12: *
13: * @var string
14: */
15: private $_core_meta_method = 'meta';
16:
17: /**
18: * The meta method to call.
19: *
20: * @deprecated This will be removed in feature version
21: * and should not be used with new types.
22: *
23: * @var string
24: */
25: public $_meta_method = 'meta';
26:
27: /**
28: * The page type class name.
29: *
30: * @var string
31: */
32: private $_class_name = '';
33:
34: /**
35: * The file name of the page type file.
36: *
37: * @var string
38: */
39: private $_file_name = '';
40:
41: /**
42: * The file path of the page type file.
43: *
44: * @var string
45: */
46: private $_file_path = '';
47:
48: /**
49: * The page type identifier.
50: *
51: * @var string
52: */
53: public $id = '';
54:
55: /**
56: * The constructor.
57: *
58: * Load a page type by the file.
59: *
60: * @param string $file_path
61: */
62: public function __construct( $file_path ) {
63: // Try to load the file if the file path is empty.
64: if ( empty( $file_path ) ) {
65: $page_type = papi_get_page_type_id();
66: $file_path = papi_get_file_path( $page_type );
67: }
68:
69: if ( is_file( $file_path ) ) {
70: $this->setup_file( $file_path );
71: $this->setup_meta_data();
72: }
73: }
74:
75: /**
76: * Boot page type.
77: *
78: * @codeCoverageIgnore
79: */
80: public function boot() {
81: $this->setup_actions();
82: $this->setup_filters();
83: }
84:
85: /**
86: * Get the page type class name with namespace if exists.
87: *
88: * @return string
89: */
90: public function get_class_name() {
91: return $this->_class_name;
92: }
93:
94: /**
95: * Get the page type file pat.h
96: *
97: * @return string
98: */
99: public function get_file_path() {
100: return $this->_file_path;
101: }
102:
103: /**
104: * Get the page type identifier.
105: *
106: * @return string
107: */
108: public function get_id() {
109: if ( ! empty( $this->id ) ) {
110: return $this->id;
111: }
112:
113: return $this->_file_name;
114: }
115:
116: /**
117: * Check if the the given identifier match the page type identifier.
118: *
119: * @param string $id
120: *
121: * @return bool
122: */
123: public function match_id( $id ) {
124: if ( strpos( $id, 'papi/' ) === 0 ) {
125: $id = preg_replace( '/^papi\//', '', $id );
126: }
127:
128: return $this->get_id() === $id;
129: }
130:
131: /**
132: * Create a new instance of the page type file.
133: *
134: * @return object
135: */
136: public function new_class() {
137: if ( empty( $this->_file_path ) ) {
138: return;
139: }
140:
141: return new $this->_class_name;
142: }
143:
144: /**
145: * Setup actions.
146: *
147: * @codeCoverageIgnore
148: */
149: protected function setup_actions() {
150: }
151:
152: /**
153: * Load the file and setup file path, file name and class name properties.
154: *
155: * @param string $file_path
156: */
157: private function setup_file( $file_path ) {
158: $this->_file_path = $file_path;
159: $this->_file_name = papi_get_page_type_base_path( $this->_file_path );
160: $this->_class_name = papi_get_class_name( $this->_file_path );
161: }
162:
163: /**
164: * Setup filters.
165: *
166: * @codeCoverageIgnore
167: */
168: protected function setup_filters() {
169: }
170:
171: /**
172: * Setup page type meta data.
173: */
174: private function setup_meta_data() {
175: $meta_method = method_exists( $this->_class_name, $this->_meta_method ) ?
176: $this->_meta_method : $this->_core_meta_method;
177:
178: if ( ! method_exists( $this->_class_name, $meta_method ) ) {
179: return;
180: }
181:
182: foreach ( call_user_func( [$this, $meta_method] ) as $key => $value ) {
183: if ( substr( $key, 0, 1 ) === '_' ) {
184: continue;
185: }
186:
187: $this->$key = papi_esc_html( $value );
188: }
189: }
190: }
191: