SEO SIMPLE PACK - Version 1.0

Version Description

Initial working version.

Download this release

Release Info

Developer looswebstudio
Plugin Icon 128x128 SEO SIMPLE PACK
Version 1.0
Comparing to
See all releases

Version 1.0

assets/css/ssp.css ADDED
@@ -0,0 +1,306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "UTF-8";
2
+ #ssp_wrap{
3
+ box-sizing: border-box;
4
+ /* background: #fff; */
5
+ padding: 8px;
6
+ margin: 0 20px 20px 0;
7
+ }
8
+ #ssp_wrap * {
9
+ box-sizing: border-box;
10
+ }
11
+
12
+ #ssp_wrap #ssp_updated{
13
+ margin: 24px 0 24px;
14
+ }
15
+ /*
16
+ フォームパーツ
17
+ */
18
+ #ssp_wrap input[type="text"]{
19
+ width: 100%;
20
+ padding: 8px;
21
+ }
22
+ #ssp_wrap textarea{
23
+ width: 90%;
24
+ height: 12em;
25
+ }
26
+ #ssp_wrap select{
27
+ min-width: 15em;
28
+ }
29
+ #ssp_wrap input.sep_radio{
30
+ display: none;
31
+ }
32
+ #ssp_wrap label.sep_radio{
33
+ text-align: center;
34
+ width: 40px;
35
+ height: 40px;
36
+ line-height: 34px;
37
+ vertical-align: middle;
38
+ padding: 0;
39
+ margin: 4px;
40
+ background: #fcfcfc;
41
+ border: solid 1px #ccc;
42
+ box-shadow: inset 0 0 2px #fff;
43
+ }
44
+ #ssp_wrap .sep_radio:checked + label.sep_radio{
45
+
46
+ border: solid 2px rgb(235, 161, 112);
47
+ }
48
+ #ssp_wrap .sep .ssp_item{
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ }
52
+
53
+ #ssp_wrap .hide{
54
+ display: none;
55
+ }
56
+
57
+ #ssp_wrap.ssp_metabox > label{
58
+ display: block;
59
+ padding: 0 0 8px;
60
+ font-weight: bold;
61
+ }
62
+ #ssp_wrap.ssp_metabox .ssp_meta_inner{
63
+ margin: 8px 0 40px;
64
+ padding-left: 24px;
65
+ }
66
+
67
+
68
+ /*
69
+ table
70
+ */
71
+
72
+ #ssp_wrap table.form-table th,
73
+ #ssp_wrap table.form-table td{
74
+ display: block;
75
+ width: 100%;
76
+ }
77
+ #ssp_wrap table.form-table td{
78
+ padding-left: 40px;
79
+ margin-bottom: 24px;
80
+ }
81
+
82
+ /*
83
+ ssp_item
84
+ */
85
+ #ssp_wrap h2.hndle{
86
+ cursor: unset;
87
+ }
88
+ #ssp_wrap code {
89
+ padding: 1px 4px 2px;
90
+ }
91
+
92
+ .ssp_help{
93
+ margin-left: 16px;
94
+ border-radius: 50%;
95
+ padding: 0px;
96
+ width: 24px;
97
+ height: 24px;
98
+ line-height: 24px;
99
+ text-decoration: none;
100
+ background: rgb(100, 100, 100);
101
+ color: #fff;
102
+ display: inline-block;
103
+ vertical-align: middle;
104
+ text-align: center;
105
+ box-shadow: inset 0 0 4px rgba(204, 204, 204, 0.6);
106
+ font-size: 12px;
107
+ }
108
+ #ssp_wrap td .inner{
109
+ display: flex;
110
+ flex-wrap: wrap;
111
+ justify-content: space-between;
112
+ }
113
+
114
+ .ssp_item{
115
+ width: 40%;
116
+ }
117
+ .textarea .ssp_item{
118
+ width: 100%;
119
+ }
120
+ .ssp_desc{
121
+ color: #666;
122
+ font-size: 13px;
123
+ font-style: italic;
124
+ width: 56%;
125
+ }
126
+ .ssp_help_table{
127
+ background: #fff;
128
+ margin: 16px;
129
+ }
130
+ .ssp_help_table thead{
131
+ background: #e3e4e3;
132
+ }
133
+ .ssp_help_table td,
134
+ .ssp_help_table th{
135
+ padding: 4px 8px;
136
+ }
137
+
138
+ #ssp_wrap #media_preview img{
139
+ max-width: 400px;
140
+ }
141
+ #ssp_wrap #media_btn {
142
+ margin-right: 24px;
143
+ }
144
+
145
+ /*
146
+ disable
147
+ */
148
+ tr[data-disable="1"] {
149
+ /* background: #000; */
150
+ }
151
+ tr[data-disable="1"] + tr,
152
+ tr[data-disable="1"] + tr + tr,
153
+ tr[data-disable="1"] + tr + tr + tr{
154
+ display: none;
155
+ }
156
+
157
+
158
+
159
+ @media screen and (max-width: 767px) {
160
+ .ssp_desc{
161
+ width: 100%;
162
+ }
163
+ .ssp_item{
164
+ width: 100%;
165
+ }
166
+ }
167
+
168
+ .ssp_prev{
169
+ padding: 4px;
170
+ width: 100%;
171
+ }
172
+ .ssp_prev p {
173
+ display: inline-block;
174
+ background: #ececec;
175
+ padding: 8px 12px;
176
+ box-shadow: inset 0 0 4px #ccc;
177
+ }
178
+ .ssp_prev span{
179
+ color: #fff;
180
+ padding: 4px 8px;
181
+ margin: 0 2px;
182
+ font-size: 13px;
183
+ border-radius: 4px;
184
+ /* box-shadow: 0 0 0 1px #ccc; */
185
+ background: rgb(135, 171, 135);
186
+ }
187
+
188
+
189
+ /*
190
+ devエリア
191
+ */
192
+ .dev_area{
193
+ padding: 8px;
194
+ margin: 16px;
195
+ background: #fff;
196
+ box-shadow: inset 0 0 4px #ccc;
197
+ overflow: auto;
198
+ max-height: 400px;
199
+ position: relative;
200
+ }
201
+
202
+ .dev_area p{
203
+ margin: -8px -8px 0;
204
+ background: #e6e6de;
205
+ font-size: 12px;
206
+ padding: 0 8px;
207
+ }
208
+ .dev_area pre{
209
+ font-size: 12px;
210
+ margin: 0;
211
+ }
212
+ .dev_area font{
213
+ color: rgb(201, 128, 110);
214
+ }
215
+ .dev_area pre small:nth-of-type(1) {
216
+ background: #e6e6de;
217
+ position: absolute;
218
+ top: 0;
219
+ right: 0;
220
+ padding: 4px;
221
+ }
222
+ .dev_area pre small{
223
+ font-size: 12px;
224
+ }
225
+ .dev_area pre i{
226
+ font-size: 12px;
227
+ color: #9973b9;
228
+ font-style: normal;
229
+ }
230
+
231
+
232
+ /*
233
+ タブコンテンツ
234
+ */
235
+
236
+ .nav-tab{
237
+ cursor: pointer;
238
+ }
239
+ .nav-tab.act_{
240
+ border-bottom: 1px solid #f1f1f1;
241
+ background: #f1f1f1;
242
+ color: #000;
243
+ }
244
+
245
+ .tab-contents{
246
+ display: none;
247
+ }
248
+ .tab-contents.act_{
249
+ display: block;
250
+ }
251
+
252
+
253
+
254
+ /* The switch - the box around the slider */
255
+ .switch_box {
256
+ position: relative;
257
+ display: inline-block;
258
+ width: 64px;
259
+ height: 28px;
260
+ margin: 0 8px;
261
+ }
262
+
263
+ /* Hide default HTML checkbox */
264
+ .switch_box input {display:none;}
265
+
266
+ /* The slider */
267
+ .slider {
268
+ position: absolute;
269
+ cursor: pointer;
270
+ top: 0;
271
+ left: 0;
272
+ right: 0;
273
+ bottom: 0;
274
+ background-color: #ccc;
275
+ -webkit-transition: .4s;
276
+ transition: .4s;
277
+ }
278
+
279
+ .slider:before {
280
+ position: absolute;
281
+ content: "";
282
+ height: 20px;
283
+ width: 20px;
284
+ right: 4px;
285
+ bottom: 4px;
286
+ background-color: white;
287
+ -webkit-transition: .4s;
288
+ transition: .4s;
289
+ }
290
+
291
+ input:checked + .slider {
292
+ background-color: #2196F3;
293
+ }
294
+
295
+ input:checked + .slider:before {
296
+ right: 40px;
297
+ }
298
+
299
+ /* Rounded sliders */
300
+ .slider.round {
301
+ border-radius: 34px;
302
+ }
303
+
304
+ .slider.round:before {
305
+ border-radius: 50%;
306
+ }
assets/img/noimg.gif ADDED
Binary file
assets/js/ssp.js ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * scripts
3
+ */
4
+ addEventListener('DOMContentLoaded', function () {
5
+
6
+ let tabN = document.querySelectorAll('.nav-tab');
7
+ let tabC = document.querySelectorAll('.tab-contents');
8
+
9
+ if ( location.hash ) {
10
+ document.querySelector('.nav-tab.act_').classList.remove('act_');
11
+ document.querySelector('.tab-contents.act_').classList.remove('act_');
12
+ document.querySelector(location.hash).classList.add('act_');
13
+ document.querySelector('[href="'+ location.hash +'"]').classList.add('act_');
14
+ }
15
+
16
+ for ( let i = 0; i < tabN.length; i++ ) {
17
+
18
+ tabN[i].addEventListener('click', function (e) {
19
+ e.preventDefault();
20
+ location.hash = $(this).attr('href');
21
+
22
+ if ( !tabN[i].classList.contains('act_') ) {
23
+ document.querySelector('.nav-tab.act_').classList.remove('act_');
24
+ tabN[i].classList.add('act_');
25
+
26
+ document.querySelector('.tab-contents.act_').classList.remove('act_');
27
+ tabC[i].classList.add('act_');
28
+ }
29
+ });
30
+
31
+ }
32
+ });
33
+
34
+ /**
35
+ * メディアアップローダー
36
+ */
37
+ (function ($) {
38
+
39
+ var my_uploader;
40
+
41
+ $("#media_btn").click(function (e) {
42
+
43
+ e.preventDefault();
44
+
45
+ if (my_uploader) {
46
+ my_uploader.open();
47
+ return;
48
+ }
49
+
50
+ //アップローダーの基本設定
51
+ my_uploader = wp.media({
52
+
53
+ title: "画像を選択",
54
+
55
+ // ライブラリの一覧は画像のみにする
56
+ library: {
57
+ type: "image"
58
+ },
59
+
60
+ //画像選択ボタンのテキスト
61
+ button: {
62
+ text: "画像を決定する"
63
+ },
64
+
65
+ // 選択できる画像は1つだけにする
66
+ multiple: false
67
+
68
+ });
69
+
70
+ //画像が選択された時の処理
71
+ my_uploader.on("select", function () {
72
+
73
+ var images = my_uploader.state().get("selection");
74
+
75
+ images.each(function (img) {
76
+ //img の中に選択された画像の各種情報が入ってくる
77
+
78
+ //テキストフォームに画像の ID・URL を表示
79
+ //$("#media_id").val(img.id);
80
+ $("#media_url").val(img.attributes.sizes.full.url); //フルサイズのURL
81
+
82
+ //プレビュー用に選択されたサムネイル画像を表示
83
+ $("#media_preview").html('<img src="' + img.attributes.sizes.full.url + '" alt="Preview">');
84
+ //$("#crear_btn").show();
85
+
86
+ });
87
+ });
88
+
89
+ //アップローダー開く
90
+ my_uploader.open();
91
+
92
+ });
93
+
94
+ // クリアボタンを押した時の処理
95
+ $("#crear_btn").click(function () {
96
+
97
+ //$("#media_id").val("");
98
+ $("#media_url").val("");
99
+ $("#media_preview").empty();
100
+ //$(this).hide();
101
+
102
+ });
103
+
104
+ })(jQuery);
assets/js/ssp_common.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function ($) {
2
+ //noindex switch
3
+ $switchBox = $('.switch_box');
4
+ $switchBox.click(function (e){
5
+ var labelFor = $(this).attr('for');
6
+ var p = $(this).closest('tr');
7
+ setTimeout( function() {
8
+ var val = $('#' + labelFor).prop('checked');
9
+ $('input[name="' + labelFor + '"]').val( Number(val) );
10
+
11
+ if (p.attr('data-disable') !== undefined) {
12
+ p.attr('data-disable', Number(val));
13
+ }
14
+ }, 10);
15
+ });
16
+ })(jQuery);
class/ssp_branch.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class SSP_Branch {
3
+
4
+ /**
5
+ * 外部からのインスタンス化を防ぐ
6
+ */
7
+ private function __construct() {}
8
+
9
+ /**
10
+ * 条件分岐タグの結果を取得
11
+ * Conditional_Tags
12
+ */
13
+ public static $is_ = null;
14
+ }
class/ssp_data.php ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SSP_Data {
4
+
5
+ /**
6
+ * 外部からのインスタンス化を防ぐ
7
+ */
8
+ private function __construct() {}
9
+
10
+
11
+ /**
12
+ * 使用するDBの名前
13
+ */
14
+ const DB_NAME = [
15
+ 'installed' => 'ssp_installed',
16
+ 'settings' => 'ssp_settings',
17
+ 'ogp' => 'ssp_ogp',
18
+ ];
19
+
20
+
21
+ /**
22
+ * DB[ssp_settings]用変数
23
+ */
24
+ public static $settings = "";
25
+
26
+
27
+ /**
28
+ * DB[spp_ogp]用変数
29
+ */
30
+ public static $ogp = "";
31
+
32
+
33
+ /**
34
+ * サイト基本情報
35
+ */
36
+ public static $site_title = "";
37
+ public static $site_catch_phrase = "";
38
+
39
+
40
+ /**
41
+ * NOUNCEキー アクション名
42
+ */
43
+ const NOUNCE_ACTION = '_ssp_post';
44
+
45
+
46
+ /**
47
+ * NOUNCEキー name
48
+ */
49
+ const NOUNCE_NAME = '_ssp_nounce';
50
+
51
+
52
+ /**
53
+ * 区切り文字リスト
54
+ */
55
+ const SEPARATOR_LIST = [
56
+ 'dash' => '-',
57
+ 'line' => '|',
58
+ 'tilde' => '~'
59
+ ];
60
+
61
+
62
+ /**
63
+ * 初回インストール時に登録する基本設定のデフォルト値
64
+ */
65
+ const DEFAULT_SETTINGS = [
66
+ 'home_title' => '%_site_title_% %_sep_% %_phrase_%',
67
+ 'home_desc' => '',
68
+ 'home_keyword' => '',
69
+ 'separator' => 'line',
70
+ 'webmaster_bing' => '',
71
+ 'webmaster_google' => '',
72
+ 'webmaster_baidu' => '',
73
+ 'webmaster_yandex' => '',
74
+ 'google_analytics_type' => 'gtag',
75
+ 'google_analytics_id' => '',
76
+ 'post_noindex' => false,
77
+ 'post_title' => '%_page_title_% %_sep_% %_site_title_%',
78
+ 'post_desc' => '%_page_contents_%',
79
+ 'page_noindex' => false,
80
+ 'page_title' => '%_page_title_% %_sep_% %_site_title_%',
81
+ 'page_desc' => '%_page_contents_%',
82
+ 'media_disable' => true,
83
+ 'media_noindex' => true,
84
+ 'media_title' => '%_page_title_% %_sep_% %_site_title_%',
85
+ 'media_desc' => '%_page_contents_%',
86
+ 'cat_noindex' => true,
87
+ 'cat_title' => '%_cat_name_% %_sep_% %_site_title_%',
88
+ 'cat_desc' => 'カテゴリー「%_cat_name_%」の一覧ページです。',
89
+ 'tag_noindex' => true,
90
+ 'tag_title' => '%_tag_name_% %_sep_% %_site_title_%',
91
+ 'tag_desc' => 'タグ「%_tag_name_%」の一覧ページです。',
92
+ 'post_format_disable' => true,
93
+ 'post_format_noindex' => true,
94
+ 'post_format_title' => '%_format_name_% %_sep_% %_site_title_%',
95
+ 'post_format_desc' => '投稿フォーマット「%_format_name_%」の一覧ページです。',
96
+ 'author_disable' => true,
97
+ 'author_noindex' => true,
98
+ 'author_title' => '%_author_name_% %_sep_% %_site_title_%',
99
+ 'author_desc' => '%_author_name_% の執筆記事一覧ページです。',
100
+ 'date_noindex' => true,
101
+ 'date_title' => '%_date_% %_sep_% %_site_title_%', //get_localで日本語かそうでないか,
102
+ 'date_desc' => '%_date_% の記事一覧ページです。', //get_localで日本語かそうでないか,
103
+ 'pt_archive_noindex' => true,
104
+ 'pt_archive_title' => '%_post_type_% %_sep_% %_site_title_%',
105
+ 'pt_archive_desc' => '「%_post_type_%」の記事一覧ページです',
106
+ '404_title' => 'ページが見つかりません。 %_sep_% %_site_title_%',
107
+ 'search_title' => '検索: %_search_phrase_% %_sep_% %_site_title_%',
108
+ ];
109
+
110
+
111
+ /**
112
+ * 初回インストール時に登録するOGP設定のデフォルト値
113
+ */
114
+ const DEFAULT_OGP = [
115
+ 'og_image' => '',
116
+ 'fb_active' => true,
117
+ 'fb_url' => '',
118
+ 'fb_app_id' => '',
119
+ 'fb_admins' => '',
120
+ 'tw_active' => true,
121
+ 'tw_account' => '',
122
+ 'tw_card' => 'summary',
123
+ ];
124
+
125
+
126
+ /**
127
+ * カスタム投稿のフォーマット形式
128
+ */
129
+ const DEFAULT_PT_SETTING = [
130
+ 'noindex' => false,
131
+ 'title' => '%_page_title_% %_sep_% %_site_title_%',
132
+ 'desc' => '%_page_contents_%',
133
+ ];
134
+
135
+
136
+ /**
137
+ * カスタムタクソノミーのフォーマット形式
138
+ */
139
+ const DEFAULT_TAX_SETTING = [
140
+ 'noindex' => true,
141
+ 'title' => '%_term_name_% %_sep_% %_site_title_%',
142
+ 'desc' => '%_tax_name_%「%_term_name_%」の一覧ページです。',
143
+ ];
144
+
145
+ }
class/ssp_init.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SSP_Init {
4
+
5
+ /**
6
+ * The constructor
7
+ */
8
+ public function __construct() {
9
+
10
+ $this->set_ssp_data();
11
+ $this->set_hooks();
12
+
13
+ }
14
+
15
+
16
+ /**
17
+ * 基本データの初期化処理
18
+ */
19
+ private function set_ssp_data() {
20
+
21
+ //サイト基本情報取得
22
+ SSP_Data::$site_title = esc_html( get_option( 'blogname' ) );
23
+ SSP_Data::$site_catch_phrase = esc_html( get_option( 'blogdescription' ) );
24
+ SSP_Data::$settings = get_option( SSP_Data::DB_NAME[ 'settings' ] );
25
+ SSP_Data::$ogp = get_option( SSP_Data::DB_NAME[ 'ogp' ] );
26
+
27
+ }
28
+
29
+
30
+ /**
31
+ * アクションフックの登録
32
+ */
33
+ private function set_hooks() {
34
+
35
+ add_action( 'init', [ 'SSP_Methods', 'add_custom_settings' ] );
36
+ add_action( 'wp', [ 'SSP_Methods', 'set_branch' ], 1 );
37
+ add_action( 'admin_enqueue_scripts', [ 'SSP_Methods', 'include_files' ] );
38
+ add_action( 'admin_menu', ['SSP_Menu', 'add_menus'] );
39
+ add_action( 'wp_head', [ 'SSP_Output', 'main' ], 10 );
40
+ add_action( 'template_redirect', [ 'SSP_Methods', 'redirect' ], 1 );
41
+ add_action( 'add_meta_boxes', [ 'SSP_MetaBox', 'add_ssp_metabox' ], 1);
42
+ add_action( 'save_post', [ 'SSP_MetaBox', 'save_ssp_metabox'] );
43
+
44
+ }
45
+
46
+ }
47
+
class/ssp_menu.php ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SSP_Menu {
4
+
5
+ /**
6
+ * 外部からのインスタンス化を防ぐ
7
+ */
8
+ private function __construct() {}
9
+
10
+
11
+ /**
12
+ * トップレベルメニューの設定
13
+ */
14
+ const TOP_MENU = [
15
+ 'page_title' => 'SIMPLE SEO', //ページのタイトルタグに表示されるテキスト
16
+ 'menu_title' => 'SIMPLE SEO', //メニュータイトル
17
+ 'capability' => 'manage_options', //必要な権限
18
+ 'menu_slug' => 'ssp_main_setting', //このメニューを参照するスラッグ名
19
+ 'function' => ['SSP_Menu','ssp_top_menu'], //呼び出す関数名
20
+ //'icon_url' => SSP_URL.'/assets/img/noimg.gif', //アイコンURL
21
+ 'icon_url' => 'dashicons-list-view', //アイコンURL
22
+ 'position' => 81 //管理画面での表示位置
23
+ ];
24
+
25
+
26
+ /**
27
+ * サブメニュー「OGP」の設定
28
+ */
29
+ const OGP_MENU = [
30
+ 'parent_slug' => 'ssp_main_setting',
31
+ 'page_title' => 'OGP設定',
32
+ 'menu_title' => 'OGP設定',
33
+ 'capability' => 'administrator',
34
+ 'menu_slug' => 'ssp_ogp_setting',
35
+ 'function' => ['SSP_Menu','ssp_ogp_menu']
36
+ ];
37
+
38
+ /**
39
+ * サブメニュー「HELP」の設定
40
+ */
41
+ const HELP_MENU = [
42
+ 'parent_slug' => 'ssp_main_setting',
43
+ 'page_title' => 'HELP',
44
+ 'menu_title' => 'HELP',
45
+ 'capability' => 'administrator',
46
+ 'menu_slug' => 'ssp_help',
47
+ 'function' => ['SSP_Menu','ssp_help_menu']
48
+ ];
49
+
50
+
51
+ /**
52
+ * トップメニューに表示するタブコンテンツ
53
+ */
54
+ const TOP_MENU_TABS = [
55
+ 'basic' => '基本設定',
56
+ 'post_type' => '投稿ページ',
57
+ 'taxonomy' => 'タクソノミーアーカイブ',
58
+ 'archive' => 'その他アーカイブ',
59
+ 'analytics' => 'Google アナリティクス',
60
+ 'webmaster' => 'ウェブマスターツール'
61
+ ];
62
+
63
+
64
+ /**
65
+ * OGPメニューに表示するタブコンテンツ
66
+ */
67
+ const OGP_MENU_TABS = [
68
+ 'ogp' => '基本設定',
69
+ 'facebook' => 'Facebook',
70
+ 'twitter' => 'Twitter',
71
+ ];
72
+
73
+
74
+ /**
75
+ * メニューの追加
76
+ */
77
+ public static function add_menus() {
78
+ //トップレベルメニュー
79
+ add_menu_page(
80
+ self::TOP_MENU['page_title'],
81
+ self::TOP_MENU['menu_title'],
82
+ self::TOP_MENU['capability'],
83
+ self::TOP_MENU['menu_slug'],
84
+ self::TOP_MENU['function'],
85
+ self::TOP_MENU['icon_url'],
86
+ self::TOP_MENU['position']
87
+ );
88
+
89
+ //トップレベルメニュークリック時の表示
90
+ add_submenu_page(
91
+ self::TOP_MENU['menu_slug'],
92
+ self::TOP_MENU['menu_title'],
93
+ '一般設定', //サブ側の名前
94
+ 'administrator', //権限
95
+ self::TOP_MENU['menu_slug'],
96
+ self::TOP_MENU['function'] //親と同じ関数を呼び出す
97
+ );
98
+
99
+ //サブメニュー SNS
100
+ add_submenu_page(
101
+ self::OGP_MENU['parent_slug'],
102
+ self::OGP_MENU['page_title'],
103
+ self::OGP_MENU['menu_title'],
104
+ self::OGP_MENU['capability'],
105
+ self::OGP_MENU['menu_slug'],
106
+ self::OGP_MENU['function']
107
+ );
108
+
109
+ //サブメニュー HELP
110
+ add_submenu_page(
111
+ self::HELP_MENU['parent_slug'],
112
+ self::HELP_MENU['page_title'],
113
+ self::HELP_MENU['menu_title'],
114
+ self::HELP_MENU['capability'],
115
+ self::HELP_MENU['menu_slug'],
116
+ self::HELP_MENU['function']
117
+ );
118
+ }
119
+
120
+
121
+ /**
122
+ * トップレベルメニュー 内容
123
+ */
124
+ public static function ssp_top_menu() {
125
+ require_once SSP_PATH.'inc/page_top.php';
126
+ }
127
+
128
+ //サブメニュー [OGP] 内容
129
+ public static function ssp_ogp_menu() {
130
+ require_once SSP_PATH.'inc/page_ogp.php';
131
+ }
132
+
133
+ //サブメニュー [HELP] 内容
134
+ public static function ssp_help_menu() {
135
+ //require_once SSP_PATH.'inc/page_ogp.php';
136
+ require_once SSP_PATH.'inc/page_help.php';
137
+ }
138
+
139
+ }
140
+
class/ssp_metabox.php ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class SSP_MetaBox {
3
+
4
+ /**
5
+ * 外部からのインスタンス化を防ぐ
6
+ */
7
+ private function __construct() {}
8
+
9
+
10
+ /**
11
+ * metabox names
12
+ */
13
+ const METANAME = [
14
+ 'noindex' => 'ssp_meta_noindex',
15
+ 'description' => 'ssp_meta_description',
16
+ 'keyword' => 'ssp_meta_keyword',
17
+ ];
18
+
19
+
20
+ /**
21
+ * Add metabox.
22
+ *
23
+ */
24
+ public static function add_ssp_metabox() {
25
+ $args = ['public' => true, '_builtin' => false];
26
+ $post_types = get_post_types( $args, 'names', 'and' );
27
+ $taxonomies = get_taxonomies( $args, 'names', 'and' );
28
+
29
+ $screens = array_merge( ['post','page'], $post_types );
30
+
31
+ add_meta_box(
32
+ 'ssp_metabox', //メタボックスのID名(html)
33
+ 'SEO設定', //メタボックスのタイトル
34
+ ['SSP_MetaBox', 'ssp_metabox_callback'], //htmlを出力する関数名
35
+ $screens, //表示する投稿タイプ
36
+ 'advanced', //表示場所 : 'normal', 'advanced', 'side'
37
+ 'high', //表示優先度 : 'high', 'core', 'default' または 'low'
38
+ null //$callback_args
39
+ );
40
+ }
41
+
42
+
43
+ /**
44
+ * Metabox cintents.
45
+ *
46
+ * privateにするとエラーが起きる
47
+ */
48
+ public static function ssp_metabox_callback( $post ) {
49
+
50
+ $val_noindex = get_post_meta( $post->ID, self::METANAME['noindex'], true );
51
+ $val_description = get_post_meta( $post->ID, self::METANAME['description'], true );
52
+ $val_keyword = get_post_meta( $post->ID, self::METANAME['keyword'], true );
53
+
54
+ $cb = ($val_noindex === "1")
55
+ ? '<input type="checkbox" name="" id="'.self::METANAME['noindex'].'" checked>'
56
+ : '<input type="checkbox" name="" id="'.self::METANAME['noindex'].'">';
57
+
58
+
59
+ echo '<div id="ssp_wrap" class="ssp_metabox">',
60
+
61
+ '<label for="', self::METANAME['noindex'], '">このページを非公開にする</label>',
62
+ '<div class="ssp_meta_inner">',
63
+ '<span>はい</span>',
64
+ '<label class="switch_box" for="', self::METANAME['noindex'], '">',
65
+ $cb, '<span class="slider round"></span>',
66
+ '</label>',
67
+ '<span>いいえ</span>',
68
+ '<input type="hidden" name="', self::METANAME['noindex'], '" value="', $val_noindex, '">',
69
+ '</div>',
70
+
71
+ '<label for="', self::METANAME['description'], '">このページのディスクリプション</label>',
72
+ '<div class="ssp_meta_inner">',
73
+ '<textarea id="', self::METANAME['description'], '" name="', self::METANAME['description'], '">',
74
+ esc_html( $val_description ),
75
+ '</textarea>',
76
+ '</div>',
77
+
78
+ '<label for="', self::METANAME['keyword'], '">このページのキーワード</label>',
79
+ '<div class="ssp_meta_inner">',
80
+ '<input type="text" id="', self::METANAME['keyword'], '" name="', self::METANAME['keyword'], '" value="',esc_html( $val_keyword ),'">',
81
+ '</div>',
82
+ '</div>';
83
+
84
+ // nonceフィールド追加
85
+ wp_nonce_field( SSP_Data::NOUNCE_ACTION, SSP_Data::NOUNCE_NAME );
86
+ }
87
+
88
+ public static function save_ssp_metabox( $post_id ) {
89
+
90
+ /* Debug デバッグ には exit() 使う*/
91
+ // var_dump( $_POST );
92
+ // exit();
93
+
94
+
95
+ //新規投稿ページでも発動するので、$_POSTが空なら return させる
96
+ if ( empty($_POST) ) {
97
+ return;
98
+ }
99
+
100
+ //nounce check
101
+ check_admin_referer( SSP_Data::NOUNCE_ACTION, SSP_Data::NOUNCE_NAME );
102
+
103
+ // If this is an autosave, our form has not been submitted, so we don't want to do anything.
104
+ // :: 自動保存時にはメタボックスの内容を保存しないように、ここで処理を終える
105
+ if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
106
+ return;
107
+ }
108
+
109
+ // Check the user's permissions.
110
+ // :: 現在のユーザーに投稿の編集権限があるかのチェック
111
+ if ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) {
112
+
113
+ if ( ! current_user_can( 'edit_page', $post_id ) ) {
114
+ return;
115
+ }
116
+
117
+ } else {
118
+
119
+ if ( ! current_user_can( 'edit_post', $post_id ) ) {
120
+ return;
121
+ }
122
+ }
123
+
124
+ /*
125
+ OK, it's safe for us to save the data now.
126
+ ここまでくれば大丈夫です。保存処理を開始します。
127
+ */
128
+
129
+ // Make sure that it is set.
130
+ // 保存したい情報が渡ってきているか確認
131
+ if ( !isset( $_POST[self::METANAME['noindex']] ) ||
132
+ !isset( $_POST[self::METANAME['description']] ) ||
133
+ !isset( $_POST[self::METANAME['keyword']] ) ) {
134
+ return;
135
+ }
136
+
137
+ // Sanitize user input.
138
+ // 入力された値をサニタイズ
139
+ $meta_noindex = sanitize_text_field( $_POST[self::METANAME['noindex']] );
140
+ $meta_description = sanitize_text_field( $_POST[self::METANAME['description']] );
141
+ $meta_keyword = sanitize_text_field( $_POST[self::METANAME['keyword']] );
142
+
143
+ // Update the meta field in the database.
144
+ // データベースのポストメタに値を保存
145
+ update_post_meta( $post_id, self::METANAME['noindex'], $meta_noindex );
146
+ update_post_meta( $post_id, self::METANAME['description'], $meta_description );
147
+ update_post_meta( $post_id, self::METANAME['keyword'], $meta_keyword );
148
+ }
149
+ }
150
+
151
+
152
+
153
+
class/ssp_methods.php ADDED
@@ -0,0 +1,362 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SSP_Methods {
4
+
5
+ /**
6
+ * 外部からのインスタンス化を防ぐ
7
+ */
8
+ private function __construct() {}
9
+
10
+
11
+ /**
12
+ * デバッグ用
13
+ */
14
+ public static function dump( $data, $str = "" ) {
15
+
16
+ echo '<div class="dev_area">';
17
+ echo '<p>'.$str.'</p>';
18
+ var_dump($data);
19
+ echo '</div>';
20
+ }
21
+
22
+
23
+ /**
24
+ * プラグイン有効化時の処理
25
+ * Function for the plugin activated.
26
+ */
27
+ public static function plugin_activate() {
28
+
29
+ if ( get_option( SSP_Data::DB_NAME[ 'installed' ] ) === false ) {
30
+
31
+ //初回 or 再インストール時 : デフォルト設定取得
32
+ $SSP_settings = SSP_Data::DEFAULT_SETTINGS;
33
+ $SSP_ogp = SSP_Data::DEFAULT_OGP;
34
+
35
+ update_option( SSP_Data::DB_NAME[ 'installed' ], 1 );
36
+
37
+ } else {
38
+
39
+ //データが残っている場合 : 既存設定取得
40
+ $SSP_settings = get_option( SSP_Data::DB_NAME[ 'settings' ] );
41
+ $SSP_ogp = get_option( SSP_Data::DB_NAME[ 'ogp' ] );
42
+
43
+ }
44
+
45
+ //DB更新
46
+ update_option( SSP_Data::DB_NAME[ 'settings' ], $SSP_settings );
47
+ update_option( SSP_Data::DB_NAME[ 'ogp' ], $SSP_ogp );
48
+
49
+ }
50
+
51
+
52
+ /**
53
+ * プラグイン停止時の処理
54
+ * Function for the plugin deactivated.
55
+ */
56
+ public static function plugin_deactivate() {
57
+ }
58
+
59
+
60
+ /**
61
+ * プラグインアンインストール時の処理
62
+ * Function for the plugin uninstalled.
63
+ */
64
+ public static function plugin_uninstall() {
65
+ foreach ( SSP_Data::DB_NAME as $db_name ) {
66
+ delete_option( $db_name );
67
+ }
68
+ }
69
+
70
+
71
+ /**
72
+ * カスタム投稿タイプ・タクソノミー用の設定を追加
73
+ */
74
+ public static function add_custom_settings () {
75
+
76
+ if( !is_admin() ) {
77
+ return;
78
+ }
79
+
80
+ $added_new_data = false;
81
+ $args = [ 'public' => true, '_builtin' => false ];
82
+ $post_types = get_post_types( $args, 'names', 'and' );
83
+ $taxonomies = get_taxonomies( $args, 'names', 'and' );
84
+
85
+ //カスタム投稿 settings 追加
86
+ foreach ( $post_types as $pt ) {
87
+ if ( !isset( SSP_Data::$settings[ $pt.'_noindex' ] ) ) {
88
+ SSP_Data::$settings[ $pt.'_noindex' ] = SSP_Data::DEFAULT_PT_SETTING[ 'noindex' ];
89
+ SSP_Data::$settings[ $pt.'_title' ] = SSP_Data::DEFAULT_PT_SETTING[ 'title' ];
90
+ SSP_Data::$settings[ $pt.'_desc' ] = SSP_Data::DEFAULT_PT_SETTING[ 'desc' ];
91
+ $added_new_data = true;
92
+ }
93
+ }
94
+
95
+ //カスタムタクソノミー settings 追加
96
+ foreach ( $taxonomies as $tax ) {
97
+ if ( !isset( SSP_Data::$settings[ $tax.'_noindex' ] ) ) {
98
+ SSP_Data::$settings[ $tax.'_noindex' ] = SSP_Data::DEFAULT_TAX_SETTING[ 'noindex' ];
99
+ SSP_Data::$settings[ $tax.'_title' ] = SSP_Data::DEFAULT_TAX_SETTING[ 'title' ];
100
+ SSP_Data::$settings[ $tax.'_desc' ] = SSP_Data::DEFAULT_TAX_SETTING[ 'desc' ];
101
+ $added_new_data = true;
102
+ }
103
+ }
104
+
105
+ //新規追加項目があった場合
106
+ if ( $added_new_data ) {
107
+ update_option( SSP_Data::DB_NAME['settings'], SSP_Data::$settings );
108
+ }
109
+
110
+ return;
111
+ }
112
+
113
+
114
+ /**
115
+ * 条件分岐タグの結果を変数に代入
116
+ */
117
+ public static function set_branch() {
118
+
119
+ SSP_Branch::$is_ = [
120
+ 'home' => is_home(),
121
+ 'front' => is_front_page(),
122
+ 'single' => is_single(),
123
+ 'page' => is_page(),
124
+ 'singular' => is_singular(),
125
+ 'category' => is_category(),
126
+ 'tag' => is_tag(),
127
+ 'tax' => is_tax(),
128
+ 'attachment' => is_attachment(),
129
+ 'archive' => is_archive(),
130
+ 'pt_archive' => is_post_type_archive(),
131
+ 'author' => is_author(),
132
+ 'date' => is_date(),
133
+ 'year' => is_year(),
134
+ 'month' => is_month(),
135
+ 'day' => is_day(),
136
+ 'search' => is_search(),
137
+ '404' => is_404(),
138
+ ];
139
+ }
140
+
141
+
142
+ /**
143
+ * CSS Scriptの読み込み
144
+ */
145
+ public static function include_files( $page ) {
146
+
147
+ if ( strpos( $page, 'ssp_' ) !== false ) {
148
+
149
+ wp_enqueue_media();
150
+ wp_enqueue_script(
151
+ 'ssp-script',
152
+ plugins_url( 'assets/js/ssp.js', SSP_FILE ),
153
+ array(),
154
+ SSP_VERSION,
155
+ true
156
+ );
157
+
158
+ }
159
+ wp_enqueue_script(
160
+ 'ssp-common-script',
161
+ plugins_url( 'assets/js/ssp_common.js', SSP_FILE ),
162
+ array(),
163
+ SSP_VERSION,
164
+ true
165
+ );
166
+ wp_enqueue_style(
167
+ 'ssp-css',
168
+ plugins_url( "assets/css/ssp.css", SSP_FILE ),
169
+ array(),
170
+ SSP_VERSION
171
+ );
172
+
173
+ }
174
+
175
+
176
+ /**
177
+ * 使用しないページのリダイレクト処理
178
+ */
179
+ public static function redirect( $page ) {
180
+
181
+ $home = home_url();
182
+
183
+ if ( SSP_Branch::$is_['author'] && SSP_Data::$settings['author_disable'] ) {
184
+ wp_safe_redirect($home);
185
+ }
186
+ if ( SSP_Branch::$is_['tax'] && SSP_Data::$settings['post_format_disable'] ) {
187
+ if (get_queried_object()->taxonomy === 'post_format') {
188
+ wp_safe_redirect($home);
189
+ };
190
+ }
191
+ if ( SSP_Branch::$is_['attachment'] && SSP_Data::$settings['media_disable'] ) {
192
+ wp_safe_redirect(get_post()->guid);
193
+ }
194
+ }
195
+
196
+
197
+ /**
198
+ * プレビュー機能用のスニペット変換
199
+ */
200
+ public static function replace_snippets_forpv ( $str ) {
201
+
202
+ $str = str_replace ('%_site_title_%', '<span>'.esc_html( SSP_Data::$site_title ).'</span>', $str);
203
+ $str = str_replace ('%_phrase_%', '<span>'.esc_html( SSP_Data::$site_catch_phrase ).'</span>', $str);
204
+ $str = str_replace ('%_description_%', esc_html( SSP_Data::$settings[ 'home_desc' ] ), $str);
205
+ $str = str_replace ('%_page_title_%', '<span>投稿タイトル</span>', $str);
206
+ $str = str_replace ('%_cat_name_%', '<span>カテゴリー名</span>', $str);
207
+ $str = str_replace ('%_tag_name_%', '<span>タグ名</span>', $str);
208
+ $str = str_replace ('%_term_name_%', '<span>ターム名</span>', $str);
209
+ $str = str_replace ('%_tax_name_%', '<span>タクソノミー名</span>', $str);
210
+ $str = str_replace ('%_author_name_%', '<span>著者名(ニックネーム)</span>', $str);
211
+ $str = str_replace ('%_search_phrase_%', '<span>検索ワード</span>', $str);
212
+ $str = str_replace ('%_post_type_%', '<span>投稿タイプ名</span>', $str);
213
+ $str = str_replace ('%_page_contents_%', '<span>投稿コンテンツ</span>', $str);
214
+ $str = str_replace ('%_date_%', '<span>日付</span>', $str);
215
+ $str = str_replace ('%_format_name_%', '<span>フォーマット名</span>', $str);
216
+
217
+ if (strpos($str, '%_sep_%') !== false) {
218
+
219
+ $sep_key = SSP_Data::$settings[ 'separator' ];
220
+ $sep_val = SSP_Data::SEPARATOR_LIST[$sep_key];
221
+ $str = str_replace ('%_sep_%', '<span>'.$sep_val.'</span>', $str);
222
+
223
+ }
224
+
225
+ return $str;
226
+ }
227
+
228
+ /**
229
+ * データを無害化して返す
230
+ */
231
+ public static function sanitize_post_data( $data ) {
232
+
233
+ foreach ($data as $key => $val) {
234
+
235
+ if ( $val === "" ) {
236
+ continue;
237
+ }
238
+
239
+ // "1" , "0" => bool
240
+ $bool_val = filter_var( $val, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE );
241
+
242
+ if ( $bool_val === null ) {
243
+
244
+ $val = sanitize_text_field( $val );
245
+ $val = stripslashes( $val );
246
+ $data[ $key ] = $val;
247
+
248
+ } else {
249
+
250
+ $data[ $key ] = $bool_val;
251
+
252
+ }
253
+ }
254
+
255
+ return $data;
256
+ }
257
+
258
+ /**
259
+ * 設定更新時のDB更新処理
260
+ */
261
+ public static function update_db( $P ) {
262
+
263
+ if ( empty( $P ) ) {
264
+ exit( 'POST data was not found' );
265
+ }
266
+
267
+ //Check my nounce key.
268
+ check_admin_referer( SSP_Data::NOUNCE_ACTION, SSP_Data::NOUNCE_NAME );
269
+
270
+ //Get DB name.
271
+ $db_name = $P[ 'db_name' ];
272
+
273
+ if ( !in_array( $db_name, SSP_Data::DB_NAME ) ) {
274
+ exit( 'DataBase was not found' );
275
+ }
276
+
277
+ //Get DB
278
+ $db_data = get_option( $db_name );
279
+
280
+ if ( $db_data === false ) {
281
+ exit( 'DataBase was not found' );
282
+ };
283
+
284
+ //Delete unexpected data form the POST data.
285
+ foreach ( $P as $key => $v ) {
286
+
287
+ if ( !isset( $db_data[ $key ] ) ) {
288
+
289
+ unset( $P[ $key ] );
290
+
291
+ }
292
+ }
293
+
294
+ //Update DB.
295
+ update_option( $db_name, $P );
296
+ }
297
+
298
+
299
+ /**
300
+ * 管理画面メニューのテーブル内容を出力する
301
+ */
302
+ public static function output_table_rows( $table_rows, $db_name = null) {
303
+
304
+ if ( $db_name === "ogp") {
305
+
306
+ $db = SSP_Data::$ogp;
307
+
308
+ } else {
309
+
310
+ $db = SSP_Data::$settings;
311
+
312
+ }
313
+
314
+ foreach ( $table_rows as $key => $row ) {
315
+
316
+ $data_disable = "";
317
+
318
+ if( $row['is_checkbox'] ) {
319
+
320
+ if ( strpos( $key, '_disable' ) !== false ) {
321
+ $data_disable = 'data-disable="'.(int) $db[$key].'"';
322
+ }
323
+
324
+ $form_item = '<span>はい</span><label class="switch_box" for="'.$key.'">';
325
+
326
+ $form_item .= $db[ $key ]
327
+ ? '<input type="checkbox" name="" id="'.$key.'" checked>'
328
+ : '<input type="checkbox" name="" id="'.$key.'">';
329
+ $form_item .= '<span class="slider round"></span></label><span>いいえ</span>';
330
+ $form_item .= '<input type="hidden" name="'.$key.'" value="'.esc_attr( $db[$key] ).'">';
331
+
332
+ } else {
333
+
334
+ $form_item = $row['item'] ?:
335
+ '<input type="text" name="'.$key.'" id="'.'.$key.'.'"value="'.esc_attr( $db[$key] ).'">';
336
+
337
+ }
338
+
339
+ echo '<tr valign="top" ', $data_disable, '><th scope="row">',
340
+ '<label for="'.$key.'">', $row['title'], '</label>',
341
+ $row['reqired'] ? '<span class="required">*</span>' : "" ,
342
+ '</th>',
343
+
344
+ '<td>',
345
+ '<div class="inner ', $row['class'], '">',
346
+
347
+ '<div class="ssp_item">', $form_item, '</div>',
348
+ '<div class="ssp_desc">
349
+ <p>', $row['desc'], '</p>',
350
+ '</div>',
351
+ $row['prev'] ?
352
+ '<div class="ssp_prev">┗ プレビュー:<p>'.
353
+ SSP_Methods::replace_snippets_forpv( esc_html( $db[ $key ] ) ).
354
+ '</p><a href="'.admin_url().'admin.php?page=ssp_help" target="_blank" title="使用可能なスニペットタグについて" class="ssp_help">?</a></div>'
355
+ : "",
356
+ '</div>',
357
+ '</td>',
358
+ '</tr>';
359
+ }
360
+ }
361
+ }
362
+
class/ssp_output.php ADDED
@@ -0,0 +1,661 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SSP_Output {
4
+
5
+ /**
6
+ * 外部からのインスタンス化を防ぐ
7
+ */
8
+ private function __construct() {}
9
+
10
+ /**
11
+ * @var object The current wp object.
12
+ */
13
+ private static $obj;
14
+
15
+ /**
16
+ * @var string The Title holder.
17
+ */
18
+ private static $title;
19
+
20
+ /**
21
+ * @var string The Description holder.
22
+ */
23
+ private static $description;
24
+
25
+ /**
26
+ * @var string The Description holder.
27
+ */
28
+ private static $robots;
29
+
30
+ /**
31
+ * @var string The Description holder.
32
+ */
33
+ private static $keyword;
34
+
35
+
36
+ /**
37
+ * @var string The canonical holder.
38
+ */
39
+ private static $canonical;
40
+
41
+ /**
42
+ * @var string The canonical holder.
43
+ */
44
+ private static $ogp_tags;
45
+
46
+
47
+ /**
48
+ * The constructor.
49
+ * Genarate and output meta tags for current page.
50
+ */
51
+ public static function main() {
52
+
53
+ echo "\n<!-- SEO SIMPLE PACK ", SSP_VERSION, " -->\n";
54
+ self::generate_metas();
55
+ self::output_metas();
56
+ self::output_codes();
57
+ echo "<!-- / SEO SIMPLE PACK -->\n";
58
+
59
+ }
60
+
61
+
62
+ /**
63
+ * Output the meta tags
64
+ *
65
+ */
66
+ private static function generate_metas() {
67
+
68
+ $is_ = SSP_Branch::$is_;
69
+ self::$obj = get_queried_object();
70
+ self::$title = self::generate_title( $is_ );
71
+ self::$robots = self::generate_robots( $is_ );
72
+ self::$keyword = self::generate_keyword( $is_ );
73
+ self::$description = self::generate_description( $is_ );
74
+ self::$canonical = self::generate_canonical($is_ );
75
+ self::$ogp_tags = self::generate_ogp( $is_ );
76
+
77
+ }
78
+
79
+ /**
80
+ * Output the meta tags
81
+ */
82
+ private static function output_metas() {
83
+
84
+
85
+ if ( !empty( self::$title ) ) {
86
+ echo '<title>', esc_html( self::$title ), '</title>', "\n";
87
+ }
88
+
89
+ if ( !empty( self::$robots ) ) {
90
+ echo '<meta name="robots" content="', esc_attr( self::$robots ), '">', "\n";
91
+ }
92
+
93
+ if ( !empty( self::$description ) ) {
94
+ echo '<meta name="description" content="', esc_attr( self::$description ), '">', "\n";
95
+ }
96
+
97
+ if ( !empty( self::$keyword ) ) {
98
+ echo '<meta name="keyword" content="', esc_attr( self::$keyword ), '">', "\n";
99
+ }
100
+
101
+ if ( !empty( self::$canonical ) ) {
102
+ echo '<link rel="canonical" href="', esc_attr( self::$canonical ), '">', "\n";
103
+ }
104
+
105
+ if ( !empty( self::$ogp_tags ) ) {
106
+
107
+ echo self::$ogp_tags;
108
+
109
+ }
110
+
111
+
112
+ }
113
+
114
+
115
+ /**
116
+ * Generate the title tag for the current page.
117
+ *
118
+ * @param array $is_ : Results of Conditional tags.
119
+ * @return string : The title (escaped).
120
+ */
121
+ private static function generate_title( $is_ ) {
122
+
123
+ switch ( true ) {
124
+ case $is_[ 'home' ]:
125
+
126
+ $title = SSP_Data::$settings[ 'home_title' ];
127
+ break;
128
+
129
+ case $is_[ 'singular' ] :
130
+
131
+ $pt = self::$obj->post_type;
132
+ $title = SSP_Data::$settings[ $pt.'_title' ];
133
+ break;
134
+
135
+ case $is_[ 'category' ] :
136
+
137
+ $title = SSP_Data::$settings[ 'cat_title' ];
138
+ break;
139
+
140
+ case $is_[ 'tag' ] :
141
+
142
+ $title = SSP_Data::$settings[ 'tag_title' ];
143
+ break;
144
+
145
+ case $is_[ 'tax' ] :
146
+
147
+ $term = self::$obj->taxonomy;
148
+ $title = SSP_Data::$settings[ $term.'_title' ];
149
+ break;
150
+
151
+ case $is_[ 'pt_archive' ] :
152
+
153
+ $title = SSP_Data::$settings[ 'pt_archive_title' ];
154
+ break;
155
+
156
+ case $is_[ 'author' ] :
157
+
158
+ $title = SSP_Data::$settings[ 'author_title' ];
159
+ break;
160
+
161
+ case $is_[ 'date' ] :
162
+
163
+ $title = SSP_Data::$settings[ 'date_title' ];
164
+ break;
165
+
166
+ case $is_[ 'search' ] :
167
+
168
+ $title = SSP_Data::$settings[ 'search_title' ];
169
+ break;
170
+
171
+ case $is_[ '404' ] :
172
+
173
+ $title = SSP_Data::$settings[ '404_title' ];
174
+ break;
175
+
176
+ default :
177
+ $title = SSP_Data::$site_title;
178
+ break;
179
+ }
180
+
181
+ $title = self::replace_snippets( $title );
182
+ return $title;
183
+ }
184
+
185
+ /**
186
+ * Generate the meta:robots for the current page.
187
+ *
188
+ * @param array $is_ : Results of Conditional tags.
189
+ * @return string : The meta:robots.
190
+ */
191
+ private static function generate_robots( $is_ ) {
192
+
193
+ switch ( true ) {
194
+ case $is_[ 'home' ]:
195
+
196
+ return "";
197
+ break;
198
+
199
+ case $is_[ 'singular' ] :
200
+
201
+ $metabox_robots = get_post_meta(self::$obj->ID, SSP_MetaBox::METANAME['noindex'], true);
202
+ if (!empty($metabox_robots)) {
203
+ //"0" か "1"で帰ってくる
204
+ $is_noindex = boolval( $metabox_robots );
205
+ } else {
206
+ $pt = self::$obj->post_type;
207
+ $is_noindex = SSP_Data::$settings[ $pt.'_noindex' ];
208
+ }
209
+ break;
210
+
211
+ case $is_[ 'category' ] :
212
+
213
+ $is_noindex = SSP_Data::$settings[ 'cat_noindex' ];
214
+ break;
215
+
216
+ case $is_[ 'tag' ] :
217
+
218
+ $is_noindex = SSP_Data::$settings[ 'tag_noindex' ];
219
+ break;
220
+
221
+ case $is_[ 'tax' ] :
222
+
223
+ $term = self::$obj->taxonomy;
224
+ $is_noindex = SSP_Data::$settings[ $term.'_noindex' ];
225
+ break;
226
+
227
+ case $is_[ 'pt_archive' ] :
228
+
229
+ $is_noindex = SSP_Data::$settings[ 'pt_archive_noindex' ];
230
+ break;
231
+
232
+ case $is_[ 'author' ] :
233
+
234
+ $is_noindex = SSP_Data::$settings[ 'author_noindex' ];
235
+ break;
236
+
237
+ case $is_[ 'date' ] :
238
+
239
+ $is_noindex = SSP_Data::$settings[ 'date_noindex' ];
240
+ break;
241
+
242
+ case $is_[ 'search' ] :
243
+
244
+ $is_noindex = true;
245
+ break;
246
+
247
+ case $is_[ '404' ] :
248
+
249
+ $is_noindex = true;
250
+ break;
251
+
252
+ default :
253
+ return "";
254
+ break;
255
+ }
256
+ if ( $is_noindex ) {
257
+ return 'noindex,follow';
258
+ }
259
+
260
+ return "";
261
+ }
262
+
263
+ /**
264
+ * Generate the meta:keyword for the current page.
265
+ *
266
+ * @param array $is_ : Results of Conditional tags.
267
+ * @return string : The meta:keyword (escaped).
268
+ */
269
+ private static function generate_keyword( $is_ ) {
270
+
271
+ $keyword = SSP_Data::$settings[ 'home_keyword' ];
272
+
273
+ if( $is_[ 'singular' ] ) {
274
+
275
+ //メタボックスが入力されていれば上書きする
276
+ $metabox_keyword = get_post_meta(self::$obj->ID, SSP_MetaBox::METANAME['keyword'], true);
277
+ if ( $metabox_keyword ) {
278
+ $keyword = $metabox_keyword;
279
+ }
280
+
281
+ }
282
+ return $keyword;
283
+
284
+ }
285
+
286
+
287
+ /**
288
+ * Generate the meta:description for the current page.
289
+ *
290
+
291
+ * @param array $is_ : Results of Conditional tags.
292
+ * @return string : The meta:description (escaped).
293
+ */
294
+ private static function generate_description( $is_ ) {
295
+
296
+ switch ( true ) {
297
+ case $is_[ 'home' ]:
298
+
299
+ $description = SSP_Data::$settings[ 'home_desc' ] ?: '%_phrase_%';
300
+ break;
301
+
302
+ case $is_[ 'singular' ] :
303
+
304
+ $metabox_desc = get_post_meta( self::$obj->ID, SSP_MetaBox::METANAME['description'], true );
305
+
306
+ if ( $metabox_desc !== "" ) {
307
+ //メタボックスが入力されていれば優先
308
+ $description = $metabox_desc;
309
+ } else {
310
+ $pt = self::$obj->post_type;
311
+ $description = SSP_Data::$settings[ $pt.'_desc' ];
312
+ }
313
+ break;
314
+
315
+ case $is_[ 'category' ] :
316
+
317
+ $description = SSP_Data::$settings[ 'cat_desc' ];
318
+ break;
319
+
320
+ case $is_[ 'tag' ] :
321
+
322
+ $description = SSP_Data::$settings[ 'tag_desc' ];
323
+ break;
324
+
325
+ case $is_[ 'tax' ] :
326
+
327
+ $term = self::$obj->taxonomy;
328
+ $description = SSP_Data::$settings[ $term.'_desc' ];
329
+ break;
330
+
331
+ case $is_[ 'pt_archive' ] :
332
+
333
+ $description = SSP_Data::$settings[ 'pt_archive_desc' ];
334
+ break;
335
+
336
+ case $is_[ 'author' ] :
337
+
338
+ $description = SSP_Data::$settings[ 'author_desc' ];
339
+ break;
340
+
341
+ case $is_[ 'date' ] :
342
+
343
+ $description = SSP_Data::$settings[ 'date_desc' ];
344
+ break;
345
+
346
+ default :
347
+ $description = SSP_Data::$settings[ 'home_desc' ];
348
+ break;
349
+ }
350
+
351
+ $description = self::replace_snippets( $description );
352
+ return $description;
353
+
354
+ }
355
+
356
+
357
+ /**
358
+ * Generate the og tags for the current page.
359
+ *
360
+ * @param array $is_ : Results of Conditional tags.
361
+ * @return string : OGP tags.
362
+ */
363
+ private static function generate_ogp( $is_ ) {
364
+
365
+ $og_locale = ( get_locale() === 'ja') ? 'ja_JP' : get_locale();
366
+ $og_title = self::$title;
367
+ $og_desc = self::$description;
368
+ $og_url = self::$canonical;
369
+ $og_type = 'website';
370
+ $og_img = SSP_Data::$ogp[ 'og_image' ];
371
+
372
+
373
+ if ( $is_[ 'singular' ] ) {
374
+
375
+ $og_title = self::$obj->post_title;
376
+ $og_type = 'article';
377
+
378
+ if ( has_post_thumbnail( self::$obj->ID ) ) {
379
+ //アイキャッチ画像のurlを取得
380
+ $thumb_id = get_post_thumbnail_id( self::$obj->ID );
381
+ $thumb_url = wp_get_attachment_image_src( $thumb_id, 'full' );
382
+ $og_img = $thimb_url[0];
383
+ }
384
+
385
+ if( $is_['attachment'] ) {
386
+ $og_img = self::$obj->guid;
387
+ }
388
+ }
389
+ $ogp = "";
390
+ $ogp .= '<meta property="og:locale" content="'.esc_attr( $og_locale ).'">'."\n";
391
+ $ogp .= '<meta property="og:type" content="'.esc_attr( $og_type ).'">'."\n";
392
+ $ogp .= '<meta property="og:title" content="'.esc_attr( $og_title ).'">'."\n";
393
+ $ogp .= '<meta property="og:description" content="'.esc_attr( $og_desc ).'">'."\n";
394
+ $ogp .= '<meta property="og:url" content="'.esc_attr( $og_url ).'">'."\n";
395
+ $ogp .= '<meta property="og:site_name" content="'.esc_attr( SSP_Data::$site_title ).'">'."\n";
396
+
397
+ if ($og_img) {
398
+ $ogp .= '<meta property="og:image" content="'.esc_url( $og_img ).'">'."\n";
399
+ }
400
+
401
+ if ( SSP_Data::$ogp[ 'fb_active' ] ) {
402
+
403
+ $appid = SSP_Data::$ogp[ 'fb_app_id' ];
404
+ $admins = SSP_Data::$ogp[ 'fb_admins' ];
405
+ $publisher = SSP_Data::$ogp[ 'fb_url' ];
406
+
407
+ if( !empty( $appid )) {
408
+ $ogp .= '<meta property="fb:app_id" content="'.esc_attr( $appid ).'">'."\n";
409
+ }
410
+ if ( !empty( $admins )) {
411
+ $ogp .= '<meta property="fb:admins" content="'.esc_attr( $admins ).'">'."\n";
412
+ }
413
+ if ( $is_[ 'singular' ] && !empty( $publisher ) ) {
414
+ $ogp .= '<meta property="article:publisher" content="'.esc_attr( $publisher ).'">'."\n";
415
+ }
416
+
417
+ }
418
+ if ( SSP_Data::$ogp[ 'tw_active' ] ) {
419
+
420
+ $tw_account = SSP_Data::$ogp[ 'tw_account' ];
421
+
422
+ $ogp .= '<meta name="twitter:card" content="'.esc_attr( SSP_Data::$ogp[ 'tw_card' ] ).'">'."\n";
423
+ if( !empty( $tw_account ) ) {
424
+ $ogp .= '<meta name="twitter:site" content="'.esc_attr( $tw_account ).'">'."\n";
425
+ }
426
+ }
427
+
428
+ return $ogp;
429
+
430
+ }
431
+
432
+
433
+ /**
434
+ * Generate the canonical URL for the current page.
435
+ *
436
+ * @param array $is_ : Results of Conditional tags.
437
+ * @return string : The canonical URL (escaped).
438
+ */
439
+ private static function generate_canonical( $is_ ) {
440
+
441
+ switch ( true ) {
442
+
443
+ case $is_[ 'home' ] :
444
+
445
+ $canonical = home_url();
446
+ break;
447
+
448
+ case $is_[ 'singular' ] :
449
+
450
+ $canonical = get_permalink();
451
+ break;
452
+
453
+ case $is_[ 'tax' ] || $is_[ 'tag' ] || $is_[ 'category' ] :
454
+
455
+ $term = self::$obj;
456
+ $term_link = get_term_link( $term, $term->taxonomy );
457
+ $canonical = ( is_wp_error( $term_link ) ) ? "" : $term_link;
458
+ break;
459
+
460
+ case $is_[ 'pt_archive' ] :
461
+
462
+ $post_type = get_query_var( 'post_type' );
463
+ $post_type = ( is_array( $post_type ) ) ? reset( $post_type ) : $post_type ;
464
+ $canonical = get_post_type_archive_link( $post_type );
465
+ break;
466
+
467
+ case $is_[ 'author' ] :
468
+
469
+ $canonical = get_author_posts_url( get_query_var( 'author' ), get_query_var( 'author_name' ) );
470
+ break;
471
+
472
+ case $is_[ 'date' ] :
473
+
474
+ if ( $is_[ 'day' ] ) {
475
+ $canonical = get_day_link( get_query_var( 'year' ), get_query_var( 'monthnum' ), get_query_var( 'day' ) );
476
+ }
477
+ elseif ( $is_[ 'month' ] ) {
478
+ $canonical = get_month_link( get_query_var( 'year' ), get_query_var( 'monthnum' ) );
479
+ }
480
+ elseif ( $is_[ 'year' ] ) {
481
+ $canonical = get_year_link( get_query_var( 'year' ) );
482
+ }
483
+ break;
484
+
485
+ case $is_[ 'search' ] :
486
+
487
+ $canonical = get_search_link();
488
+ break;
489
+
490
+ case $is_[ '404' ] :
491
+
492
+ $canonical = home_url()."/404";
493
+ break;
494
+
495
+ default :
496
+
497
+ $obj = self::$obj;
498
+ $canonical = get_permalink( $obj->ID );
499
+ break;
500
+ }
501
+
502
+ return esc_url( $canonical );
503
+ }
504
+
505
+
506
+ /**
507
+ * Analytics and Webmaster code.
508
+ */
509
+ private static function output_codes() {
510
+
511
+ //meta tags for webmaster tools
512
+ if( SSP_Branch::$is_['home'] ) {
513
+ $webmaster_codes = [
514
+ 'webmaster_google' => 'google-site-verification',
515
+ 'webmaster_bing' => 'msvalidate.01',
516
+ 'webmaster_baidu' => 'baidu-site-verification',
517
+ 'webmaster_yandex' => 'yandex-verification',
518
+ ];
519
+ foreach ($webmaster_codes as $key => $name) {
520
+
521
+ if ( SSP_Data::$settings[ $key ] ) {
522
+ echo '<meta name="', esc_attr( $name ),'" content="', esc_attr( SSP_Data::$settings[ $key ] ), '">', "\n";
523
+ }
524
+
525
+ }
526
+ }
527
+
528
+
529
+ //google analytics code
530
+ if ( SSP_Data::$settings[ 'google_analytics_id' ] ) {
531
+ $gaid = SSP_Data::$settings[ 'google_analytics_id' ];
532
+
533
+ if ( SSP_Data::$settings[ 'google_analytics_type' ] === 'gtag' ) {
534
+
535
+ echo "<!-- Global site tag (gtag.js) - Google Analytics -->\n",
536
+ "<script async src='https://www.googletagmanager.com/gtag/js?id=", esc_url( $gaid ), "'></script>\n",
537
+ "<script>\n",
538
+ "window.dataLayer = window.dataLayer || [];\n",
539
+ "function gtag(){dataLayer.push(arguments);}\n",
540
+ "gtag('js', new Date());\n",
541
+ "gtag('config', '", esc_attr( $gaid ), "');\n",
542
+ "</script>\n";
543
+
544
+ } elseif ( SSP_Data::$settings[ 'google_analytics_type' ] === 'analytics' ) {
545
+
546
+ echo "<!-- Google Analytics -->\n",
547
+ "<script>\n",
548
+ "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n",
549
+ "(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n",
550
+ "m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n",
551
+ "})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');\n",
552
+
553
+ "ga('create', '", esc_attr( $gaid ), "', 'auto');\n",
554
+ "ga('send', 'pageview');\n",
555
+ "</script>\n",
556
+ "<!-- End Google Analytics -->\n";
557
+
558
+ }
559
+ }
560
+ }
561
+
562
+ /**
563
+ *
564
+ * Replace snippets method for self::
565
+ *
566
+ * - %_site_title_% : サイトのタイトル
567
+ * - %_phrase_% : サイトのキャッチフレーズ
568
+ * - %_site_description_% : サイトの説明文
569
+ * - %_page_title_% : 投稿タイトル
570
+ * - %_description_% : 投稿タイトル
571
+ * - %_cat_name_% : カテゴリ名
572
+ * - %_tag_name_% : タグ名
573
+ * - %_term_name_% : ターム名
574
+ * - %_tax_name_% : タクソノミー名
575
+ * - %_search_phrase_% : 検索ワード
576
+ * - %_post_type_% : 投稿タイプ
577
+ * - %_format_name_% : 投稿フォーマット名
578
+ * - %_date_% : Y年M月D日
579
+ * - %_author_name_% : 著者名ニックネーム
580
+ * - %_sep_% : 区切り文字
581
+ *
582
+ */
583
+ private static function replace_snippets ( $str ) {
584
+
585
+ $obj = self::$obj;
586
+ $obj_post_title = ( isset( $obj->post_title ) ) ? $obj->post_title : "";
587
+ $obj_cat_name = ( isset( $obj->cat_name ) ) ? $obj->cat_name : "";
588
+ $obj_name = ( isset( $obj->name ) ) ? $obj->name : "";
589
+ $obj_label = ( isset( $obj->label ) ) ? $obj->label : "";
590
+
591
+ $str = str_replace ( '%_site_title_%', SSP_Data::$site_title, $str );
592
+ $str = str_replace ( '%_phrase_%', SSP_Data::$site_catch_phrase, $str );
593
+ $str = str_replace ( '%_description_%', SSP_Data::$settings[ 'home_desc' ], $str );
594
+ $str = str_replace ( '%_page_title_%', $obj_post_title, $str );
595
+ $str = str_replace ( '%_cat_name_%', $obj_cat_name, $str );
596
+ $str = str_replace ( '%_tag_name_%', $obj_name, $str );
597
+ $str = str_replace ( '%_term_name_%', $obj_name, $str );
598
+ $str = str_replace ( '%_post_type_%', $obj_label, $str );
599
+ $str = str_replace ( '%_format_name_%', $obj_name, $str );
600
+
601
+
602
+ if ( strpos( $str, '%_tax_name_%' ) !== false ) {
603
+
604
+ $taxonomy_slug = ( isset( $obj->taxonomy ) ) ? $obj->taxonomy : "";
605
+ $taxonomy_var = get_taxonomy($taxonomy_slug);
606
+ $taxonomy_label = ( $taxonomy_var ) ? $taxonomy_var->label : "";
607
+
608
+ $str = str_replace ( '%_tax_name_%', $taxonomy_label, $str );
609
+ }
610
+
611
+ if ( strpos( $str, '%_page_contents_%' ) !== false ) {
612
+
613
+ $content = $obj->post_content;
614
+ $content = strip_tags( mb_substr( $content, 0, 120 ) );
615
+ $content = preg_replace( '/(\\n)*(&nbsp;)*/', "", $content );
616
+
617
+ $str = str_replace ( '%_page_contents_%', $content, $str );
618
+
619
+ }
620
+
621
+ if ( strpos( $str, '%_date_%' ) !== false ) {
622
+
623
+ $date = "";
624
+ if ( is_day() ) {
625
+ $date = get_query_var( 'year' )."年".get_query_var( 'monthnum' )."月".get_query_var( 'day' )."日";
626
+ }
627
+ elseif ( is_month() ) {
628
+ $date = get_query_var( 'year' )."年".get_query_var( 'monthnum' )."月";
629
+ }
630
+ elseif ( is_year() ) {
631
+ $date = get_query_var( 'year' )."年";
632
+ }
633
+
634
+ $str = str_replace ('%_date_%', $date, $str);
635
+
636
+ }
637
+
638
+ if ( strpos( $str, '%_author_name_%' ) !== false ) {
639
+
640
+ $str = str_replace ( '%_author_name_%', get_user_meta( 1, 'nickname', true ), $str );
641
+
642
+ }
643
+
644
+ if ( strpos( $str, '%_search_phrase_%' ) !== false ) {
645
+
646
+ $str = str_replace ( '%_search_phrase_%', get_search_query(), $str );
647
+
648
+ }
649
+
650
+ if ( strpos( $str, '%_sep_%' ) !== false ) {
651
+
652
+ $sep_key = SSP_Data::$settings[ 'separator' ];
653
+ $sep_val = SSP_Data::SEPARATOR_LIST[$sep_key];
654
+ $str = str_replace( '%_sep_%', $sep_val, $str );
655
+
656
+ }
657
+
658
+ return $str;
659
+ }
660
+
661
+ }
inc/page_help.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="ssp_wrap" class="wrapp">
2
+ <h1 id="ssp_title">ヘルプページ</h1>
3
+
4
+ <div id="poststuff">
5
+ <div class="ssp_help_page">
6
+ 使用可能なスニペットタグについて<br>
7
+ <?php
8
+ $tags = [
9
+ 'site_title' => 'サイトのタイトル',
10
+ 'phrase' => 'サイトのキャッチフレーズ',
11
+ 'description' => 'ホームのディスクリプション',
12
+ 'page_title' => '投稿のタイトル( get_the_title() で取得できる内容が入ります )',
13
+ 'cat_name' => 'カテゴリー名',
14
+ 'tag_name' => 'タグ名',
15
+ 'term_name' => 'ターム名',
16
+ 'tax_name' => 'タクソノミー名',
17
+ 'post_type' => '投稿タイプ名',
18
+ 'page_contents' => 'ページコンテンツ ( get_the_content() で取得できる内容を元にした内容が入ります )',
19
+ 'date' => '日付アーカイブで検索中の日付',
20
+ 'author_name' => '著者名( ニックネーム )',
21
+ 'search_phrase' => '検索ワード',
22
+ 'format_name' => '投稿フォーマット名',
23
+
24
+ 'sep' => '区切り文字',
25
+ ];
26
+ ?>
27
+ <table class="ssp_help_table">
28
+ <thead>
29
+ <tr>
30
+ <th>
31
+ スニペットタグ
32
+ </th>
33
+ <th>
34
+ 展開される内容
35
+ </th>
36
+ </tr>
37
+ </thead>
38
+ <tbody>
39
+ <?php
40
+ foreach ($tags as $key => $val) {
41
+ echo '<tr><th>%_', $key, '_%</th><td>', $val, '</td></tr>';
42
+ }
43
+ ?>
44
+ </tbody>
45
+ </table>
46
+ </div>
47
+ </div>
48
+ </div>
49
+
50
+
inc/page_ogp.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $is_updated = false;
3
+
4
+ if ( $_SERVER['REQUEST_METHOD'] === 'POST' && !empty( $_POST ) ) {
5
+
6
+ //$_POSTの無害化
7
+ $P = SSP_Methods::sanitize_post_data( $_POST );
8
+
9
+ //DBアップデート処理
10
+ SSP_Methods::update_db( $P );
11
+
12
+ $is_updated = true;
13
+
14
+ //クラスインスタンス更新
15
+ SSP_Data::$ogp = get_option( SSP_Data::DB_NAME[ 'ogp' ] );
16
+
17
+ }
18
+
19
+ $ssp_tab = SSP_Menu::OGP_MENU_TABS;
20
+ ?>
21
+ <div id="ssp_wrap" class="wrapp">
22
+
23
+ <h1 id="ssp_title">SEO OGPタグ設定</h1>
24
+ <?php
25
+ if ( $is_updated ) {
26
+ echo '<div id="ssp_updated" class="updated notice is-dismissible">',
27
+ '<p><strong>設定を更新しました。</strong></p>',
28
+ '<button type="button" class="notice-dismiss">',
29
+ '<span class="screen-reader-text">この通知を非表示にする</span>',
30
+ '</button>',
31
+ '</div>';
32
+ }
33
+ ?>
34
+ <div id="ssp-tabs" class="nav-tab-wrapper">
35
+ <?php
36
+ foreach ( $ssp_tab as $key => $val ) {
37
+
38
+ $nav_class = ( $val === reset( $ssp_tab ) ) ? "nav-tab act_" : "nav-tab";
39
+ echo '<a href="#', $key, '" class="', $nav_class, '">', $val, '</a>';
40
+
41
+ }
42
+ ?>
43
+ </div>
44
+ <div id="poststuff">
45
+ <form action="" method="post" id="ssp_form" accept-charset="UTF-8">
46
+ <?php
47
+ foreach ( $ssp_tab as $key => $val ) {
48
+
49
+ $tab_class = ( $val === reset( $ssp_tab ) ) ? "tab-contents act_" : "tab-contents";
50
+ echo '<div id="', $key, '" class="', $tab_class, '">';
51
+
52
+ //タブコンテンツ用ファイルの読み込み
53
+ if ( file_exists( SSP_PATH.'inc/parts/tab_'.$key.'.php' ) ) {
54
+
55
+ require_once SSP_PATH.'inc/parts/tab_'.$key.'.php';
56
+
57
+ }
58
+
59
+ echo '</div>';
60
+ }
61
+ ?>
62
+ <input type="hidden" name="db_name" value="<?php echo esc_attr( SSP_Data::DB_NAME['ogp'] ); ?>">
63
+ <?php wp_nonce_field( SSP_Data::NOUNCE_ACTION, SSP_Data::NOUNCE_NAME ); ?>
64
+ <button type="submit" class="button button-primary">設定を保存する</button>
65
+ </form>
66
+ </div>
67
+ </div>
68
+
69
+
inc/page_top.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $is_updated = false;
3
+
4
+ if ( $_SERVER['REQUEST_METHOD'] === 'POST' && !empty( $_POST ) ) {
5
+
6
+ //$_POSTの無害化
7
+ $P = SSP_Methods::sanitize_post_data( $_POST );
8
+
9
+ //DBアップデート処理
10
+ SSP_Methods::update_db( $P );
11
+
12
+ $is_updated = true;
13
+
14
+ //クラスインスタンス更新
15
+ SSP_Data::$settings = get_option( SSP_Data::DB_NAME[ 'settings' ] );
16
+
17
+ }
18
+
19
+ $ssp_tab = SSP_Menu::TOP_MENU_TABS;
20
+ ?>
21
+ <div id="ssp_wrap" class="wrapp">
22
+
23
+ <h1 id="ssp_title">SEO SIMPLE PACK 一般設定</h1>
24
+ <?php
25
+ if ( $is_updated ) {
26
+ echo '<div id="ssp_updated" class="updated notice is-dismissible">',
27
+ '<p><strong>設定を更新しました。</strong></p>',
28
+ '<button type="button" class="notice-dismiss">',
29
+ '<span class="screen-reader-text">この通知を非表示にする</span>',
30
+ '</button>',
31
+ '</div>';
32
+ }
33
+ ?>
34
+ <div id="ssp-tabs" class="nav-tab-wrapper">
35
+ <?php
36
+ foreach ( $ssp_tab as $key => $val ) {
37
+
38
+ $nav_class = ( $val === reset( $ssp_tab ) ) ? "nav-tab act_" : "nav-tab";
39
+ echo '<a href="#', $key, '" class="', $nav_class, '">', $val, '</a>';
40
+
41
+ }
42
+ ?>
43
+ </div>
44
+ <div id="poststuff">
45
+ <form action="" method="post" id="ssp_form" accept-charset="UTF-8">
46
+ <?php
47
+ foreach ( $ssp_tab as $key => $val ) {
48
+
49
+ $tab_class = ( $val === reset( $ssp_tab ) ) ? "tab-contents act_" : "tab-contents";
50
+ echo '<div id="', $key, '" class="', $tab_class, '">';
51
+
52
+ //タブコンテンツ用ファイルの読み込み
53
+ if ( file_exists( SSP_PATH.'inc/parts/tab_'.$key.'.php' ) ) {
54
+
55
+ require_once SSP_PATH.'inc/parts/tab_'.$key.'.php';
56
+
57
+ }
58
+
59
+ echo '</div>';
60
+ }
61
+ ?>
62
+ <input type="hidden" name="db_name" value="<?php echo esc_attr( SSP_Data::DB_NAME['settings'] ); ?>">
63
+ <?php wp_nonce_field( SSP_Data::NOUNCE_ACTION, SSP_Data::NOUNCE_NAME ); ?>
64
+ <button type="submit" class="button button-primary">設定を保存する</button>
65
+ </form>
66
+ </div>
67
+ </div>
68
+
69
+
inc/parts/tab_analytics.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="postbox">
2
+ <h2 class="hndle">
3
+ <span>Googleアナリティクス設定</span>
4
+ </h2>
5
+ <div class="inside">
6
+ <table class="form-table">
7
+ <tbody>
8
+ <tr valign="top">
9
+ <th scope="row">
10
+ <label for="google_analytics_type">コードタイプ</label>
11
+ </th>
12
+ <td>
13
+ <select name="google_analytics_type" id="google_analytics_type">
14
+ <?php
15
+ if( SSP_Data::$settings[ 'google_analytics_type' ] === "gtag") {
16
+ echo '<option value="gtag" selected>gtag.jsでコードを埋め込む</option>
17
+ <option value="analytics">analytics.jsでコードを埋め込む</option>';
18
+ } else {
19
+ echo '<option value="gtag">gtag.jsでコードを埋め込む</option>
20
+ <option value="analytics" selected>analytics.jsでコードを埋め込む</option>';
21
+ }
22
+ ?>
23
+ </select>
24
+ <p class="ssp_desc">
25
+ Googleアナリティクスのトラッキングコードを、新しい<code>gtag.js</code>でのコードで埋め込むか、古い<code>analytics.js</code>によるコードで埋め込むかを選択できます。<br>
26
+ 特に理由がなければ、gtag.jsを推奨します。
27
+ </p>
28
+ </td>
29
+ </tr>
30
+
31
+ <tr valign="top">
32
+ <th scope="row">
33
+ <label for="google_analytics_id">トラッキング ID</label>
34
+ </th>
35
+ <td>
36
+ <input type="text" name="google_analytics_id" id="google_analytics_id" value="<?php echo esc_attr( SSP_Data::$settings[ 'google_analytics_id' ] ); ?>">
37
+ <p class="ssp_desc">
38
+ GoogleアナリティクスのトラッキングID( <code>UA-XXXXX-Y</code> )を入力して下さい。
39
+ </p>
40
+ </td>
41
+ </tr>
42
+ </tbody>
43
+ </table>
44
+ </div>
45
+ </div>
inc/parts/tab_archive.php ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="postbox">
2
+ <h2 class="hndle">
3
+ <span>「著者アーカイブ」の標準設定</span>
4
+ </h2>
5
+ <div class="inside">
6
+ <table class="form-table">
7
+ <tbody>
8
+ <?php $table_rows = [
9
+ 'author_disable' => [
10
+ 'title' => '「著者アーカイブ」を使用しない',
11
+ 'class' => '',
12
+ 'item' => '',
13
+ 'reqired' => false,
14
+ 'is_checkbox' => true,
15
+ 'prev' => false,
16
+ 'desc' => '「はい」を選択すると「著者アーカイブ」へアクセスしてもトップページへリダイレクトされます。',
17
+ ],
18
+ 'author_noindex' => [
19
+ 'title' => '「著者アーカイブ」をインデックスさせない',
20
+ 'class' => '',
21
+ 'item' => '',
22
+ 'reqired' => false,
23
+ 'is_checkbox' => true,
24
+ 'prev' => false,
25
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
26
+ ],
27
+ 'author_title' => [
28
+ 'title' => 'タイトルタグの形式',
29
+ 'class' => '',
30
+ 'item' => '',
31
+ 'reqired' => false,
32
+ 'is_checkbox' => false,
33
+ 'prev' => true,
34
+ 'desc' => '「著者アーカイブ」ページに出力する <code>&lt;title&gt;</code> タグの設定です。',
35
+ ],
36
+ 'author_desc' => [
37
+ 'title' => 'ディスクリプションの形式',
38
+ 'class' => 'sep',
39
+ 'item' => '',
40
+ 'reqired' => false,
41
+ 'is_checkbox' => false,
42
+ 'prev' => true,
43
+ 'desc' => '「著者アーカイブ」ページに出力する <code>meta:description</code> の設定です。',
44
+ ],
45
+ ];
46
+ SSP_Methods::output_table_rows( $table_rows ); ?>
47
+ </tbody>
48
+ </table>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="postbox">
53
+ <h2 class="hndle">
54
+ <span>「日付アーカイブ」の標準設定</span>
55
+ </h2>
56
+ <div class="inside">
57
+ <table class="form-table">
58
+ <tbody>
59
+ <?php $table_rows = [
60
+ 'date_noindex' => [
61
+ 'title' => '「日付アーカイブ」をインデックスさせない',
62
+ 'class' => '',
63
+ 'item' => '',
64
+ 'reqired' => false,
65
+ 'is_checkbox' => true,
66
+ 'prev' => false,
67
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
68
+ ],
69
+ 'date_title' => [
70
+ 'title' => 'タイトルタグの形式',
71
+ 'class' => '',
72
+ 'item' => '',
73
+ 'reqired' => false,
74
+ 'is_checkbox' => false,
75
+ 'prev' => true,
76
+ 'desc' => '「日付アーカイブ」ページに出力する <code>&lt;title&gt;</code> タグの設定です。',
77
+ ],
78
+ 'date_desc' => [
79
+ 'title' => 'ディスクリプションの形式',
80
+ 'class' => 'sep',
81
+ 'item' => '',
82
+ 'reqired' => false,
83
+ 'is_checkbox' => false,
84
+ 'prev' => true,
85
+ 'desc' => '「日付アーカイブ」ページに出力する <code>meta:description</code> の設定です。',
86
+ ],
87
+ ];
88
+ SSP_Methods::output_table_rows( $table_rows ); ?>
89
+ </tbody>
90
+ </table>
91
+ </div>
92
+ </div>
93
+
94
+
95
+ <div class="postbox">
96
+ <h2 class="hndle">
97
+ <span>「カスタム投稿アーカイブ」の標準設定</span>
98
+ </h2>
99
+ <div class="inside">
100
+ <table class="form-table">
101
+ <tbody>
102
+ <?php $table_rows = [
103
+ 'pt_archive_noindex' => [
104
+ 'title' => '「カスタム投稿アーカイブ」をインデックスさせない',
105
+ 'class' => '',
106
+ 'item' => '',
107
+ 'reqired' => false,
108
+ 'is_checkbox' => true,
109
+ 'prev' => false,
110
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
111
+ ],
112
+ 'pt_archive_title' => [
113
+ 'title' => 'タイトルタグの形式',
114
+ 'class' => '',
115
+ 'item' => '',
116
+ 'reqired' => false,
117
+ 'is_checkbox' => false,
118
+ 'prev' => true,
119
+ 'desc' => '「カスタム投稿アーカイブ」ページに出力する <code>&lt;title&gt;</code> タグの設定です。',
120
+ ],
121
+ 'pt_archive_desc' => [
122
+ 'title' => 'ディスクリプションの形式',
123
+ 'class' => 'sep',
124
+ 'item' => '',
125
+ 'reqired' => false,
126
+ 'is_checkbox' => false,
127
+ 'prev' => true,
128
+ 'desc' => '「カスタム投稿アーカイブ」ページに出力する <code>meta:description</code> の設定です。',
129
+ ],
130
+ ];
131
+ SSP_Methods::output_table_rows( $table_rows ); ?>
132
+ </tbody>
133
+ </table>
134
+ <p class="ssp_note">
135
+ 注意:カスタム投稿タイプの登録時、アーカイブを有効にする設定をしていない場合はそもそもアーカイブURLは発行されていないので注意して下さい。<br>
136
+ 例えば、「<a href="https://ja.wordpress.org/plugins/custom-post-type-ui/" target="_blank">CPT UI</a>」でカスタム投稿タイプを追加している場合、「アーカイブあり」が <code>true</code> に設定されている必要があります。
137
+ </p>
138
+ </div>
139
+ </div>
inc/parts/tab_basic.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="postbox">
2
+ <h2 class="hndle">
3
+ <span>基本設定</span>
4
+ </h2>
5
+ <div class="inside">
6
+ <table class="form-table">
7
+ <tbody>
8
+ <?php $table_rows = [
9
+ 'site_title' => [
10
+ 'title'=>'サイトタイトル(確認用)',
11
+ 'reqired' => false,
12
+ 'class' => '',
13
+ 'is_checkbox' => false,
14
+ 'item' => '<input type="text" name="" value="'.esc_attr( SSP_Data::$site_title ).'" disabled>',
15
+ 'prev' => false,
16
+ 'desc' => '「<a href="'.admin_url().'options-general.php" target="_blanc">一般設定</a>」 -> 「サイトのタイトル」の値です。<br><code>%_site_title_%</code> として扱われます。',
17
+ ],
18
+ 'site_catch_phrase' => [
19
+ 'title'=>'サイトキャッチフレーズ(確認用)',
20
+ 'reqired' => false,
21
+ 'class' => '',
22
+ 'is_checkbox' => false,
23
+ 'item' => '<input type="text" name="" value="'.esc_attr( SSP_Data::$site_catch_phrase ).'" disabled>',
24
+ 'prev' => false,
25
+ 'desc' => '「<a href="'.admin_url().'options-general.php" target="_blanc">一般設定</a>」 -> 「キャッチフレーズ」の値です。<br><code>%_phrase_%</code> として扱われます。',
26
+ ],
27
+ 'home_title' => [
28
+ 'title'=>'ホームタイトル',
29
+ 'reqired' => false,
30
+ 'class' => '',
31
+ 'is_checkbox' => false,
32
+ 'item' => '',
33
+ 'prev' => true,
34
+ 'desc' => 'ホームページに出力する <code>&lt;title&gt;</code> タグの設定です。',
35
+ ],
36
+ 'separator' => [
37
+ 'title'=>'区切り文字',
38
+ 'reqired' => false,
39
+ 'class' => 'sep',
40
+ 'is_checkbox' => false,
41
+ 'item' => '',
42
+ 'prev' => false,
43
+ 'desc' => 'ここで選択した 区切り文字 は <code>%_sep_%</code> として扱われます。',
44
+ ],
45
+ 'home_desc' => [
46
+ 'title'=>'ホームページの説明',
47
+ 'reqired' => false,
48
+ 'class' => 'textarea',
49
+ 'is_checkbox' => false,
50
+ 'item' => '<textarea name="home_desc">'.esc_html( SSP_Data::$settings['home_desc'] ).'</textarea>',
51
+ 'prev' => false,
52
+ 'desc' => 'ホーム の <code>meta:description</code> タグの設定です。<br>入力内容が空の場合、「キャッチフレーズ」の内容が優先されます。<br>また、ここで入力された内容は <code>%_description_%</code> として扱われます。',
53
+ ],
54
+ 'home_keyword' => [
55
+ 'title'=>'キーワード',
56
+ 'reqired' => false,
57
+ 'class' => '',
58
+ 'is_checkbox' => false,
59
+ 'item' => '',
60
+ 'prev' => false,
61
+ 'desc' => '「キーワードを使用する場合は入力してください。<br>* 複数の場合は , 区切りで入力してください。',
62
+ ],
63
+ ];
64
+
65
+ //特殊なもの
66
+ foreach ( SSP_Data::SEPARATOR_LIST as $key => $sep ) {
67
+
68
+ $checked = ( $key === SSP_Data::$settings['separator'] ) ? 'checked' : '' ;
69
+
70
+ $table_rows['separator']['item'] .= '<input '.
71
+ 'type="radio" '.
72
+ 'class="sep_radio" '.
73
+ 'id="separator-'.$key.'" '.
74
+ 'name="separator" '.
75
+ 'value="'.$key.'" '.$checked.'>'
76
+ .'<label class="sep_radio" for="separator-'.$key.'">'.$sep.'</label>';
77
+ }
78
+ SSP_Methods::output_table_rows( $table_rows ); ?>
79
+ </tbody>
80
+ </table>
81
+ </div>
82
+ </div>
83
+
84
+ <div class="postbox">
85
+ <h2 class="hndle">
86
+ <span>特殊ページ設定</span>
87
+ </h2>
88
+ <div class="inside">
89
+ <table class="form-table">
90
+ <tbody>
91
+ <?php $table_rows = [
92
+ 'search_title' => [
93
+ 'title'=>'検索結果ページタイトル',
94
+ 'reqired' => false,
95
+ 'class' => '',
96
+ 'is_checkbox' => false,
97
+ 'item' => '',
98
+ 'prev' => true,
99
+ 'desc' => '検索結果ページ に出力する <code>&lt;title&gt;</code> タグの設定です。',
100
+ ],
101
+ '404_title' => [
102
+ 'title'=>'404ページタイトル',
103
+ 'reqired' => false,
104
+ 'class' => '',
105
+ 'is_checkbox' => false,
106
+ 'item' => '',
107
+ 'prev' => true,
108
+ 'desc' => '404ページ に出力する <code>&lt;title&gt;</code> タグの設定です。',
109
+ ],
110
+ ];
111
+ SSP_Methods::output_table_rows( $table_rows ); ?>
112
+ </tbody>
113
+ </table>
114
+ </div>
115
+ </div>
inc/parts/tab_facebook.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="postbox">
2
+ <h2 class="hndle">
3
+ <span>Facebook設定</span>
4
+ </h2>
5
+ <div class="inside">
6
+ <table class="form-table">
7
+ <tbody>
8
+ <?php $table_rows = [
9
+ 'fb_active' => [
10
+ 'title' =>'Facebook用設定を使用する',
11
+ 'reqired' => false,
12
+ 'is_checkbox' => true,
13
+ 'prev' => false,
14
+ 'class' => '',
15
+ 'item' => '',
16
+ 'desc' => 'Facebook用のOGPタグを出力するかどうかの設定です。',
17
+ ],
18
+ 'fb_url' => [
19
+ 'title' => 'Facebookページ URL',
20
+ 'reqired' => false,
21
+ 'is_checkbox' => false,
22
+ 'prev' => false,
23
+ 'class' => '',
24
+ 'item' => '',
25
+ 'desc' => 'FacebookページのURLを入力してください。 <code>article:publisher</code> に反映されます',
26
+ ],
27
+ 'fb_app_id' => [
28
+ 'title' => 'fb:app_id',
29
+ 'reqired' => false,
30
+ 'is_checkbox' => false,
31
+ 'prev' => false,
32
+ 'class' => '',
33
+ 'item' => '',
34
+ 'desc' => 'FacebookアプリID を入力してください。',
35
+ ],
36
+ 'fb_admins' => [
37
+ 'title' => 'fb:admins',
38
+ 'reqired' => false,
39
+ 'is_checkbox' => false,
40
+ 'prev' => false,
41
+ 'class' => '',
42
+ 'item' => '',
43
+ 'desc' => 'アプリ管理者の FacebookID を入力してください。',
44
+ ],
45
+ ];
46
+
47
+ SSP_Methods::output_table_rows( $table_rows, "ogp" ); ?>
48
+ </tbody>
49
+ </table>
50
+ </div>
51
+ </div>
inc/parts/tab_ogp.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <div class="postbox">
3
+ <h2 class="hndle">
4
+ <span>OGPタグ 基本設定</span>
5
+ </h2>
6
+ <div class="inside">
7
+ <table class="form-table">
8
+ <tbody>
9
+ <tr valign="top">
10
+ <th scope="row">
11
+ <label for="singular_label">og:image 画像</label>
12
+ </th>
13
+ <td>
14
+ <input type="hidden" name="og_image" id="media_url" value="<?php echo esc_attr( SSP_Data::$ogp['og_image'] ); ?>" />
15
+ <div id="media_preview">
16
+ <?php
17
+ if ( SSP_Data::$ogp['og_image'] ) {
18
+ echo '<img src="', esc_url( SSP_Data::$ogp['og_image'] ), '" alt="preview">';
19
+ } else {
20
+ echo '<img src="', plugins_url( 'assets/img/noimg.gif', SSP_FILE ), '" alt="no image">';
21
+ }
22
+ ?>
23
+ </div>
24
+ <button type="button" name="media_btn" id="media_btn" class="button button-primary">画像の選択</button>
25
+ <button type="button" name="crear_btn" id="crear_btn" class="button">クリア</button>
26
+ <p class="ssp_desc">
27
+ Facebookでは画像サイズに1200×630pxを推奨しています。<br>
28
+ 投稿ページ(投稿・固定ページ・カスタム投稿タイプ)では、アイキャッチ画像が優先されます。
29
+ </p>
30
+ </td>
31
+ </tr>
32
+ </tbody>
33
+ </table>
34
+ </div>
35
+ </div>
inc/parts/tab_post_type.php ADDED
@@ -0,0 +1,198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="postbox">
2
+ <h2 class="hndle">
3
+ <span>「投稿」の標準設定</span>
4
+ </h2>
5
+ <div class="inside">
6
+ <table class="form-table">
7
+ <tbody>
8
+ <?php $table_rows = [
9
+ 'post_noindex' => [
10
+ 'title'=>'「投稿」をインデックスさせない',
11
+ 'reqired' => false,
12
+ 'class' => '',
13
+ 'is_checkbox' => true,
14
+ 'item' => '',
15
+ 'prev' => false,
16
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
17
+ ],
18
+ 'post_title' => [
19
+ 'title'=>'タイトルタグの形式',
20
+ 'reqired' => false,
21
+ 'class' => '',
22
+ 'is_checkbox' => false,
23
+ 'item' => '',
24
+ 'prev' => true,
25
+ 'desc' => '「投稿」( <code>post</code> )の個別ページに出力する <code>&lt;title&gt;</code> タグの設定です。',
26
+ ],
27
+ 'post_desc' => [
28
+ 'title'=>'ディスクリプションの形式',
29
+ 'reqired' => false,
30
+ 'class' => 'sep',
31
+ 'is_checkbox' => false,
32
+ 'item' => '',
33
+ 'prev' => true,
34
+ 'desc' => '「投稿」( <code>post</code> )の個別ページに出力する <code>meta:description</code> の設定です。',
35
+ ],
36
+ ];
37
+ SSP_Methods::output_table_rows( $table_rows ); ?>
38
+ </tbody>
39
+ </table>
40
+ </div>
41
+ </div>
42
+
43
+ <div class="postbox">
44
+ <h2 class="hndle">
45
+ <span>「固定ページ」の標準設定</span>
46
+ </h2>
47
+ <div class="inside">
48
+ <table class="form-table">
49
+ <tbody>
50
+ <?php $table_rows = [
51
+ 'page_noindex' => [
52
+ 'title'=>'「固定ページ」をインデックスさせない',
53
+ 'reqired' => false,
54
+ 'class' => '',
55
+ 'is_checkbox' => true,
56
+ 'item' => '',
57
+ 'prev' => false,
58
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
59
+ ],
60
+ 'page_title' => [
61
+ 'title'=>'タイトルタグの形式',
62
+ 'reqired' => false,
63
+ 'class' => '',
64
+ 'is_checkbox' => false,
65
+ 'item' => '',
66
+ 'prev' => true,
67
+ 'desc' => '「固定ページ」( <code>page</code> )の個別ページに出力する <code>&lt;title&gt;</code> タグの設定です。',
68
+ ],
69
+ 'page_desc' => [
70
+ 'title'=>'ディスクリプションの形式',
71
+ 'reqired' => false,
72
+ 'class' => 'sep',
73
+ 'is_checkbox' => false,
74
+ 'item' => '',
75
+ 'prev' => true,
76
+ 'desc' => '「固定ページ」( <code>page</code> )の個別ページに出力する <code>meta:description</code> の設定です。',
77
+ ],
78
+ ];
79
+ SSP_Methods::output_table_rows( $table_rows ); ?>
80
+ </tbody>
81
+ </table>
82
+ </div>
83
+ </div>
84
+
85
+
86
+
87
+ <div class="postbox">
88
+ <h2 class="hndle">
89
+ <span>カスタム投稿タイプ</span>
90
+ </h2>
91
+ <div class="inside">
92
+ <?php
93
+ //カスタム投稿タイプを取得
94
+ $args = array(
95
+ 'public' => true,
96
+ '_builtin' => false
97
+ );
98
+
99
+ $output = 'objects'; // names or objects, note names is the default
100
+ $operator = 'and'; // 'and' or 'or'
101
+
102
+ $post_types = get_post_types( $args, $output, $operator );
103
+
104
+ //SSP_Methods::dump($post_types,"カスタム投稿タイプ");
105
+
106
+ foreach ( $post_types as $obj ){
107
+
108
+ echo '<table class="form-table"><tbody>';
109
+
110
+ $table_rows = [
111
+ $obj->name.'_noindex' => [
112
+ 'title'=>'「'.$obj->label.'」をインデックスさせない',
113
+ 'reqired' => false,
114
+ 'class' => '',
115
+ 'is_checkbox' => true,
116
+ 'item' => '',
117
+ 'prev' => false,
118
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
119
+ ],
120
+ $obj->name.'_title' => [
121
+ 'title'=>'タイトルタグの形式',
122
+ 'reqired' => false,
123
+ 'class' => '',
124
+ 'is_checkbox' => false,
125
+ 'item' => '',
126
+ 'prev' => true,
127
+ 'desc' => '「'.$obj->label.'」( <code>'.$obj->name.'</code> )の個別ページに出力する <code>&lt;title&gt;</code> タグの設定です。',
128
+ ],
129
+ $obj->name.'_desc' => [
130
+ 'title'=>'ディスクリプションの形式',
131
+ 'reqired' => false,
132
+ 'class' => 'sep',
133
+ 'is_checkbox' => false,
134
+ 'item' => '',
135
+ 'prev' => true,
136
+ 'desc' => '「'.$obj->label.'」( <code>'.$obj->name.'</code> )の個別ページに出力する <code>meta:description</code> の設定です。',
137
+ ],
138
+ ];
139
+ SSP_Methods::output_table_rows($table_rows );
140
+
141
+ echo '</tbody></table>';
142
+ }
143
+ ?>
144
+
145
+ </div>
146
+ </div>
147
+
148
+
149
+ <div class="postbox">
150
+ <h2 class="hndle">
151
+ <span>「メディア」の標準設定</span>
152
+ </h2>
153
+ <div class="inside">
154
+ <table class="form-table">
155
+ <tbody>
156
+ <?php $table_rows = [
157
+ 'media_disable' => [
158
+ 'title'=>'「メディア」を使用しない',
159
+ 'reqired' => false,
160
+ 'class' => '',
161
+ 'is_checkbox' => true,
162
+ 'item' => '',
163
+ 'prev' => false,
164
+ 'desc' => '「はい」を選択すると「メディア」の個別ページへアクセスしても画像URLへとリダイレクトされます。',
165
+ ],
166
+ 'media_noindex' => [
167
+ 'title'=>'「メディア」をインデックスさせない',
168
+ 'reqired' => false,
169
+ 'class' => '',
170
+ 'is_checkbox' => true,
171
+ 'item' => '',
172
+ 'prev' => false,
173
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
174
+ ],
175
+ 'media_title' => [
176
+ 'title'=>'タイトルタグの形式',
177
+ 'reqired' => false,
178
+ 'class' => '',
179
+ 'is_checkbox' => false,
180
+ 'item' => '',
181
+ 'prev' => true,
182
+ 'desc' => '「メディア」( <code>attachment</code> )の個別ページに出力する <code>&lt;title&gt;</code> タグの設定です。',
183
+ ],
184
+ 'media_desc' => [
185
+ 'title'=>'ディスクリプションの形式',
186
+ 'reqired' => false,
187
+ 'class' => 'sep',
188
+ 'is_checkbox' => false,
189
+ 'item' => '',
190
+ 'prev' => true,
191
+ 'desc' => '「メディア」( <code>attachment</code> )の個別ページに出力する <code>meta:description</code> の設定です。',
192
+ ],
193
+ ];
194
+ SSP_Methods::output_table_rows($table_rows ); ?>
195
+ </tbody>
196
+ </table>
197
+ </div>
198
+ </div>
inc/parts/tab_taxonomy.php ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="postbox">
2
+ <h2 class="hndle">
3
+ <span>「カテゴリーアーカイブ」の標準設定</span>
4
+ </h2>
5
+ <div class="inside">
6
+ <table class="form-table">
7
+ <tbody>
8
+ <?php $table_rows = [
9
+
10
+ 'cat_noindex' => [
11
+ 'title'=>'「カテゴリーアーカイブ」をインデックスさせない',
12
+ 'reqired' => false,
13
+ 'class' => '',
14
+ 'is_checkbox' => true,
15
+ 'item' => '',
16
+ 'prev' => false,
17
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
18
+ ],
19
+ 'cat_title' => [
20
+ 'title'=>'タイトルタグの形式',
21
+ 'reqired' => false,
22
+ 'class' => '',
23
+ 'is_checkbox' => false,
24
+ 'item' => '',
25
+ 'prev' => true,
26
+ 'desc' => '「カテゴリーアーカイブ」に出力する <code>&lt;title&gt;</code> タグの設定です。',
27
+ ],
28
+ 'cat_desc' => [
29
+ 'title'=>'ディスクリプションの形式',
30
+ 'reqired' => false,
31
+ 'class' => 'sep',
32
+ 'is_checkbox' => false,
33
+ 'item' => '',
34
+ 'prev' => true,
35
+ 'desc' => '「カテゴリーアーカイブ」に出力する <code>meta:description</code> の設定です。',
36
+ ],
37
+ ];
38
+ SSP_Methods::output_table_rows( $table_rows ); ?>
39
+ </tbody>
40
+ </table>
41
+ </div>
42
+ </div>
43
+
44
+ <div class="postbox">
45
+ <h2 class="hndle">
46
+ <span>「タグアーカイブ」の標準設定</span>
47
+ </h2>
48
+ <div class="inside">
49
+ <table class="form-table">
50
+ <tbody>
51
+ <?php $table_rows = [
52
+
53
+ 'tag_noindex' => [
54
+ 'title'=>'「タグアーカイブ」をインデックスさせない',
55
+ 'reqired' => false,
56
+ 'class' => '',
57
+ 'is_checkbox' => true,
58
+ 'item' => '',
59
+ 'prev' => false,
60
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
61
+ ],
62
+ 'tag_title' => [
63
+ 'title'=>'タイトルタグの形式',
64
+ 'reqired' => false,
65
+ 'class' => '',
66
+ 'is_checkbox' => false,
67
+ 'item' => '',
68
+ 'prev' => true,
69
+ 'desc' => '「タグアーカイブ」に出力する <code>&lt;title&gt;</code> タグの設定です。',
70
+ ],
71
+ 'tag_desc' => [
72
+ 'title'=>'ディスクリプションの形式',
73
+ 'reqired' => false,
74
+ 'class' => 'sep',
75
+ 'is_checkbox' => false,
76
+ 'item' => '',
77
+ 'prev' => true,
78
+ 'desc' => '「タグアーカイブ」に出力する <code>meta:description</code> の設定です。',
79
+ ],
80
+ ];
81
+ SSP_Methods::output_table_rows( $table_rows ); ?>
82
+ </tbody>
83
+ </table>
84
+ </div>
85
+ </div>
86
+
87
+ <div class="postbox">
88
+ <h2 class="hndle">
89
+ <span>カスタムタクソノミー</span>
90
+ </h2>
91
+ <div class="inside">
92
+ <?php
93
+ //カスタム投稿タイプを取得
94
+ $args = array(
95
+ 'public' => true,
96
+ '_builtin' => false
97
+ );
98
+
99
+ $taxonomies = get_taxonomies( $args, 'objects', 'and' );
100
+
101
+ foreach ( $taxonomies as $obj ){
102
+
103
+ echo '<table class="form-table"><tbody>';
104
+
105
+ $table_rows = [
106
+ $obj->name.'_noindex' => [
107
+ 'title'=>'「'.$obj->label.'」をインデックスさせない',
108
+ 'reqired' => false,
109
+ 'class' => '',
110
+ 'is_checkbox' => true,
111
+ 'item' => '',
112
+ 'prev' => false,
113
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
114
+ ],
115
+ $obj->name.'_title' => [
116
+ 'title'=>'タイトルタグの形式',
117
+ 'reqired' => false,
118
+ 'class' => '',
119
+ 'is_checkbox' => false,
120
+ 'item' => '',
121
+ 'prev' => true,
122
+ 'desc' => '「'.$obj->label.'」( <code>'.$obj->name.'</code> )のアーカイブページに出力する <code>&lt;title&gt;</code> タグの設定です。',
123
+ ],
124
+ $obj->name.'_desc' => [
125
+ 'title'=>'ディスクリプションの形式',
126
+ 'reqired' => false,
127
+ 'class' => 'sep',
128
+ 'is_checkbox' => false,
129
+ 'item' => '',
130
+ 'prev' => true,
131
+ 'desc' => '「'.$obj->label.'」( <code>'.$obj->name.'</code> )のアーカイブページに出力する <code>meta:description</code> の設定です。',
132
+ ],
133
+ ];
134
+ SSP_Methods::output_table_rows( $table_rows );
135
+
136
+ echo '</tbody></table>';
137
+ }
138
+ ?>
139
+
140
+ </div>
141
+ </div>
142
+
143
+
144
+ <div class="postbox">
145
+ <h2 class="hndle">
146
+ <span>「投稿フォーマットアーカイブ」の標準設定</span>
147
+ </h2>
148
+ <div class="inside">
149
+ <table class="form-table">
150
+ <tbody>
151
+ <?php $table_rows = [
152
+ 'post_format_disable' => [
153
+ 'title'=>'「投稿フォーマットアーカイブ」を使用しない',
154
+ 'reqired' => false,
155
+ 'class' => '',
156
+ 'is_checkbox' => true,
157
+ 'item' => '',
158
+ 'prev' => false,
159
+ 'desc' => '「はい」を選択すると「投稿フォーマットアーカイブ」へアクセスしてもトップページへリダイレクトされます。',
160
+ ],
161
+
162
+ 'post_format_noindex' => [
163
+ 'title'=>'「投稿フォーマットアーカイブ」をインデックスさせない',
164
+ 'reqired' => false,
165
+ 'class' => '',
166
+ 'is_checkbox' => true,
167
+ 'item' => '',
168
+ 'prev' => false,
169
+ 'desc' => '「はい」を選択すると <code>noindex</code> となります。',
170
+ ],
171
+ 'post_format_title' => [
172
+ 'title'=>'タイトルタグの形式',
173
+ 'reqired' => false,
174
+ 'class' => '',
175
+ 'is_checkbox' => false,
176
+ 'item' => '',
177
+ 'prev' => true,
178
+ 'desc' => '「投稿フォーマットアーカイブ」に出力する <code>&lt;title&gt;</code> タグの設定です。',
179
+ ],
180
+ 'post_format_desc' => [
181
+ 'title'=>'ディスクリプションの形式',
182
+ 'reqired' => false,
183
+ 'class' => 'sep',
184
+ 'is_checkbox' => false,
185
+ 'item' => '',
186
+ 'prev' => true,
187
+ 'desc' => '「投稿フォーマットアーカイブ」に出力する <code>meta:description</code> の設定です。',
188
+ ],
189
+ ];
190
+ SSP_Methods::output_table_rows( $table_rows ); ?>
191
+ </tbody>
192
+ </table>
193
+ </div>
194
+ </div>
inc/parts/tab_twitter.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="postbox">
2
+ <h2 class="hndle">
3
+ <span>Twitter設定</span>
4
+ </h2>
5
+ <div class="inside">
6
+ <table class="form-table">
7
+ <tbody>
8
+ <?php $table_rows = [
9
+ 'tw_active' => [
10
+ 'title' =>'Twitter用設定を使用する',
11
+ 'reqired' => false,
12
+ 'is_checkbox' => true,
13
+ 'prev' => false,
14
+ 'class' => '',
15
+ 'item' => '',
16
+ 'desc' => 'Twitter用のOGPタグを出力するかどうかの設定です。',
17
+ ],
18
+ 'tw_account' => [
19
+ 'title' => 'Twitterアカウント名',
20
+ 'reqired' => false,
21
+ 'is_checkbox' => false,
22
+ 'prev' => false,
23
+ 'class' => '',
24
+ 'item' => '',
25
+ 'desc' => 'Twitterアカウント (@〇〇) を入力してください。',
26
+ ],
27
+ ];
28
+
29
+
30
+ SSP_Methods::output_table_rows( $table_rows, "ogp" ); ?>
31
+
32
+ <tr valign="top">
33
+ <th scope="row">
34
+ <label for="tw_card">カードタイプ</label>
35
+ </th>
36
+ <td>
37
+ <div class="inner">
38
+ <div class="ssp_item">
39
+ <select id="tw_card" name="tw_card">
40
+ <?php
41
+ $cards = ['summary', 'summary_large_image'];
42
+
43
+ foreach ($cards as $card) {
44
+ if ( SSP_Data::$ogp['tw_card'] === $card ) {
45
+ echo '<option value="', esc_attr( $card ), '" selected>', esc_html( $card ), '</option>';
46
+ } else {
47
+ echo '<option value="', esc_attr( $card ), '">', esc_html( $card ), '</option>';
48
+ }
49
+
50
+ }
51
+ ?>
52
+ </select>
53
+ </div>
54
+ <div class="ssp_desc">
55
+ <p>Twitterで使用するカードタイプを選択してください。</p>
56
+ </div>
57
+ </div>
58
+ </td>
59
+ </tr>
60
+ </tbody>
61
+ </table>
62
+ </div>
63
+ </div>
inc/parts/tab_webmaster.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="postbox">
2
+ <h2 class="hndle">
3
+ <span>ウェブマスターツール設定</span>
4
+ </h2>
5
+ <div class="inside">
6
+ <table class="form-table">
7
+ <tbody>
8
+ <?php
9
+ $webmas = [
10
+ 'webmaster_google' => ['サーチコンソール', 'google-site-verification'],
11
+ 'webmaster_bing' => ['Bing', 'msvalidate.01'],
12
+ 'webmaster_baidu' => ['Baidu', 'baidu-site-verification'],
13
+ 'webmaster_yandex' => ['Yandex', 'yandex-verification'],
14
+ ];
15
+ foreach ($webmas as $wm_key => $wm_v) {
16
+ echo '<tr valign="top"><th scope="row">',
17
+ '<label for="'.$wm_key.'">', $wm_v[0], '</label>',
18
+ '</th>',
19
+
20
+ '<td>',
21
+ '<div class="inner">',
22
+ '<div class="ssp_item">',
23
+ '<input type="text" name="'.$wm_key.'" id="'.$wm_key.'" value="'.esc_attr( SSP_Data::$settings[ $wm_key ] ).'">',
24
+ '</div>',
25
+ '<div class="ssp_desc">
26
+ <p>', $wm_v[0], 'のウェブマスターツール認証コード<br>',
27
+ '埋め込まれるコード:',
28
+ '<code>&lt;meta name="',$wm_v[1], '" content="入力コード"&gt;</code>',
29
+ '</p>',
30
+ '</div>',
31
+ '</div>',
32
+ '</td>',
33
+ '</tr>';
34
+ }
35
+ ?>
36
+ </tbody>
37
+ </table>
38
+ </div>
39
+ </div>
readme.txt ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+  === SEO SIMPLE PACK ===
2
+ Contributors: looswebstudio
3
+ Donate link: https://loos-web-studio.com/
4
+ Tags: SEO,meta,analytics,webmaster,simple,japan
5
+ Requires at least: 4.6
6
+ Tested up to: 4.9.7
7
+ Stable tag: 1.0
8
+ Requires PHP: 5.4
9
+ License: GPLv2 or later
10
+ License URI: https://www.gnu.org/licenses/gpl-2.0.html
11
+
12
+ 日本向けに作られたシンプルなSEOプラグインです。ページ種別・投稿ごとにmetaタグやOGPタグを簡単に設定・カスタマイズできます。
13
+
14
+ == Description ==
15
+
16
+ 「SEO SIMPLE PACK」は、日本向けに作られたシンプルなSEOプラグインです。
17
+ SEO対策に必須な `title`・`description`タグ や `meta`・`OGP`タグ を簡単に設定・カスタマイズすることができます。
18
+
19
+ また、ウェブマスターツールやGoogleアナリティクスのコードも簡単に埋め込むことができます。
20
+
21
+
22
+ = インストール・有効化したら =
23
+ 何もしなくても問題なく動作し、各ページに適切なタグが出力されます。
24
+
25
+ しかし、最低でも**ホームのdescriptionタグ**用の設定(初期設定では「キャッチフレーズ」が適用されます)と、**OGP画像**の設定をすることを推奨します。
26
+
27
+ = 初期設定について =
28
+ 重要なページについてのみ簡単に説明しておきます。詳しくは実際の設定画面をご確認ください。
29
+
30
+ - ホームの`<title>`タグ:「サイト名 | キャッチフレーズ」
31
+ - ホームの`<description>`タグ:「キャッチフレーズ」
32
+ - 投稿・固定ページの`<title>`タグ:「そのページのタイトル | サイト名」
33
+ - 投稿・固定ページの`<description>`タグ:「そのページのコンテンツ(エディタ内文章)から自動生成」
34
+ - noindex(follow)となるページ:アーカイブページ・404ページ・検索結果ページ
35
+ - 使用不可(リダイレクトによりアクセス禁止)のページ:投稿者アーカイブ・投稿フォーマットアーカイブ・メディア個別ページ
36
+
37
+ *「サイト名」および「キャッチフレーズ」とは、WordPressの標準設定の項目で入力している内容です。
38
+
39
+ = 設定の編集方法 =
40
+ WordPress管理画面の左メニューに「SIMPLE SEO」という項目が追加されているので、クリックしてください。
41
+ 「一般設定」と「OGP設定」の2種類の管理画面にて、各種設定を行います。
42
+
43
+ = 一般設定画面 =
44
+ サイトの全体的な設定を行います。
45
+ 投稿ページ・タクソノミーページ・その他アーカイブページなど、各ページ種別ごとに設定が可能です。
46
+ 投稿ページに関しては、投稿ごとにカスタムフィールドが設置され、個別の設定が可能です。
47
+
48
+ = OGP設定画面 =
49
+ OGP画像の選択や、Facebook・Twitter用の設定をカスタマイズすることができます。
50
+
51
+ *投稿系ページのOGP画像は、アイキャッチ画像が優先されます。*
52
+
53
+ = Googleアナリティクスコード =
54
+
55
+ トラッキングIDを入力している場合、Googleアナリティクスのトラッキングコードを自動挿入します。
56
+
57
+ また、新しい`gtag.js`でのコードで埋め込むか、古い`analytics.js`によるコードで埋め込むかを選択できます。
58
+
59
+ = 投稿・固定ページの個別設定 =
60
+ 投稿・固定ページ・カスタム投稿では、その投稿の編集ページ内にメタボックスが追加されており、個別で`description`や`robots`の内容を設定することができます。
61
+
62
+
63
+
64
+
65
+
66
+ == Installation ==
67
+
68
+
69
+ = 自動インストール =
70
+ 1. プラグインの検索フィールドより「SEO SIMPLE PACK」と入力します。
71
+ 2. 当プラグインを見つけたら、"今すぐインストール"をクリックしてインストールし、有効化してください。
72
+
73
+ = 手動インストール =
74
+ 1.「seo-simple-pack」フォルダ全体を /wp-content/plugins/ ディレクトリにアップロードします。
75
+ 2.「プラグイン」メニューからプラグインを有効化します。
76
+
77
+
78
+ == Changelog ==
79
+
80
+ = 1.0 =
81
+ Initial working version.
seo-simple-pack.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Plugin Name: SEO SIMPLE PACK
4
+ Plugin URI: (プラグインの説明と更新を示すページの URI)
5
+ Description: シンプルなSEOプラグイン。ページ種別・投稿ごとにmetaタグやOGPタグを簡単に設定・カスタマイズできます。
6
+ Version: 1.0
7
+ Author: LOOS WEB STUDIO
8
+ Author URI: https://loos-web-studio.com/
9
+ License: GPL2
10
+
11
+ /* Copyright 2018 LOOS WEB STUDIO (email : info@loos-web-studio.com)
12
+
13
+ This program is free software; you can redistribute it and/or modify
14
+ it under the terms of the GNU General Public License, version 2, as
15
+ published by the Free Software Foundation.
16
+
17
+ This program is distributed in the hope that it will be useful,
18
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
+ GNU General Public License for more details.
21
+
22
+ You should have received a copy of the GNU General Public License
23
+ along with this program; if not, write to the Free Software
24
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
+ */
26
+
27
+
28
+ /**
29
+ * add_filterが使えなければ 403 エラーで返す
30
+ */
31
+ if ( ! function_exists( 'add_filter' ) ) {
32
+ header( 'Status: 403 Forbidden' );
33
+ header( 'HTTP/1.1 403 Forbidden' );
34
+ exit();
35
+ }
36
+
37
+
38
+ /**
39
+ * 定数宣言
40
+ */
41
+ if ( ! defined( 'SSP_FILE' ) ) {
42
+ define( 'SSP_FILE', __FILE__ );
43
+ }
44
+ if ( ! defined( 'SSP_PATH' ) ) {
45
+ define( 'SSP_PATH', plugin_dir_path( __FILE__ ) );
46
+ }
47
+ if ( ! defined( 'SSP_BASENAME' ) ) {
48
+ define( 'SSP_BASENAME', plugin_basename( SSP_FILE ) );
49
+ }
50
+ if ( ! defined( 'SSP_VERSION' ) ) {
51
+ define( 'SSP_VERSION', '1.0' );
52
+ }
53
+ if ( ! defined( 'SSP_URL' ) ) {
54
+ define( 'SSP_URL', plugins_url( '', __FILE__ ) );
55
+ }
56
+
57
+
58
+ /**
59
+ * CLASSファイルの読み込み
60
+ * オートローダーはあとで考える
61
+ */
62
+ require_once SSP_PATH . 'class/ssp_data.php';
63
+ require_once SSP_PATH . 'class/ssp_branch.php';
64
+ require_once SSP_PATH . 'class/ssp_init.php';
65
+ require_once SSP_PATH . 'class/ssp_menu.php';
66
+ require_once SSP_PATH . 'class/ssp_methods.php';
67
+ require_once SSP_PATH . 'class/ssp_output.php';
68
+ require_once SSP_PATH . 'class/ssp_metabox.php';
69
+
70
+
71
+ /**
72
+ * アクティベーションフック
73
+ */
74
+ register_activation_hook( SSP_FILE, ['SSP_Methods','plugin_activate'] );
75
+ register_deactivation_hook( SSP_FILE, ['SSP_Methods','plugin_deactivate'] );
76
+ register_uninstall_hook( SSP_FILE, ['SSP_Methods','plugin_uninstall'] );
77
+
78
+
79
+ /**
80
+ * SSP Init
81
+ */
82
+ new SSP_Init();