PostSettings.php
5.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
<?php
namespace AIOSEO\Plugin\Common\Admin;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use AIOSEO\Plugin\Common\Models;
/**
* Abstract class that Pro and Lite both extend.
*
* @since 4.0.0
*/
class PostSettings {
/**
* Initialize the admin.
*
* @since 4.0.0
*
* @return void
*/
public function __construct() {
if ( is_admin() ) {
// Load Vue APP.
add_action( 'admin_enqueue_scripts', [ $this, 'enqueuePostSettingsAssets' ] );
// Add metabox.
add_action( 'add_meta_boxes', [ $this, 'addPostSettingsMetabox' ] );
// Add metabox to terms on init hook.
add_action( 'init', [ $this, 'init' ], 1000 );
// Save metabox.
add_action( 'save_post', [ $this, 'saveSettingsMetabox' ] );
add_action( 'edit_attachment', [ $this, 'saveSettingsMetabox' ] );
add_action( 'add_attachment', [ $this, 'saveSettingsMetabox' ] );
}
}
/**
* Enqueues the JS/CSS for the on page/posts settings.
*
* @since 4.0.0
*
* @return void
*/
public function enqueuePostSettingsAssets() {
if (
aioseo()->helpers->isScreenBase( 'event-espresso' ) ||
aioseo()->helpers->isScreenBase( 'post' ) ||
aioseo()->helpers->isScreenBase( 'term' ) ||
aioseo()->helpers->isScreenBase( 'edit-tags' )
) {
$page = null;
if (
aioseo()->helpers->isScreenBase( 'event-espresso' ) ||
aioseo()->helpers->isScreenBase( 'post' )
) {
$page = 'post';
}
aioseo()->helpers->enqueueScript(
'aioseo-post-settings-metabox',
'js/post-settings.js'
);
wp_localize_script(
'aioseo-post-settings-metabox',
'aioseo',
aioseo()->helpers->getVueData( $page )
);
if ( 'post' === $page ) {
$this->enqueuePublishPanelAssets();
}
$rtl = is_rtl() ? '.rtl' : '';
aioseo()->helpers->enqueueStyle(
'aioseo-post-settings-metabox',
"css/post-settings$rtl.css"
);
}
$screen = get_current_screen();
if ( 'attachment' === $screen->id ) {
wp_enqueue_media();
}
}
/**
* Enqueues the JS/CSS for the Block Editor integrations.
*
* @since 4.1.4
*
* @return void
*/
private function enqueuePublishPanelAssets() {
aioseo()->helpers->enqueueScript(
'aioseo-publish-panel',
'js/publish-panel.js'
);
$rtl = is_rtl() ? '.rtl' : '';
aioseo()->helpers->enqueueStyle(
'aioseo-publish-panel',
"css/publish-panel$rtl.css"
);
}
/**
* Adds a meta box to page/posts screens.
*
* @since 4.0.0
*
* @return void
*/
public function addPostSettingsMetabox() {
$dynamicOptions = aioseo()->dynamicOptions->noConflict();
$screen = get_current_screen();
$postType = $screen->post_type;
$pageAnalysisSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_analysis' );
$generalSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_general_settings' );
$socialSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_social_settings' );
$schemaSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_schema_settings' );
$linkAssistantCapability = aioseo()->access->hasCapability( 'aioseo_page_link_assistant_settings' );
$advancedSettingsCapability = aioseo()->access->hasCapability( 'aioseo_page_advanced_settings' );
if (
$dynamicOptions->searchAppearance->postTypes->has( $postType ) &&
$dynamicOptions->searchAppearance->postTypes->$postType->advanced->showMetaBox &&
! (
empty( $pageAnalysisSettingsCapability ) &&
empty( $generalSettingsCapability ) &&
empty( $socialSettingsCapability ) &&
empty( $schemaSettingsCapability ) &&
empty( $linkAssistantCapability ) &&
empty( $advancedSettingsCapability )
)
) {
// Translators: 1 - The plugin short name ("AIOSEO").
$aioseoMetaboxTitle = sprintf( esc_html__( '%1$s Settings', 'all-in-one-seo-pack' ), AIOSEO_PLUGIN_SHORT_NAME );
add_meta_box(
'aioseo-settings',
$aioseoMetaboxTitle,
[ $this, 'postSettingsMetabox' ],
[ $postType ],
'normal',
apply_filters( 'aioseo_post_metabox_priority', 'high' )
);
}
}
/**
* Render the on page/posts settings metabox with Vue App wrapper.
*
* @since 4.0.0
*
* @param WP_Post $post The current post.
* @return void
*/
public function postSettingsMetabox() {
$this->postSettingsHiddenField();
?>
<div id="aioseo-post-settings-metabox">
<?php aioseo()->templates->getTemplate( 'parts/loader.php' ); ?>
</div>
<?php
}
/**
* Adds the hidden field where all the metabox data goes.
*
* @since 4.0.17
*
* @return void
*/
public function postSettingsHiddenField() {
if ( isset( $this->postSettingsHiddenFieldExists ) ) {
return;
}
$this->postSettingsHiddenFieldExists = true;
?>
<div id="aioseo-post-settings-field">
<input type="hidden" name="aioseo-post-settings" id="aioseo-post-settings" value=""/>
<?php wp_nonce_field( 'aioseoPostSettingsNonce', 'PostSettingsNonce' ); ?>
</div>
<?php
}
/**
* Handles metabox saving.
*
* @since 4.0.3
*
* @param int $postId Post ID.
* @return void
*/
public function saveSettingsMetabox( $postId ) {
// Ignore auto saving
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
// Security check
if ( ! isset( $_POST['PostSettingsNonce'] ) || ! wp_verify_nonce( $_POST['PostSettingsNonce'], 'aioseoPostSettingsNonce' ) ) {
return;
}
// If we don't have our post settings input, we can safely skip.
if ( ! isset( $_POST['aioseo-post-settings'] ) ) {
return;
}
// Check user permissions
if ( ! current_user_can( 'edit_post', $postId ) ) {
return;
}
$currentPost = json_decode( stripslashes( $_POST['aioseo-post-settings'] ), true ); // phpcs:ignore HM.Security.ValidatedSanitizedInput
// If there is no data, there likely was an error, e.g. if the hidden field wasn't populated on load and the user saved the post without making changes in the metabox.
// In that case we should return to prevent a complete reset of the data.
if ( empty( $currentPost ) ) {
return;
}
Models\Post::savePost( $postId, $currentPost );
}
}