Version Description
- 16 Mar 2020 =
- Feature : Auto-backup role and capabilities on each update (and on update to this version)
- Fixed : First-time installation: Capabilities menu item not displayed until after Plugins or Users menu clicked
- Change : Third Party Plugin Capabilities - always display checkboxes even if capabilities not present in Administrator role
- Fixed : Plugin capability sections - pp_set_notification_channel and pp_manage_roles were included in both PublishPress and PublishPress Permissions sections
- Fixed : Capability Negation (Denial) bulk unselect link was ambiguous due to missing strikethrough
Download this release
Release Info
Developer | kevinB |
Plugin | Capability Manager Enhanced |
Version | 1.9.2 |
Comparing to | |
See all releases |
Code changes from version 1.9 to 1.9.2
- admin.css +222 -223
- admin.dev.js +7 -0
- admin.js +1 -1
- capsman-enhanced.php +14 -9
- composer.json +20 -0
- includes/CoreAdmin.php +47 -0
- includes/admin.php +1208 -1205
- includes/backup-handler.php +10 -4
- includes/backup.php +43 -19
- includes/functions-admin.php +19 -1
- includes/functions.php +19 -0
- includes/handler.php +6 -4
- includes/manager.php +16 -1
- lang/capsman.mo +0 -0
- lang/capsman.po +133 -124
- readme.txt +12 -2
- vendor/autoload.php +7 -0
- vendor/composer/ClassLoader.php +445 -0
- vendor/composer/LICENSE +21 -0
- vendor/composer/autoload_classmap.php +9 -0
- vendor/composer/autoload_namespaces.php +10 -0
- vendor/composer/autoload_psr4.php +11 -0
- vendor/composer/autoload_real.php +55 -0
- vendor/composer/autoload_static.php +47 -0
- vendor/composer/installed.json +149 -0
- vendor/pimple/pimple/.gitignore +3 -0
- vendor/pimple/pimple/.php_cs.dist +20 -0
- vendor/pimple/pimple/.travis.yml +17 -0
- vendor/pimple/pimple/CHANGELOG +64 -0
- vendor/pimple/pimple/LICENSE +19 -0
- vendor/pimple/pimple/README.rst +326 -0
- vendor/pimple/pimple/composer.json +29 -0
- vendor/pimple/pimple/phpunit.xml.dist +18 -0
- vendor/pimple/pimple/src/Pimple/Container.php +298 -0
- vendor/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php +38 -0
- vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php +45 -0
- vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php +45 -0
- vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php +45 -0
- vendor/pimple/pimple/src/Pimple/Psr11/Container.php +55 -0
- vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php +75 -0
- vendor/pimple/pimple/src/Pimple/ServiceIterator.php +69 -0
- vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php +46 -0
- vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php +38 -0
- vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php +34 -0
- vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php +54 -0
- vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php +35 -0
- vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php +77 -0
- vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php +610 -0
- vendor/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php +76 -0
- vendor/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php +131 -0
- vendor/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php +52 -0
- vendor/psr/container/.gitignore +3 -0
- vendor/psr/container/LICENSE +21 -0
- vendor/psr/container/README.md +5 -0
- vendor/psr/container/composer.json +27 -0
- vendor/psr/container/src/ContainerExceptionInterface.php +13 -0
- vendor/psr/container/src/ContainerInterface.php +37 -0
- vendor/psr/container/src/NotFoundExceptionInterface.php +13 -0
- vendor/publishpress/wordpress-version-notices/.env.testing.dist +17 -0
- vendor/publishpress/wordpress-version-notices/.gitignore +31 -0
- vendor/publishpress/wordpress-version-notices/README.md +75 -0
- vendor/publishpress/wordpress-version-notices/assets/css/top-notice-bold-purple.css +65 -0
- vendor/publishpress/wordpress-version-notices/bin/acceptance.sh +7 -0
- vendor/publishpress/wordpress-version-notices/bin/test.sh +7 -0
- vendor/publishpress/wordpress-version-notices/bin/update-code-for-tests.sh +13 -0
- vendor/publishpress/wordpress-version-notices/bin/wpunit.sh +7 -0
- vendor/publishpress/wordpress-version-notices/codeception.dist.yml +20 -0
- vendor/publishpress/wordpress-version-notices/codeception.yml +20 -0
- vendor/publishpress/wordpress-version-notices/composer.json +30 -0
- vendor/publishpress/wordpress-version-notices/composer.lock +7340 -0
- vendor/publishpress/wordpress-version-notices/includes.php +55 -0
- vendor/publishpress/wordpress-version-notices/license.txt +377 -0
- vendor/publishpress/wordpress-version-notices/src/Module/AdInterface.php +37 -0
- vendor/publishpress/wordpress-version-notices/src/Module/Footer/Module.php +55 -0
- vendor/publishpress/wordpress-version-notices/src/Module/TopNotice/Module.php +136 -0
- vendor/publishpress/wordpress-version-notices/src/ServicesProvider.php +49 -0
- vendor/publishpress/wordpress-version-notices/src/Template/TemplateInvalidArgumentsException.php +33 -0
- vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoader.php +108 -0
- vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoaderInterface.php +53 -0
- vendor/publishpress/wordpress-version-notices/src/Template/TemplateNotFoundException.php +33 -0
- vendor/publishpress/wordpress-version-notices/templates/top-notice/notice.php +6 -0
- vendor/publishpress/wordpress-version-notices/tests/_data/.gitkeep +0 -0
- vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-one/dumb-plugin-one.php +37 -0
- vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-one/vendor/publishpress/wordpress-version-notices/.gitkeep +0 -0
- vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-one/version-notice.php +46 -0
- vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-two/dumb-plugin-two.php +37 -0
- vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-two/vendor/publishpress/wordpress-version-notices/.gitkeep +0 -0
- vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-two/version-notice.php +46 -0
- vendor/publishpress/wordpress-version-notices/tests/_data/dumb-templates/Dumb/test1.php +1 -0
- vendor/publishpress/wordpress-version-notices/tests/_data/dumb-templates/Dumb/test2.php +1 -0
- vendor/publishpress/wordpress-version-notices/tests/_data/dump.sql +255 -0
admin.css
CHANGED
@@ -1,223 +1,222 @@
|
|
1 |
-
/**
|
2 |
-
* Settings for admin dashboard.
|
3 |
-
* Based on the styles for Maintenance Mode plugin by Michael Wöhrer
|
4 |
-
*
|
5 |
-
* @version $Rev: 198515 $
|
6 |
-
* @author Jordi Canals
|
7 |
-
* @copyright Copyright (C) 2009, 2010 Jordi Canals
|
8 |
-
* @license GNU General Public License version 2
|
9 |
-
* @link http://alkivia.org
|
10 |
-
* @package Alkivia
|
11 |
-
* @subpackage CapsMan
|
12 |
-
*
|
13 |
-
|
14 |
-
Copyright 2009, 2010 Jordi Canals <devel@jcanals.cat>
|
15 |
-
|
16 |
-
This program is free software; you can redistribute it and/or
|
17 |
-
modify it under the terms of the GNU General Public License
|
18 |
-
version 2 as published by the Free Software Foundation.
|
19 |
-
|
20 |
-
This program is distributed in the hope that it will be useful,
|
21 |
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
22 |
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
23 |
-
GNU General Public License for more details.
|
24 |
-
|
25 |
-
You should have received a copy of the GNU General Public License
|
26 |
-
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
27 |
-
*/
|
28 |
-
|
29 |
-
|
30 |
-
/* ====================================================== SIDEBAR ICONS */
|
31 |
-
|
32 |
-
a.cap_type {
|
33 |
-
text-decoration: none;
|
34 |
-
}
|
35 |
-
|
36 |
-
a.cap_type:hover {
|
37 |
-
text-decoration: underline;
|
38 |
-
}
|
39 |
-
|
40 |
-
ul.cme-listhoriz li {
|
41 |
-
text-align: center;
|
42 |
-
padding-right: 1em;
|
43 |
-
}
|
44 |
-
|
45 |
-
ul.cme-listhoriz li table{
|
46 |
-
text-align: center;
|
47 |
-
}
|
48 |
-
|
49 |
-
|
50 |
-
ul.cme-listhoriz {
|
51 |
-
width: 100%;
|
52 |
-
clear: both;
|
53 |
-
float: left;
|
54 |
-
margin: 0;
|
55 |
-
padding: 0;
|
56 |
-
}
|
57 |
-
|
58 |
-
ul.cme-listhoriz li {
|
59 |
-
list-style: none;
|
60 |
-
float: left;
|
61 |
-
margin: 0;
|
62 |
-
}
|
63 |
-
|
64 |
-
|
65 |
-
div.cme-listhoriz h3 {
|
66 |
-
margin: 0.2em;
|
67 |
-
}
|
68 |
-
|
69 |
-
div.cme-cap-type-tables {
|
70 |
-
border: 1px solid black;
|
71 |
-
}
|
72 |
-
|
73 |
-
table .cme-typecaps td {
|
74 |
-
text-align: center;
|
75 |
-
height: 2em;
|
76 |
-
}
|
77 |
-
|
78 |
-
table .cme-typecaps th {
|
79 |
-
padding-left: 0.3em;
|
80 |
-
padding-right: 0.3em;
|
81 |
-
}
|
82 |
-
|
83 |
-
table.cme-typecaps span.cap-x {
|
84 |
-
display: none;
|
85 |
-
}
|
86 |
-
|
87 |
-
h3.cme-cap-section {
|
88 |
-
margin-top:0;
|
89 |
-
}
|
90 |
-
|
91 |
-
a.neg-cap, a.cap-on, a.type-on, a.neg-type-caps, a.cme-neg-all {
|
92 |
-
text-decoration: none;
|
93 |
-
}
|
94 |
-
|
95 |
-
span.cap-x, a.cme-neg-all {
|
96 |
-
color: red;
|
97 |
-
font-size: 1.5em;
|
98 |
-
padding-left: 1px;
|
99 |
-
padding-right: 1px;
|
100 |
-
vertical-align: middle;
|
101 |
-
}
|
102 |
-
|
103 |
-
a.cme-switch-all {
|
104 |
-
color: black;
|
105 |
-
font-size: 1.5em;
|
106 |
-
padding-right: 1px;
|
107 |
-
padding-right: 1px;
|
108 |
-
vertical-align: middle;
|
109 |
-
text-decoration: line-through;
|
110 |
-
}
|
111 |
-
|
112 |
-
td.cap-yes span {
|
113 |
-
color:green;font-weight:bold;
|
114 |
-
}
|
115 |
-
|
116 |
-
td.cap-no {
|
117 |
-
color:#777;
|
118 |
-
}
|
119 |
-
|
120 |
-
td.cap-neg label span {
|
121 |
-
color: red;
|
122 |
-
}
|
123 |
-
|
124 |
-
td.cap-neg input {
|
125 |
-
display:none;
|
126 |
-
}
|
127 |
-
|
128 |
-
td.cap-no span.cap-x, td.cap-yes span.cap-x {
|
129 |
-
display:none;
|
130 |
-
}
|
131 |
-
|
132 |
-
td.cap-neg span.cap-x {
|
133 |
-
display:inline;
|
134 |
-
}
|
135 |
-
|
136 |
-
td.cap-neg a.neg-cap {
|
137 |
-
display:none;
|
138 |
-
}
|
139 |
-
|
140 |
-
td.cap-metagroup label span {
|
141 |
-
color: #080 !important;
|
142 |
-
}
|
143 |
-
|
144 |
-
td.cap-locked a.neg-cap {
|
145 |
-
display: none !important;
|
146 |
-
}
|
147 |
-
|
148 |
-
a.type-off, a.neg-cap, a.cme-neg-all, a.neg-type-caps {
|
149 |
-
color: #800;
|
150 |
-
}
|
151 |
-
|
152 |
-
a.type-on, a.cap-on, a.cme-switch-all {
|
153 |
-
color: black;
|
154 |
-
}
|
155 |
-
|
156 |
-
input.cme-check-all, a.cme-neg-all {
|
157 |
-
margin-right: 10px;
|
158 |
-
padding-right: 10px;
|
159 |
-
}
|
160 |
-
|
161 |
-
#akmin input.button {
|
162 |
-
margin-top: 5px;
|
163 |
-
}
|
164 |
-
|
165 |
-
#akmin input.button-primary {
|
166 |
-
margin: 5px;
|
167 |
-
}
|
168 |
-
|
169 |
-
#akmin td.sidebar {
|
170 |
-
width: 300px;
|
171 |
-
}
|
172 |
-
|
173 |
-
#akmin .cme-backup-tool a {
|
174 |
-
padding-left:0;
|
175 |
-
}
|
176 |
-
|
177 |
-
#akmin input.regular-text {
|
178 |
-
width: 200px;
|
179 |
-
}
|
180 |
-
|
181 |
-
#akmin input.tight-text {
|
182 |
-
width: 125px;
|
183 |
-
}
|
184 |
-
|
185 |
-
.cme-subtext {
|
186 |
-
color: #686868;
|
187 |
-
font-style: italic;
|
188 |
-
margin-top:5px;
|
189 |
-
}
|
190 |
-
|
191 |
-
td.cm-has-via-pp {
|
192 |
-
background-color: #84fb84;
|
193 |
-
}
|
194 |
-
|
195 |
-
div.pressshack-admin-wrapper footer {
|
196 |
-
padding-right: 270px;
|
197 |
-
}
|
198 |
-
|
199 |
-
body.capabilities_page_capsman-tool div.pressshack-admin-wrapper footer {
|
200 |
-
padding-right: 5px;
|
201 |
-
}
|
202 |
-
|
203 |
-
#akmin div.publishpress-headline {line-height:25px}
|
204 |
-
#akmin span.publishpress-thanks{margin-left:5px;color:#655997;white-space:nowrap}
|
205 |
-
#akmin span.publishpress-thanks,#akmin span.publishpress-thanks a,#akmin span.publishpress-thanks a:visited {color:#655997;font-weight:bold;}
|
206 |
-
|
207 |
-
table#akmin td.sidebar li.publishpress-contact{text-align:center}
|
208 |
-
table#akmin td.sidebar li.publishpress-contact a{padding:5px 0 5px 0;}
|
209 |
-
|
210 |
-
#pp_features {display:none;border:1px solid #eee;padding:5px;text-align:center;min-width:600px}
|
211 |
-
#pp_features div.pp-logo { text-align: center }
|
212 |
-
#pp_features div.features-wrap { margin-left: auto; margin-right: auto; text-align: center; width: 600px; }
|
213 |
-
#pp_features ul.pp-features { list-style: none; padding-top:10px; text-align:left; margin-left: auto }
|
214 |
-
#pp_features ul.pp-features li:before { content: "\2713\0020"; }
|
215 |
-
#pp_features ul.pp-features li { padding-bottom: 5px }
|
216 |
-
#pp_features img.cme-play { margin-bottom: -3px; margin-left: 5px;}
|
217 |
-
|
218 |
-
div.publishpress-caps-manage span.manage-members {
|
219 |
-
div.publishpress-caps-manage span.manage-members a {
|
220 |
-
|
221 |
-
|
222 |
-
div.publishpress-headline .cme-subtext a {
|
223 |
-
div.publishpress-headline .cme-subtext a:hover {text-decoration: underline}
|
1 |
+
/**
|
2 |
+
* Settings for admin dashboard.
|
3 |
+
* Based on the styles for Maintenance Mode plugin by Michael Wöhrer
|
4 |
+
*
|
5 |
+
* @version $Rev: 198515 $
|
6 |
+
* @author Jordi Canals
|
7 |
+
* @copyright Copyright (C) 2009, 2010 Jordi Canals
|
8 |
+
* @license GNU General Public License version 2
|
9 |
+
* @link http://alkivia.org
|
10 |
+
* @package Alkivia
|
11 |
+
* @subpackage CapsMan
|
12 |
+
*
|
13 |
+
|
14 |
+
Copyright 2009, 2010 Jordi Canals <devel@jcanals.cat>
|
15 |
+
|
16 |
+
This program is free software; you can redistribute it and/or
|
17 |
+
modify it under the terms of the GNU General Public License
|
18 |
+
version 2 as published by the Free Software Foundation.
|
19 |
+
|
20 |
+
This program is distributed in the hope that it will be useful,
|
21 |
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
22 |
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
23 |
+
GNU General Public License for more details.
|
24 |
+
|
25 |
+
You should have received a copy of the GNU General Public License
|
26 |
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
27 |
+
*/
|
28 |
+
|
29 |
+
|
30 |
+
/* ====================================================== SIDEBAR ICONS */
|
31 |
+
|
32 |
+
a.cap_type {
|
33 |
+
text-decoration: none;
|
34 |
+
}
|
35 |
+
|
36 |
+
a.cap_type:hover {
|
37 |
+
text-decoration: underline;
|
38 |
+
}
|
39 |
+
|
40 |
+
ul.cme-listhoriz li {
|
41 |
+
text-align: center;
|
42 |
+
padding-right: 1em;
|
43 |
+
}
|
44 |
+
|
45 |
+
ul.cme-listhoriz li table{
|
46 |
+
text-align: center;
|
47 |
+
}
|
48 |
+
|
49 |
+
|
50 |
+
ul.cme-listhoriz {
|
51 |
+
width: 100%;
|
52 |
+
clear: both;
|
53 |
+
float: left;
|
54 |
+
margin: 0;
|
55 |
+
padding: 0;
|
56 |
+
}
|
57 |
+
|
58 |
+
ul.cme-listhoriz li {
|
59 |
+
list-style: none;
|
60 |
+
float: left;
|
61 |
+
margin: 0;
|
62 |
+
}
|
63 |
+
|
64 |
+
|
65 |
+
div.cme-listhoriz h3 {
|
66 |
+
margin: 0.2em;
|
67 |
+
}
|
68 |
+
|
69 |
+
div.cme-cap-type-tables {
|
70 |
+
border: 1px solid black;
|
71 |
+
}
|
72 |
+
|
73 |
+
table .cme-typecaps td {
|
74 |
+
text-align: center;
|
75 |
+
height: 2em;
|
76 |
+
}
|
77 |
+
|
78 |
+
table .cme-typecaps th {
|
79 |
+
padding-left: 0.3em;
|
80 |
+
padding-right: 0.3em;
|
81 |
+
}
|
82 |
+
|
83 |
+
table.cme-typecaps span.cap-x {
|
84 |
+
display: none;
|
85 |
+
}
|
86 |
+
|
87 |
+
h3.cme-cap-section {
|
88 |
+
margin-top:0;
|
89 |
+
}
|
90 |
+
|
91 |
+
a.neg-cap, a.cap-on, a.type-on, a.neg-type-caps, a.cme-neg-all {
|
92 |
+
text-decoration: none;
|
93 |
+
}
|
94 |
+
|
95 |
+
span.cap-x, a.cme-neg-all {
|
96 |
+
color: red;
|
97 |
+
font-size: 1.5em;
|
98 |
+
padding-left: 1px;
|
99 |
+
padding-right: 1px;
|
100 |
+
vertical-align: middle;
|
101 |
+
}
|
102 |
+
|
103 |
+
a.cme-switch-all {
|
104 |
+
color: black;
|
105 |
+
font-size: 1.5em;
|
106 |
+
padding-right: 1px;
|
107 |
+
padding-right: 1px;
|
108 |
+
vertical-align: middle;
|
109 |
+
text-decoration: line-through !important;
|
110 |
+
}
|
111 |
+
|
112 |
+
td.cap-yes span {
|
113 |
+
color:green;font-weight:bold;
|
114 |
+
}
|
115 |
+
|
116 |
+
td.cap-no {
|
117 |
+
color:#777;
|
118 |
+
}
|
119 |
+
|
120 |
+
td.cap-neg label span {
|
121 |
+
color: red;
|
122 |
+
}
|
123 |
+
|
124 |
+
td.cap-neg input {
|
125 |
+
display:none;
|
126 |
+
}
|
127 |
+
|
128 |
+
td.cap-no span.cap-x, td.cap-yes span.cap-x {
|
129 |
+
display:none;
|
130 |
+
}
|
131 |
+
|
132 |
+
td.cap-neg span.cap-x {
|
133 |
+
display:inline;
|
134 |
+
}
|
135 |
+
|
136 |
+
td.cap-neg a.neg-cap {
|
137 |
+
display:none;
|
138 |
+
}
|
139 |
+
|
140 |
+
td.cap-metagroup label span {
|
141 |
+
color: #080 !important;
|
142 |
+
}
|
143 |
+
|
144 |
+
td.cap-locked a.neg-cap {
|
145 |
+
display: none !important;
|
146 |
+
}
|
147 |
+
|
148 |
+
a.type-off, a.neg-cap, a.cme-neg-all, a.neg-type-caps {
|
149 |
+
color: #800;
|
150 |
+
}
|
151 |
+
|
152 |
+
a.type-on, a.cap-on, a.cme-switch-all {
|
153 |
+
color: black;
|
154 |
+
}
|
155 |
+
|
156 |
+
input.cme-check-all, a.cme-neg-all {
|
157 |
+
margin-right: 10px;
|
158 |
+
padding-right: 10px;
|
159 |
+
}
|
160 |
+
|
161 |
+
#akmin input.button {
|
162 |
+
margin-top: 5px;
|
163 |
+
}
|
164 |
+
|
165 |
+
#akmin input.button-primary {
|
166 |
+
margin: 5px;
|
167 |
+
}
|
168 |
+
|
169 |
+
#akmin td.sidebar {
|
170 |
+
width: 300px;
|
171 |
+
}
|
172 |
+
|
173 |
+
#akmin .cme-backup-tool a {
|
174 |
+
padding-left:0;
|
175 |
+
}
|
176 |
+
|
177 |
+
#akmin input.regular-text {
|
178 |
+
width: 200px;
|
179 |
+
}
|
180 |
+
|
181 |
+
#akmin input.tight-text {
|
182 |
+
width: 125px;
|
183 |
+
}
|
184 |
+
|
185 |
+
.cme-subtext {
|
186 |
+
color: #686868;
|
187 |
+
font-style: italic;
|
188 |
+
margin-top:5px;
|
189 |
+
}
|
190 |
+
|
191 |
+
td.cm-has-via-pp {
|
192 |
+
background-color: #84fb84;
|
193 |
+
}
|
194 |
+
|
195 |
+
div.pressshack-admin-wrapper footer {
|
196 |
+
padding-right: 270px;
|
197 |
+
}
|
198 |
+
|
199 |
+
body.capabilities_page_capsman-tool div.pressshack-admin-wrapper footer {
|
200 |
+
padding-right: 5px;
|
201 |
+
}
|
202 |
+
|
203 |
+
#akmin div.publishpress-headline {line-height:25px}
|
204 |
+
#akmin span.publishpress-thanks{margin-left:5px;color:#655997;white-space:nowrap}
|
205 |
+
#akmin span.publishpress-thanks,#akmin span.publishpress-thanks a,#akmin span.publishpress-thanks a:visited {color:#655997;font-weight:bold;}
|
206 |
+
|
207 |
+
table#akmin td.sidebar li.publishpress-contact{text-align:center}
|
208 |
+
table#akmin td.sidebar li.publishpress-contact a{padding:5px 0 5px 0;}
|
209 |
+
|
210 |
+
#pp_features {display:none;border:1px solid #eee;padding:5px;text-align:center;min-width:600px}
|
211 |
+
#pp_features div.pp-logo { text-align: center }
|
212 |
+
#pp_features div.features-wrap { margin-left: auto; margin-right: auto; text-align: center; width: 600px; }
|
213 |
+
#pp_features ul.pp-features { list-style: none; padding-top:10px; text-align:left; margin-left: auto }
|
214 |
+
#pp_features ul.pp-features li:before { content: "\2713\0020"; }
|
215 |
+
#pp_features ul.pp-features li { padding-bottom: 5px }
|
216 |
+
#pp_features img.cme-play { margin-bottom: -3px; margin-left: 5px;}
|
217 |
+
div.publishpress-caps-manage span.manage-members {margin-left:5px; font-weight:normal; color: #777}
|
218 |
+
div.publishpress-caps-manage span.manage-members a {color: #777}
|
219 |
+
div.publishpress-caps-manage span.manage-members a:hover {text-decoration: underline; color:#655997 }
|
220 |
+
|
221 |
+
div.publishpress-headline .cme-subtext a {font-weight: bold}
|
222 |
+
div.publishpress-headline .cme-subtext a:hover {text-decoration: underline}
|
|
admin.dev.js
CHANGED
@@ -24,6 +24,13 @@ jQuery(document).ready( function($) {
|
|
24 |
return false;
|
25 |
});
|
26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
$('input.cme-check-all').click( function(e) {
|
28 |
$(this).closest('table').find('input[type="checkbox"][disabled!="disabled"]:visible').prop('checked', $(this).is(":checked") );
|
29 |
});
|
24 |
return false;
|
25 |
});
|
26 |
|
27 |
+
$("#publishpress_caps_form").bind("keypress", function(e) {
|
28 |
+
if (e.keyCode == 13) {
|
29 |
+
$(document.activeElement).parent().find('input[type="submit"]').first().click();
|
30 |
+
return false;
|
31 |
+
}
|
32 |
+
});
|
33 |
+
|
34 |
$('input.cme-check-all').click( function(e) {
|
35 |
$(this).closest('table').find('input[type="checkbox"][disabled!="disabled"]:visible').prop('checked', $(this).is(":checked") );
|
36 |
});
|
admin.js
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
jQuery(document).ready(function($){$('a.neg-cap').attr('title',cmeAdmin.negationCaption);$('a.neg-type-caps').attr('title',cmeAdmin.typeCapsNegationCaption);$('td.cap-unreg').attr('title',cmeAdmin.typeCapUnregistered);$('a.normal-cap').attr('title',cmeAdmin.switchableCaption);$('span.cap-x').attr('title',cmeAdmin.capNegated);$('table.cme-checklist input[class!="cme-check-all"]').not(':disabled').attr('title',cmeAdmin.chkCaption);$('table.cme-checklist a.neg-cap').click(function(e){$(this).closest('td').removeClass('cap-yes').removeClass('cap-no').addClass('cap-neg');var cap_name_attr=$(this).parent().find('input[type="checkbox"]').attr('name');$(this).after('<input type="hidden" class="cme-negation-input" name="'+cap_name_attr+'" value="" />');return false;});$(document).on('click','table.cme-typecaps span.cap-x,table.cme-checklist span.cap-x,table.cme-checklist td.cap-neg span',function(e){$(this).closest('td').removeClass('cap-neg').removeClass('cap-yes').addClass('cap-no');$(this).parent().find('input[type="checkbox"]').prop('checked',false);$(this).parent().find('input.cme-negation-input').remove();return false;});$('input.cme-check-all').click(function(e){$(this).closest('table').find('input[type="checkbox"][disabled!="disabled"]:visible').prop('checked',$(this).is(":checked"));});$('a.cme-neg-all').click(function(e){$(this).closest('table').find('a.neg-cap:visible').click();return false;});$('a.cme-switch-all').click(function(e){$(this).closest('table').find('td.cap-neg span').click();return false;});$('table.cme-typecaps a.neg-type-caps').click(function(e){$(this).closest('tr').find('td[class!="cap-neg"]').filter('td[class!="cap-unreg"]').each(function(){$(this).addClass('cap-neg');var cap_name_attr=$(this).find('input[type="checkbox"]').attr('name');$(this).append('<input type="hidden" class="cme-negation-input" name="'+cap_name_attr+'" value="" />');});return false;});$('table.cme-typecaps th').click(function(){var columnNo=$(this).index();var check_val=!$(this).prop('checked_all');if($(this).hasClass('term-cap'))
|
2 |
var class_sel='[class*="term-cap"]';else
|
3 |
var class_sel='[class*="post-cap"]';$(this).closest("table").find("tr td"+class_sel+":nth-child("+(columnNo+1)+') input[type="checkbox"]:visible').prop("checked",check_val);$(this).prop('checked_all',check_val);});$('a.cme-fix-read-cap').click(function(){$('input[name="caps[read]"]').prop('checked',true);$('input[name="SaveRole"]').trigger('click');return false;});});
|
1 |
+
jQuery(document).ready(function($){$('a.neg-cap').attr('title',cmeAdmin.negationCaption);$('a.neg-type-caps').attr('title',cmeAdmin.typeCapsNegationCaption);$('td.cap-unreg').attr('title',cmeAdmin.typeCapUnregistered);$('a.normal-cap').attr('title',cmeAdmin.switchableCaption);$('span.cap-x').attr('title',cmeAdmin.capNegated);$('table.cme-checklist input[class!="cme-check-all"]').not(':disabled').attr('title',cmeAdmin.chkCaption);$('table.cme-checklist a.neg-cap').click(function(e){$(this).closest('td').removeClass('cap-yes').removeClass('cap-no').addClass('cap-neg');var cap_name_attr=$(this).parent().find('input[type="checkbox"]').attr('name');$(this).after('<input type="hidden" class="cme-negation-input" name="'+cap_name_attr+'" value="" />');return false;});$(document).on('click','table.cme-typecaps span.cap-x,table.cme-checklist span.cap-x,table.cme-checklist td.cap-neg span',function(e){$(this).closest('td').removeClass('cap-neg').removeClass('cap-yes').addClass('cap-no');$(this).parent().find('input[type="checkbox"]').prop('checked',false);$(this).parent().find('input.cme-negation-input').remove();return false;});$("#publishpress_caps_form").bind("keypress",function(e){if(e.keyCode==13){$(document.activeElement).parent().find('input[type="submit"]').first().click();return false;}});$('input.cme-check-all').click(function(e){$(this).closest('table').find('input[type="checkbox"][disabled!="disabled"]:visible').prop('checked',$(this).is(":checked"));});$('a.cme-neg-all').click(function(e){$(this).closest('table').find('a.neg-cap:visible').click();return false;});$('a.cme-switch-all').click(function(e){$(this).closest('table').find('td.cap-neg span').click();return false;});$('table.cme-typecaps a.neg-type-caps').click(function(e){$(this).closest('tr').find('td[class!="cap-neg"]').filter('td[class!="cap-unreg"]').each(function(){$(this).addClass('cap-neg');var cap_name_attr=$(this).find('input[type="checkbox"]').attr('name');$(this).append('<input type="hidden" class="cme-negation-input" name="'+cap_name_attr+'" value="" />');});return false;});$('table.cme-typecaps th').click(function(){var columnNo=$(this).index();var check_val=!$(this).prop('checked_all');if($(this).hasClass('term-cap'))
|
2 |
var class_sel='[class*="term-cap"]';else
|
3 |
var class_sel='[class*="post-cap"]';$(this).closest("table").find("tr td"+class_sel+":nth-child("+(columnNo+1)+') input[type="checkbox"]:visible').prop("checked",check_val);$(this).prop('checked_all',check_val);});$('a.cme-fix-read-cap').click(function(){$('input[name="caps[read]"]').prop('checked',true);$('input[name="SaveRole"]').trigger('click');return false;});});
|
capsman-enhanced.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
* Plugin Name: PublishPress Capabilities
|
4 |
* Plugin URI: https://publishpress.com/capability-manager/
|
5 |
* Description: Manage WordPress role definitions, per-site or network-wide. Organizes post capabilities by post type and operation.
|
6 |
-
* Version: 1.9
|
7 |
* Author: PublishPress
|
8 |
* Author URI: https://publishpress.com/
|
9 |
* Text Domain: capsman-enhanced
|
@@ -25,13 +25,13 @@
|
|
25 |
* @copyright Copyright (C) 2009, 2010 Jordi Canals; modifications Copyright (C) 2020 PublishPress
|
26 |
* @license GNU General Public License version 3
|
27 |
* @link https://publishpress.com/
|
28 |
-
* @version 1.9
|
29 |
*/
|
30 |
|
31 |
if (!defined('CAPSMAN_VERSION')) {
|
32 |
-
define('CAPSMAN_VERSION', '1.9');
|
33 |
-
define('CAPSMAN_ENH_VERSION', '1.9');
|
34 |
-
define('PUBLISHPRESS_CAPS_VERSION', '1.9');
|
35 |
}
|
36 |
|
37 |
foreach (get_option('active_plugins') as $plugin_file) {
|
@@ -47,7 +47,7 @@ foreach (get_option('active_plugins') as $plugin_file) {
|
|
47 |
$pro_active = false;
|
48 |
|
49 |
foreach ((array)get_option('active_plugins') as $plugin_file) {
|
50 |
-
if (false !== strpos($plugin_file, 'capabilities-pro
|
51 |
$pro_active = true;
|
52 |
break;
|
53 |
}
|
@@ -55,7 +55,7 @@ foreach ((array)get_option('active_plugins') as $plugin_file) {
|
|
55 |
|
56 |
if (!$pro_active && is_multisite()) {
|
57 |
foreach (array_keys((array)get_site_option('active_sitewide_plugins')) as $plugin_file) {
|
58 |
-
if (false !== strpos($plugin_file, 'capabilities-pro
|
59 |
$pro_active = true;
|
60 |
break;
|
61 |
}
|
@@ -115,7 +115,7 @@ if ( version_compare(PHP_VERSION, '5.4.0', '<') ) {
|
|
115 |
|| in_array( $pagenow, array( 'users.php', 'user-edit.php', 'profile.php', 'user-new.php' ) )
|
116 |
) ) {
|
117 |
global $capsman;
|
118 |
-
|
119 |
// Run the plugin
|
120 |
require_once ( dirname(__FILE__) . '/framework/lib/formating.php' );
|
121 |
require_once ( dirname(__FILE__) . '/framework/lib/users.php' );
|
@@ -126,6 +126,11 @@ if ( version_compare(PHP_VERSION, '5.4.0', '<') ) {
|
|
126 |
load_plugin_textdomain('capsman-enhanced', false, basename(dirname(__FILE__)) .'/lang');
|
127 |
add_action( 'admin_menu', 'cme_submenus', 20 );
|
128 |
}
|
|
|
|
|
|
|
|
|
|
|
129 |
}
|
130 |
|
131 |
add_action( 'init', '_cme_init' );
|
@@ -136,4 +141,4 @@ add_action( 'init', '_cme_cap_helper', 49 ); // Press Permit Cap Helper, regist
|
|
136 |
// @todo: do this in PP Core also
|
137 |
|
138 |
if ( is_multisite() )
|
139 |
-
require_once ( dirname(__FILE__) . '/includes/network.php' );
|
3 |
* Plugin Name: PublishPress Capabilities
|
4 |
* Plugin URI: https://publishpress.com/capability-manager/
|
5 |
* Description: Manage WordPress role definitions, per-site or network-wide. Organizes post capabilities by post type and operation.
|
6 |
+
* Version: 1.9.2
|
7 |
* Author: PublishPress
|
8 |
* Author URI: https://publishpress.com/
|
9 |
* Text Domain: capsman-enhanced
|
25 |
* @copyright Copyright (C) 2009, 2010 Jordi Canals; modifications Copyright (C) 2020 PublishPress
|
26 |
* @license GNU General Public License version 3
|
27 |
* @link https://publishpress.com/
|
28 |
+
* @version 1.9.2
|
29 |
*/
|
30 |
|
31 |
if (!defined('CAPSMAN_VERSION')) {
|
32 |
+
define('CAPSMAN_VERSION', '1.9.2');
|
33 |
+
define('CAPSMAN_ENH_VERSION', '1.9.2');
|
34 |
+
define('PUBLISHPRESS_CAPS_VERSION', '1.9.2');
|
35 |
}
|
36 |
|
37 |
foreach (get_option('active_plugins') as $plugin_file) {
|
47 |
$pro_active = false;
|
48 |
|
49 |
foreach ((array)get_option('active_plugins') as $plugin_file) {
|
50 |
+
if (false !== strpos($plugin_file, 'capabilities-pro.php')) {
|
51 |
$pro_active = true;
|
52 |
break;
|
53 |
}
|
55 |
|
56 |
if (!$pro_active && is_multisite()) {
|
57 |
foreach (array_keys((array)get_site_option('active_sitewide_plugins')) as $plugin_file) {
|
58 |
+
if (false !== strpos($plugin_file, 'capabilities-pro.php')) {
|
59 |
$pro_active = true;
|
60 |
break;
|
61 |
}
|
115 |
|| in_array( $pagenow, array( 'users.php', 'user-edit.php', 'profile.php', 'user-new.php' ) )
|
116 |
) ) {
|
117 |
global $capsman;
|
118 |
+
|
119 |
// Run the plugin
|
120 |
require_once ( dirname(__FILE__) . '/framework/lib/formating.php' );
|
121 |
require_once ( dirname(__FILE__) . '/framework/lib/users.php' );
|
126 |
load_plugin_textdomain('capsman-enhanced', false, basename(dirname(__FILE__)) .'/lang');
|
127 |
add_action( 'admin_menu', 'cme_submenus', 20 );
|
128 |
}
|
129 |
+
|
130 |
+
if (is_admin() && !defined('PUBLISHPRESS_CAPS_PRO_VERSION')) {
|
131 |
+
require_once(__DIR__ . '/includes/CoreAdmin.php');
|
132 |
+
new \PublishPress\Capabilities\CoreAdmin();
|
133 |
+
}
|
134 |
}
|
135 |
|
136 |
add_action( 'init', '_cme_init' );
|
141 |
// @todo: do this in PP Core also
|
142 |
|
143 |
if ( is_multisite() )
|
144 |
+
require_once ( dirname(__FILE__) . '/includes/network.php' );
|
composer.json
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "publishpress/publishpress-capabilities",
|
3 |
+
"type": "wordpress-plugin",
|
4 |
+
"description": "",
|
5 |
+
"license": "GPL-2",
|
6 |
+
"authors": [
|
7 |
+
{
|
8 |
+
"name": "PublishPress",
|
9 |
+
"email": "help@publishpress.com"
|
10 |
+
}
|
11 |
+
],
|
12 |
+
"config": {
|
13 |
+
"preferred-install": "dist"
|
14 |
+
},
|
15 |
+
"minimum-stability": "stable",
|
16 |
+
"require": {
|
17 |
+
"php": ">=5.6.20",
|
18 |
+
"publishpress/wordpress-version-notices": "dev-master"
|
19 |
+
}
|
20 |
+
}
|
includes/CoreAdmin.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace PublishPress\Capabilities;
|
3 |
+
|
4 |
+
class CoreAdmin {
|
5 |
+
function __construct() {
|
6 |
+
add_action('admin_print_scripts', [$this, 'setUpgradeMenuLink'], 50);
|
7 |
+
|
8 |
+
if (is_admin()) {
|
9 |
+
$autoloadPath = PUBLISHPRESS_CAPS_ABSPATH . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
|
10 |
+
if (file_exists($autoloadPath)) {
|
11 |
+
require_once $autoloadPath;
|
12 |
+
}
|
13 |
+
|
14 |
+
require_once PUBLISHPRESS_CAPS_ABSPATH . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'publishpress' . DIRECTORY_SEPARATOR
|
15 |
+
. 'wordpress-version-notices' . DIRECTORY_SEPARATOR . 'includes.php';
|
16 |
+
|
17 |
+
add_filter(\PPVersionNotices\Module\TopNotice\Module::SETTINGS_FILTER, function ($settings) {
|
18 |
+
$settings['capabilities'] = [
|
19 |
+
'message' => 'You\'re using PublishPress Capabilities Free. The Pro version has more features and support. %sUpgrade to Pro%s',
|
20 |
+
'link' => 'https://publishpress.com/links/capabilities-banner',
|
21 |
+
'screens' => [
|
22 |
+
['base' => 'toplevel_page_capsman'],
|
23 |
+
['base' => 'capabilities_page_capsman-tool'],
|
24 |
+
['base' => 'capabilities_page_capability-settings'],
|
25 |
+
]
|
26 |
+
];
|
27 |
+
|
28 |
+
return $settings;
|
29 |
+
});
|
30 |
+
}
|
31 |
+
}
|
32 |
+
|
33 |
+
function setUpgradeMenuLink() {
|
34 |
+
$url = 'https://publishpress.com/links/capabilities-menu';
|
35 |
+
?>
|
36 |
+
<style type="text/css">
|
37 |
+
#toplevel_page_capsman ul li:last-of-type a {font-weight: bold !important; color: #FEB123 !important;}
|
38 |
+
</style>
|
39 |
+
|
40 |
+
<script type="text/javascript">
|
41 |
+
jQuery(document).ready(function($) {
|
42 |
+
$('#toplevel_page_capsman ul li:last a').attr('href', '<?php echo $url;?>').attr('target', '_blank').css('font-weight', 'bold').css('color', '#FEB123');
|
43 |
+
});
|
44 |
+
</script>
|
45 |
+
<?php
|
46 |
+
}
|
47 |
+
}
|
includes/admin.php
CHANGED
@@ -1,1205 +1,1208 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* General Admin for Role Capabilities.
|
4 |
-
* Provides admin pages to create and manage roles and capabilities.
|
5 |
-
*
|
6 |
-
* @author Jordi Canals, Kevin Behrens
|
7 |
-
* @copyright Copyright (C) 2009, 2010 Jordi Canals, (C) 2020 PublishPress
|
8 |
-
* @license GNU General Public License version 2
|
9 |
-
* @link https://publishpress.com
|
10 |
-
*
|
11 |
-
*
|
12 |
-
* Copyright 2009, 2010 Jordi Canals <devel@jcanals.cat>
|
13 |
-
* Modifications Copyright 2020, PublishPress <help@publishpress.com>
|
14 |
-
*
|
15 |
-
* This program is free software; you can redistribute it and/or
|
16 |
-
* modify it under the terms of the GNU General Public License
|
17 |
-
* version 2 as published by the Free Software Foundation.
|
18 |
-
*
|
19 |
-
* This program is distributed in the hope that it will be useful,
|
20 |
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
21 |
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
22 |
-
* GNU General Public License for more details.
|
23 |
-
*
|
24 |
-
* You should have received a copy of the GNU General Public License
|
25 |
-
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
26 |
-
**/
|
27 |
-
|
28 |
-
global $capsman, $cme_cap_helper, $current_user;
|
29 |
-
|
30 |
-
do_action('publishpress-caps_manager-load');
|
31 |
-
|
32 |
-
$roles = $this->roles;
|
33 |
-
$default = $this->current;
|
34 |
-
|
35 |
-
if ( $block_read_removal = _cme_is_read_removal_blocked( $this->current ) ) {
|
36 |
-
if ( $current = get_role($default) ) {
|
37 |
-
if ( empty( $current->capabilities['read'] ) ) {
|
38 |
-
ak_admin_error( sprintf( __( 'Warning: This role cannot access the dashboard without the read capability. %1$sClick here to fix this now%2$s.', 'capsman-enhanced' ), '<a href="javascript:void(0)" class="cme-fix-read-cap">', '</a>' ) );
|
39 |
-
}
|
40 |
-
}
|
41 |
-
}
|
42 |
-
|
43 |
-
require_once( dirname(__FILE__).'/pp-ui.php' );
|
44 |
-
$pp_ui = new Capsman_PP_UI();
|
45 |
-
|
46 |
-
if( defined('PRESSPERMIT_ACTIVE') ) {
|
47 |
-
$pp_metagroup_caps = $pp_ui->get_metagroup_caps( $default );
|
48 |
-
} else {
|
49 |
-
$pp_metagroup_caps = array();
|
50 |
-
}
|
51 |
-
?>
|
52 |
-
<div class="wrap publishpress-caps-manage pressshack-admin-wrapper">
|
53 |
-
<?php if( defined('PRESSPERMIT_ACTIVE') ) :
|
54 |
-
pp_icon();
|
55 |
-
$style = 'style="height:60px;"';
|
56 |
-
?>
|
57 |
-
<?php else:
|
58 |
-
$style = '';
|
59 |
-
?>
|
60 |
-
<div id="icon-capsman-admin" class="icon32"></div>
|
61 |
-
<?php endif; ?>
|
62 |
-
|
63 |
-
<h1 <?php echo $style;?>><?php _e('Role Capabilities', 'capsman-enhanced') ?></h1>
|
64 |
-
|
65 |
-
<form id="publishpress_caps_form" method="post" action="admin.php?page=<?php echo $this->ID ?>">
|
66 |
-
<?php wp_nonce_field('capsman-general-manager'); ?>
|
67 |
-
<fieldset>
|
68 |
-
<table id="akmin">
|
69 |
-
<tr>
|
70 |
-
<td class="content">
|
71 |
-
<dl>
|
72 |
-
<dt>
|
73 |
-
<?php
|
74 |
-
$role_caption = (defined('PUBLISHPRESS_VERSION'))
|
75 |
-
? '<a href="' . admin_url("admin.php?page=pp-manage-roles&action=edit-role&role-id={$this->current}") . '">' . translate_user_role($roles[$default]) . '</a>'
|
76 |
-
: translate_user_role($roles[$default]);
|
77 |
-
|
78 |
-
printf(__('Capabilities for %s', 'capsman-enhanced'), $role_caption);
|
79 |
-
?>
|
80 |
-
</dt>
|
81 |
-
|
82 |
-
<dd>
|
83 |
-
<div style="float:right">
|
84 |
-
<input type="submit" name="SaveRole" value="<?php _e('Save Changes', 'capsman-enhanced') ?>" class="button-primary" />
|
85 |
-
</div>
|
86 |
-
|
87 |
-
<?php
|
88 |
-
global $capsman;
|
89 |
-
$img_url = $capsman->mod_url . '/images/';
|
90 |
-
?>
|
91 |
-
<div class="publishpress-headline">
|
92 |
-
<span class="cme-subtext">
|
93 |
-
<?php
|
94 |
-
$msg = __( '<strong>Note:</strong> Capability changes <strong>remain in the database</strong> after plugin deactivation.', 'capsman-enhanced' );
|
95 |
-
|
96 |
-
if (defined('PRESSPERMIT_ACTIVE') && function_exists('presspermit')) {
|
97 |
-
if ($group = presspermit()->groups()->getMetagroup('wp_role', $this->current)) {
|
98 |
-
$msg = sprintf(
|
99 |
-
__('<strong>Note:</strong> Capability changes <strong>remain in the database</strong> after plugin deactivation. You can also configure this role as a %sPermission Group%s.', 'capsman-enhanced'),
|
100 |
-
'<a href="' . admin_url("admin.php?page=presspermit-edit-permissions&action=edit&agent_id={$group->ID}") . '">',
|
101 |
-
'</a>'
|
102 |
-
);
|
103 |
-
}
|
104 |
-
}
|
105 |
-
echo $msg;
|
106 |
-
?>
|
107 |
-
</span>
|
108 |
-
</div>
|
109 |
-
|
110 |
-
<?php
|
111 |
-
if ( defined( 'PRESSPERMIT_ACTIVE' ) ) {
|
112 |
-
$pp_ui->show_capability_hints( $default );
|
113 |
-
}
|
114 |
-
?>
|
115 |
-
|
116 |
-
<script type="text/javascript">
|
117 |
-
/* <![CDATA[ */
|
118 |
-
jQuery(document).ready( function($) {
|
119 |
-
$('a[href="#pp-more"]').click( function() {
|
120 |
-
$('#pp_features').show();
|
121 |
-
return false;
|
122 |
-
});
|
123 |
-
$('a[href="#pp-hide"]').click( function() {
|
124 |
-
$('#pp_features').hide();
|
125 |
-
return false;
|
126 |
-
});
|
127 |
-
});
|
128 |
-
/* ]]> */
|
129 |
-
</script>
|
130 |
-
|
131 |
-
<?php /* play.png icon by Pavel: http://kde-look.org/usermanager/search.php?username=InFeRnODeMoN */ ?>
|
132 |
-
|
133 |
-
<br /><div id="pp_features" style="display:none"><div class="pp-logo"><a href="https://publishpress.com/presspermit/"><img src="<?php echo $img_url;?>pp-logo.png" alt="<?php _e('PublishPress Permissions', 'capsman-enhanced');?>" /></a></div><div class="features-wrap"><ul class="pp-features">
|
134 |
-
<li>
|
135 |
-
<?php _e( "Automatically define type-specific capabilities for your custom post types and taxonomies", 'capsman-enhanced' );?>
|
136 |
-
<a href="https://presspermit.com/tutorial/regulate-post-type-access" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
137 |
-
|
138 |
-
<li>
|
139 |
-
<?php _e( "Assign standard WP roles supplementally for a specific post type", 'capsman-enhanced' );?>
|
140 |
-
<a href="https://presspermit.com/tutorial/regulate-post-type-access" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
141 |
-
|
142 |
-
<li>
|
143 |
-
<?php _e( "Assign custom WP roles supplementally for a specific post type <em>(Pro)</em>", 'capsman-enhanced' );?>
|
144 |
-
</li>
|
145 |
-
|
146 |
-
<li>
|
147 |
-
<?php _e( "Customize reading permissions per-category or per-post", 'capsman-enhanced' );?>
|
148 |
-
<a href="https://presspermit.com/tutorial/category-exceptions" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
149 |
-
|
150 |
-
<li>
|
151 |
-
<?php _e( "Customize editing permissions per-category or per-post <em>(Pro)</em>", 'capsman-enhanced' );?>
|
152 |
-
<a href="https://presspermit.com/tutorial/page-editing-exceptions" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
153 |
-
|
154 |
-
<li>
|
155 |
-
<?php _e( "Custom Post Visibility statuses, fully implemented throughout wp-admin <em>(Pro)</em>", 'capsman-enhanced' );?>
|
156 |
-
<a href="https://presspermit.com/tutorial/custom-post-visibility" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
157 |
-
|
158 |
-
<li>
|
159 |
-
<?php _e( "Custom Moderation statuses for access-controlled, multi-step publishing workflow <em>(Pro)</em>", 'capsman-enhanced' );?>
|
160 |
-
<a href="https://presspermit.com/tutorial/multi-step-moderation" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
161 |
-
|
162 |
-
<li>
|
163 |
-
<?php _e( "Regulate permissions for Edit Flow post statuses <em>(Pro)</em>", 'capsman-enhanced' );?>
|
164 |
-
<a href="https://presspermit.com/tutorial/edit-flow-integration" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
165 |
-
|
166 |
-
<li>
|
167 |
-
<?php _e( "Customize the moderated editing of published content with Revisionary or Post Forking <em>(Pro)</em>", 'capsman-enhanced' );?>
|
168 |
-
<a href="https://presspermit.com/tutorial/published-content-revision" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
169 |
-
|
170 |
-
<li>
|
171 |
-
<?php _e( "Grant Spectator, Participant or Moderator access to specific bbPress forums <em>(Pro)</em>", 'capsman-enhanced' );?>
|
172 |
-
</li>
|
173 |
-
|
174 |
-
<li>
|
175 |
-
<?php _e( "Grant supplemental content permissions to a BuddyPress group <em>(Pro)</em>", 'capsman-enhanced' );?>
|
176 |
-
<a href="https://presspermit.com/tutorial/buddypress-content-permissions" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
177 |
-
|
178 |
-
<li>
|
179 |
-
<?php _e( "WPML integration to mirror permissions to translations <em>(Pro)</em>", 'capsman-enhanced' );?>
|
180 |
-
</li>
|
181 |
-
|
182 |
-
<li>
|
183 |
-
<?php _e( "Member support forum", 'capsman-enhanced' );?>
|
184 |
-
</li>
|
185 |
-
|
186 |
-
</ul></div>
|
187 |
-
|
188 |
-
<?php
|
189 |
-
echo '<div>';
|
190 |
-
printf( __('%1$sgrab%2$s %3$s', 'capsman-enhanced'), '<strong>', '</strong>', '<span class="plugins update-message"><a href="' . cme_plugin_info_url('press-permit-core') . '" class="thickbox" title="' . sprintf( __('%s (free install)', 'capsman-enhanced'), 'Permissions Pro' ) . '">Permissions Pro</a></span>' );
|
191 |
-
echo ' • ';
|
192 |
-
printf( __('%1$sbuy%2$s %3$s', 'capsman-enhanced'), '<strong>', '</strong>', '<a href="https://publishpress.com/presspermit/" target="_blank" title="' . sprintf( __('%s info/purchase', 'capsman-enhanced'), 'Permissions Pro' ) . '">Permissions Pro</a>' );
|
193 |
-
echo ' • ';
|
194 |
-
echo '<a href="#pp-hide">hide</a>';
|
195 |
-
echo '</div></div>';
|
196 |
-
|
197 |
-
if ( MULTISITE ) {
|
198 |
-
global $wp_roles;
|
199 |
-
global $wpdb;
|
200 |
-
|
201 |
-
if ( ! empty($_REQUEST['cme_net_sync_role'] ) ) {
|
202 |
-
switch_to_blog(1);
|
203 |
-
wp_cache_delete( $wpdb->prefix . 'user_roles', 'options' );
|
204 |
-
}
|
205 |
-
|
206 |
-
( method_exists( $wp_roles, 'for_site' ) ) ? $wp_roles->for_site() : $wp_roles->reinit();
|
207 |
-
}
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
$
|
218 |
-
|
219 |
-
|
220 |
-
$defined = array();
|
221 |
-
$defined['
|
222 |
-
|
223 |
-
|
224 |
-
$unfiltered['
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
$
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
$cap_properties['edit']['type'][]
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
$cap_properties['delete']['type'] = array( '
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
$cap_properties['read']['
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
'' => __( '
|
270 |
-
'
|
271 |
-
'
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
'
|
277 |
-
'
|
278 |
-
'
|
279 |
-
'
|
280 |
-
'
|
281 |
-
'
|
282 |
-
'
|
283 |
-
'
|
284 |
-
'
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
'
|
290 |
-
|
291 |
-
|
292 |
-
$
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
echo '<
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
$
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
$prop = str_replace( '
|
337 |
-
$prop = str_replace( '
|
338 |
-
$
|
339 |
-
$
|
340 |
-
$
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
$row .=
|
364 |
-
$row .= '
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
$
|
371 |
-
$
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
||
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
&& ( ! in_array( $prop, array( '
|
381 |
-
|
382 |
-
|
383 |
-
|
384 |
-
||
|
385 |
-
||
|
386 |
-
|| $type_obj->cap->$prop == str_replace( '_terms', "_
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
||
|
392 |
-
||
|
393 |
-
|| $type_obj->cap->$prop ==
|
394 |
-
|| $type_obj->cap->$prop == str_replace( '
|
395 |
-
|| $type_obj->cap->$prop == str_replace( '
|
396 |
-
|| $type_obj->cap->$prop == str_replace( '
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
-
|
401 |
-
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
$
|
423 |
-
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
$
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
|
433 |
-
|
434 |
-
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
|
443 |
-
|
444 |
-
|
445 |
-
|
446 |
-
|
447 |
-
|
448 |
-
|
449 |
-
|
450 |
-
|
451 |
-
|
452 |
-
|
453 |
-
$type_metacaps[$type_obj->cap->
|
454 |
-
$type_metacaps[$type_obj->cap->
|
455 |
-
|
456 |
-
|
457 |
-
|
458 |
-
$type_metacaps[$type_obj->cap->
|
459 |
-
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
$row
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
-
|
473 |
-
|
474 |
-
|
475 |
-
|
476 |
-
|
477 |
-
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
|
485 |
-
|
486 |
-
|
487 |
-
|
488 |
-
|
489 |
-
|
490 |
-
|
491 |
-
|
492 |
-
|
493 |
-
|
494 |
-
|
495 |
-
|
496 |
-
|
497 |
-
|
498 |
-
|
499 |
-
|
500 |
-
echo '<
|
501 |
-
|
502 |
-
|
503 |
-
$
|
504 |
-
|
505 |
-
|
506 |
-
$core_caps
|
507 |
-
|
508 |
-
|
509 |
-
|
510 |
-
|
511 |
-
|
512 |
-
|
513 |
-
|
514 |
-
|
515 |
-
|
516 |
-
|
517 |
-
|
518 |
-
|
519 |
-
|
520 |
-
|
521 |
-
|
522 |
-
$
|
523 |
-
|
524 |
-
|
525 |
-
|
526 |
-
|
527 |
-
|
528 |
-
$
|
529 |
-
$
|
530 |
-
$
|
531 |
-
|
532 |
-
|
533 |
-
|
534 |
-
|
535 |
-
|
536 |
-
|
537 |
-
|
538 |
-
$
|
539 |
-
$
|
540 |
-
|
541 |
-
|
542 |
-
|
543 |
-
|
544 |
-
|
545 |
-
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
?>
|
550 |
-
<
|
551 |
-
|
552 |
-
|
553 |
-
|
554 |
-
|
555 |
-
|
556 |
-
|
557 |
-
|
558 |
-
|
559 |
-
|
560 |
-
|
561 |
-
|
562 |
-
|
563 |
-
|
564 |
-
|
565 |
-
|
566 |
-
|
567 |
-
|
568 |
-
|
569 |
-
|
570 |
-
|
571 |
-
|
572 |
-
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
577 |
-
|
578 |
-
|
579 |
-
|
580 |
-
|
581 |
-
|
582 |
-
<
|
583 |
-
<
|
584 |
-
<
|
585 |
-
|
586 |
-
</
|
587 |
-
|
588 |
-
|
589 |
-
|
590 |
-
|
591 |
-
$all_capabilities = apply_filters( '
|
592 |
-
|
593 |
-
|
594 |
-
|
595 |
-
$
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
|
605 |
-
'PublishPress'
|
606 |
-
|
607 |
-
'edit_metadata',
|
608 |
-
'edit_post_subscriptions',
|
609 |
-
'ppma_edit_orphan_post',
|
610 |
-
'pp_manage_roles',
|
611 |
-
'pp_set_notification_channel',
|
612 |
-
'pp_view_calendar',
|
613 |
-
'pp_view_content_overview',
|
614 |
-
'status_change',
|
615 |
-
)
|
616 |
-
)
|
617 |
-
|
618 |
-
|
619 |
-
|
620 |
-
|
621 |
-
'
|
622 |
-
|
623 |
-
|
624 |
-
|
625 |
-
|
626 |
-
|
627 |
-
|
628 |
-
'
|
629 |
-
'
|
630 |
-
'
|
631 |
-
'
|
632 |
-
'
|
633 |
-
'
|
634 |
-
'
|
635 |
-
'
|
636 |
-
'
|
637 |
-
'
|
638 |
-
'
|
639 |
-
'
|
640 |
-
'
|
641 |
-
'
|
642 |
-
'
|
643 |
-
'
|
644 |
-
'
|
645 |
-
'
|
646 |
-
'
|
647 |
-
'
|
648 |
-
'
|
649 |
-
'
|
650 |
-
'
|
651 |
-
'
|
652 |
-
|
653 |
-
|
654 |
-
|
655 |
-
|
656 |
-
|
657 |
-
'
|
658 |
-
|
659 |
-
|
660 |
-
|
661 |
-
|
662 |
-
|
663 |
-
|
664 |
-
|
665 |
-
'
|
666 |
-
'
|
667 |
-
'
|
668 |
-
'
|
669 |
-
'
|
670 |
-
'
|
671 |
-
'
|
672 |
-
'
|
673 |
-
'
|
674 |
-
'
|
675 |
-
'
|
676 |
-
'
|
677 |
-
'
|
678 |
-
'
|
679 |
-
'
|
680 |
-
'
|
681 |
-
'
|
682 |
-
'
|
683 |
-
'
|
684 |
-
'
|
685 |
-
'
|
686 |
-
'
|
687 |
-
'
|
688 |
-
'
|
689 |
-
'
|
690 |
-
'
|
691 |
-
'
|
692 |
-
'
|
693 |
-
'
|
694 |
-
'
|
695 |
-
'
|
696 |
-
'
|
697 |
-
'
|
698 |
-
'
|
699 |
-
'
|
700 |
-
'
|
701 |
-
'
|
702 |
-
'
|
703 |
-
'
|
704 |
-
'
|
705 |
-
'
|
706 |
-
'
|
707 |
-
'
|
708 |
-
'
|
709 |
-
'
|
710 |
-
'
|
711 |
-
'
|
712 |
-
'
|
713 |
-
'
|
714 |
-
'
|
715 |
-
'
|
716 |
-
'
|
717 |
-
'
|
718 |
-
'
|
719 |
-
'
|
720 |
-
'
|
721 |
-
'
|
722 |
-
'
|
723 |
-
'
|
724 |
-
'
|
725 |
-
'
|
726 |
-
'
|
727 |
-
'
|
728 |
-
'
|
729 |
-
'
|
730 |
-
'
|
731 |
-
'
|
732 |
-
'
|
733 |
-
'
|
734 |
-
'
|
735 |
-
'
|
736 |
-
'
|
737 |
-
'
|
738 |
-
'
|
739 |
-
'
|
740 |
-
'
|
741 |
-
|
742 |
-
|
743 |
-
|
744 |
-
|
745 |
-
|
746 |
-
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
751 |
-
|
752 |
-
|
753 |
-
|
754 |
-
|
755 |
-
|
756 |
-
|
757 |
-
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
-
|
762 |
-
|
763 |
-
|
764 |
-
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
|
769 |
-
if ( $
|
770 |
-
|
771 |
-
|
772 |
-
|
773 |
-
|
774 |
-
|
775 |
-
|
776 |
-
|
777 |
-
|
778 |
-
|
779 |
-
|
780 |
-
$class
|
781 |
-
|
782 |
-
|
783 |
-
$
|
784 |
-
|
785 |
-
|
786 |
-
|
787 |
-
|
788 |
-
|
789 |
-
|
790 |
-
|
791 |
-
|
792 |
-
|
793 |
-
echo
|
794 |
-
|
795 |
-
|
796 |
-
|
797 |
-
|
798 |
-
|
799 |
-
|
800 |
-
|
801 |
-
<?php
|
802 |
-
|
803 |
-
|
804 |
-
|
805 |
-
|
806 |
-
|
807 |
-
|
808 |
-
|
809 |
-
|
810 |
-
|
811 |
-
|
812 |
-
|
813 |
-
|
814 |
-
|
815 |
-
|
816 |
-
|
817 |
-
|
818 |
-
|
819 |
-
|
820 |
-
<
|
821 |
-
|
822 |
-
|
823 |
-
|
824 |
-
</
|
825 |
-
|
826 |
-
|
827 |
-
|
828 |
-
|
829 |
-
|
830 |
-
|
831 |
-
<
|
832 |
-
|
833 |
-
|
834 |
-
|
835 |
-
|
836 |
-
|
837 |
-
|
838 |
-
|
839 |
-
|
840 |
-
|
841 |
-
|
842 |
-
|
843 |
-
|
844 |
-
|
845 |
-
|
846 |
-
|
847 |
-
|
848 |
-
|
849 |
-
|
850 |
-
|
851 |
-
|
852 |
-
|
853 |
-
|
854 |
-
|
855 |
-
|
856 |
-
|
857 |
-
|
858 |
-
|
859 |
-
|
860 |
-
|
861 |
-
|
862 |
-
|
863 |
-
|
864 |
-
|
865 |
-
|
866 |
-
|
867 |
-
|
868 |
-
|
869 |
-
|
870 |
-
|
871 |
-
|
872 |
-
|
873 |
-
|
874 |
-
|
875 |
-
$class
|
876 |
-
|
877 |
-
|
878 |
-
$
|
879 |
-
|
880 |
-
|
881 |
-
|
882 |
-
|
883 |
-
|
884 |
-
|
885 |
-
|
886 |
-
|
887 |
-
|
888 |
-
|
889 |
-
|
890 |
-
|
891 |
-
|
892 |
-
|
893 |
-
|
894 |
-
|
895 |
-
|
896 |
-
|
897 |
-
echo
|
898 |
-
|
899 |
-
|
900 |
-
|
901 |
-
|
902 |
-
|
903 |
-
|
904 |
-
|
905 |
-
|
906 |
-
|
907 |
-
|
908 |
-
|
909 |
-
|
910 |
-
|
911 |
-
|
912 |
-
|
913 |
-
|
914 |
-
|
915 |
-
|
916 |
-
|
917 |
-
|
918 |
-
|
919 |
-
|
920 |
-
|
921 |
-
|
922 |
-
|
923 |
-
|
924 |
-
|
925 |
-
|
926 |
-
|
927 |
-
|
928 |
-
|
929 |
-
<
|
930 |
-
|
931 |
-
|
932 |
-
|
933 |
-
</
|
934 |
-
|
935 |
-
|
936 |
-
|
937 |
-
|
938 |
-
|
939 |
-
|
940 |
-
|
941 |
-
|
942 |
-
<
|
943 |
-
|
944 |
-
|
945 |
-
|
946 |
-
|
947 |
-
|
948 |
-
|
949 |
-
|
950 |
-
|
951 |
-
|
952 |
-
|
953 |
-
|
954 |
-
|
955 |
-
|
956 |
-
|
957 |
-
if ( !
|
958 |
-
continue;
|
959 |
-
|
960 |
-
|
961 |
-
|
962 |
-
|
963 |
-
|
964 |
-
|
965 |
-
|
966 |
-
|
967 |
-
|
968 |
-
|
969 |
-
|
970 |
-
|
971 |
-
|
972 |
-
$class
|
973 |
-
|
974 |
-
|
975 |
-
$
|
976 |
-
|
977 |
-
|
978 |
-
|
979 |
-
|
980 |
-
|
981 |
-
|
982 |
-
|
983 |
-
|
984 |
-
echo
|
985 |
-
|
986 |
-
|
987 |
-
|
988 |
-
|
989 |
-
|
990 |
-
|
991 |
-
|
992 |
-
|
993 |
-
|
994 |
-
|
995 |
-
|
996 |
-
|
997 |
-
|
998 |
-
|
999 |
-
|
1000 |
-
|
1001 |
-
|
1002 |
-
|
1003 |
-
|
1004 |
-
|
1005 |
-
|
1006 |
-
|
1007 |
-
|
1008 |
-
|
1009 |
-
|
1010 |
-
|
1011 |
-
|
1012 |
-
|
1013 |
-
|
1014 |
-
|
1015 |
-
|
1016 |
-
<
|
1017 |
-
|
1018 |
-
|
1019 |
-
|
1020 |
-
</
|
1021 |
-
|
1022 |
-
|
1023 |
-
|
1024 |
-
|
1025 |
-
|
1026 |
-
|
1027 |
-
|
1028 |
-
|
1029 |
-
|
1030 |
-
|
1031 |
-
|
1032 |
-
|
1033 |
-
|
1034 |
-
|
1035 |
-
|
1036 |
-
|
1037 |
-
|
1038 |
-
</
|
1039 |
-
|
1040 |
-
|
1041 |
-
|
1042 |
-
|
1043 |
-
|
1044 |
-
|
1045 |
-
|
1046 |
-
|
1047 |
-
|
1048 |
-
|
1049 |
-
|
1050 |
-
|
1051 |
-
|
1052 |
-
|
1053 |
-
|
1054 |
-
|
1055 |
-
|
1056 |
-
|
1057 |
-
|
1058 |
-
|
1059 |
-
|
1060 |
-
|
1061 |
-
|
1062 |
-
|
1063 |
-
|
1064 |
-
|
1065 |
-
|
1066 |
-
|
1067 |
-
|
1068 |
-
|
1069 |
-
|
1070 |
-
|
1071 |
-
|
1072 |
-
|
1073 |
-
|
1074 |
-
|
1075 |
-
|
1076 |
-
|
1077 |
-
|
1078 |
-
|
1079 |
-
|
1080 |
-
|
1081 |
-
|
1082 |
-
|
1083 |
-
|
1084 |
-
|
1085 |
-
|
1086 |
-
|
1087 |
-
|
1088 |
-
|
1089 |
-
|
1090 |
-
|
1091 |
-
|
1092 |
-
|
1093 |
-
<?php
|
1094 |
-
<
|
1095 |
-
|
1096 |
-
|
1097 |
-
<
|
1098 |
-
|
1099 |
-
|
1100 |
-
|
1101 |
-
|
1102 |
-
|
1103 |
-
|
1104 |
-
|
1105 |
-
|
1106 |
-
|
1107 |
-
|
1108 |
-
|
1109 |
-
<?php
|
1110 |
-
<
|
1111 |
-
|
1112 |
-
|
1113 |
-
<
|
1114 |
-
|
1115 |
-
|
1116 |
-
|
1117 |
-
|
1118 |
-
|
1119 |
-
|
1120 |
-
|
1121 |
-
|
1122 |
-
|
1123 |
-
|
1124 |
-
|
1125 |
-
|
1126 |
-
|
1127 |
-
|
1128 |
-
|
1129 |
-
|
1130 |
-
|
1131 |
-
|
1132 |
-
|
1133 |
-
|
1134 |
-
|
1135 |
-
|
1136 |
-
|
1137 |
-
|
1138 |
-
|
1139 |
-
|
1140 |
-
|
1141 |
-
<li><a href="
|
1142 |
-
</li>
|
1143 |
-
|
1144 |
-
|
1145 |
-
|
1146 |
-
|
1147 |
-
|
1148 |
-
|
1149 |
-
|
1150 |
-
|
1151 |
-
|
1152 |
-
|
1153 |
-
|
1154 |
-
|
1155 |
-
|
1156 |
-
|
1157 |
-
|
1158 |
-
|
1159 |
-
|
1160 |
-
|
1161 |
-
|
1162 |
-
|
1163 |
-
|
1164 |
-
|
1165 |
-
|
1166 |
-
|
1167 |
-
|
1168 |
-
|
1169 |
-
|
1170 |
-
</
|
1171 |
-
|
1172 |
-
|
1173 |
-
|
1174 |
-
|
1175 |
-
|
1176 |
-
|
1177 |
-
|
1178 |
-
|
1179 |
-
|
1180 |
-
|
1181 |
-
|
1182 |
-
|
1183 |
-
|
1184 |
-
|
1185 |
-
|
1186 |
-
|
1187 |
-
|
1188 |
-
|
1189 |
-
|
1190 |
-
|
1191 |
-
|
1192 |
-
|
1193 |
-
|
1194 |
-
<div>
|
1195 |
-
<label for="
|
1196 |
-
</div>
|
1197 |
-
|
1198 |
-
<?php
|
1199 |
-
|
1200 |
-
|
1201 |
-
|
1202 |
-
|
1203 |
-
|
1204 |
-
|
1205 |
-
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* General Admin for Role Capabilities.
|
4 |
+
* Provides admin pages to create and manage roles and capabilities.
|
5 |
+
*
|
6 |
+
* @author Jordi Canals, Kevin Behrens
|
7 |
+
* @copyright Copyright (C) 2009, 2010 Jordi Canals, (C) 2020 PublishPress
|
8 |
+
* @license GNU General Public License version 2
|
9 |
+
* @link https://publishpress.com
|
10 |
+
*
|
11 |
+
*
|
12 |
+
* Copyright 2009, 2010 Jordi Canals <devel@jcanals.cat>
|
13 |
+
* Modifications Copyright 2020, PublishPress <help@publishpress.com>
|
14 |
+
*
|
15 |
+
* This program is free software; you can redistribute it and/or
|
16 |
+
* modify it under the terms of the GNU General Public License
|
17 |
+
* version 2 as published by the Free Software Foundation.
|
18 |
+
*
|
19 |
+
* This program is distributed in the hope that it will be useful,
|
20 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
21 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
22 |
+
* GNU General Public License for more details.
|
23 |
+
*
|
24 |
+
* You should have received a copy of the GNU General Public License
|
25 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
26 |
+
**/
|
27 |
+
|
28 |
+
global $capsman, $cme_cap_helper, $current_user;
|
29 |
+
|
30 |
+
do_action('publishpress-caps_manager-load');
|
31 |
+
|
32 |
+
$roles = $this->roles;
|
33 |
+
$default = $this->current;
|
34 |
+
|
35 |
+
if ( $block_read_removal = _cme_is_read_removal_blocked( $this->current ) ) {
|
36 |
+
if ( $current = get_role($default) ) {
|
37 |
+
if ( empty( $current->capabilities['read'] ) ) {
|
38 |
+
ak_admin_error( sprintf( __( 'Warning: This role cannot access the dashboard without the read capability. %1$sClick here to fix this now%2$s.', 'capsman-enhanced' ), '<a href="javascript:void(0)" class="cme-fix-read-cap">', '</a>' ) );
|
39 |
+
}
|
40 |
+
}
|
41 |
+
}
|
42 |
+
|
43 |
+
require_once( dirname(__FILE__).'/pp-ui.php' );
|
44 |
+
$pp_ui = new Capsman_PP_UI();
|
45 |
+
|
46 |
+
if( defined('PRESSPERMIT_ACTIVE') ) {
|
47 |
+
$pp_metagroup_caps = $pp_ui->get_metagroup_caps( $default );
|
48 |
+
} else {
|
49 |
+
$pp_metagroup_caps = array();
|
50 |
+
}
|
51 |
+
?>
|
52 |
+
<div class="wrap publishpress-caps-manage pressshack-admin-wrapper">
|
53 |
+
<?php if( defined('PRESSPERMIT_ACTIVE') ) :
|
54 |
+
pp_icon();
|
55 |
+
$style = 'style="height:60px;"';
|
56 |
+
?>
|
57 |
+
<?php else:
|
58 |
+
$style = '';
|
59 |
+
?>
|
60 |
+
<div id="icon-capsman-admin" class="icon32"></div>
|
61 |
+
<?php endif; ?>
|
62 |
+
|
63 |
+
<h1 <?php echo $style;?>><?php _e('Role Capabilities', 'capsman-enhanced') ?></h1>
|
64 |
+
|
65 |
+
<form id="publishpress_caps_form" method="post" action="admin.php?page=<?php echo $this->ID ?>">
|
66 |
+
<?php wp_nonce_field('capsman-general-manager'); ?>
|
67 |
+
<fieldset>
|
68 |
+
<table id="akmin">
|
69 |
+
<tr>
|
70 |
+
<td class="content">
|
71 |
+
<dl>
|
72 |
+
<dt>
|
73 |
+
<?php
|
74 |
+
$role_caption = (defined('PUBLISHPRESS_VERSION'))
|
75 |
+
? '<a href="' . admin_url("admin.php?page=pp-manage-roles&action=edit-role&role-id={$this->current}") . '">' . translate_user_role($roles[$default]) . '</a>'
|
76 |
+
: translate_user_role($roles[$default]);
|
77 |
+
|
78 |
+
printf(__('Capabilities for %s', 'capsman-enhanced'), $role_caption);
|
79 |
+
?>
|
80 |
+
</dt>
|
81 |
+
|
82 |
+
<dd>
|
83 |
+
<div style="float:right">
|
84 |
+
<input type="submit" name="SaveRole" value="<?php _e('Save Changes', 'capsman-enhanced') ?>" class="button-primary" />
|
85 |
+
</div>
|
86 |
+
|
87 |
+
<?php
|
88 |
+
global $capsman;
|
89 |
+
$img_url = $capsman->mod_url . '/images/';
|
90 |
+
?>
|
91 |
+
<div class="publishpress-headline">
|
92 |
+
<span class="cme-subtext">
|
93 |
+
<?php
|
94 |
+
$msg = __( '<strong>Note:</strong> Capability changes <strong>remain in the database</strong> after plugin deactivation.', 'capsman-enhanced' );
|
95 |
+
|
96 |
+
if (defined('PRESSPERMIT_ACTIVE') && function_exists('presspermit')) {
|
97 |
+
if ($group = presspermit()->groups()->getMetagroup('wp_role', $this->current)) {
|
98 |
+
$msg = sprintf(
|
99 |
+
__('<strong>Note:</strong> Capability changes <strong>remain in the database</strong> after plugin deactivation. You can also configure this role as a %sPermission Group%s.', 'capsman-enhanced'),
|
100 |
+
'<a href="' . admin_url("admin.php?page=presspermit-edit-permissions&action=edit&agent_id={$group->ID}") . '">',
|
101 |
+
'</a>'
|
102 |
+
);
|
103 |
+
}
|
104 |
+
}
|
105 |
+
echo $msg;
|
106 |
+
?>
|
107 |
+
</span>
|
108 |
+
</div>
|
109 |
+
|
110 |
+
<?php
|
111 |
+
if ( defined( 'PRESSPERMIT_ACTIVE' ) ) {
|
112 |
+
$pp_ui->show_capability_hints( $default );
|
113 |
+
}
|
114 |
+
?>
|
115 |
+
|
116 |
+
<script type="text/javascript">
|
117 |
+
/* <![CDATA[ */
|
118 |
+
jQuery(document).ready( function($) {
|
119 |
+
$('a[href="#pp-more"]').click( function() {
|
120 |
+
$('#pp_features').show();
|
121 |
+
return false;
|
122 |
+
});
|
123 |
+
$('a[href="#pp-hide"]').click( function() {
|
124 |
+
$('#pp_features').hide();
|
125 |
+
return false;
|
126 |
+
});
|
127 |
+
});
|
128 |
+
/* ]]> */
|
129 |
+
</script>
|
130 |
+
|
131 |
+
<?php /* play.png icon by Pavel: http://kde-look.org/usermanager/search.php?username=InFeRnODeMoN */ ?>
|
132 |
+
|
133 |
+
<br /><div id="pp_features" style="display:none"><div class="pp-logo"><a href="https://publishpress.com/presspermit/"><img src="<?php echo $img_url;?>pp-logo.png" alt="<?php _e('PublishPress Permissions', 'capsman-enhanced');?>" /></a></div><div class="features-wrap"><ul class="pp-features">
|
134 |
+
<li>
|
135 |
+
<?php _e( "Automatically define type-specific capabilities for your custom post types and taxonomies", 'capsman-enhanced' );?>
|
136 |
+
<a href="https://presspermit.com/tutorial/regulate-post-type-access" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
137 |
+
|
138 |
+
<li>
|
139 |
+
<?php _e( "Assign standard WP roles supplementally for a specific post type", 'capsman-enhanced' );?>
|
140 |
+
<a href="https://presspermit.com/tutorial/regulate-post-type-access" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
141 |
+
|
142 |
+
<li>
|
143 |
+
<?php _e( "Assign custom WP roles supplementally for a specific post type <em>(Pro)</em>", 'capsman-enhanced' );?>
|
144 |
+
</li>
|
145 |
+
|
146 |
+
<li>
|
147 |
+
<?php _e( "Customize reading permissions per-category or per-post", 'capsman-enhanced' );?>
|
148 |
+
<a href="https://presspermit.com/tutorial/category-exceptions" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
149 |
+
|
150 |
+
<li>
|
151 |
+
<?php _e( "Customize editing permissions per-category or per-post <em>(Pro)</em>", 'capsman-enhanced' );?>
|
152 |
+
<a href="https://presspermit.com/tutorial/page-editing-exceptions" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
153 |
+
|
154 |
+
<li>
|
155 |
+
<?php _e( "Custom Post Visibility statuses, fully implemented throughout wp-admin <em>(Pro)</em>", 'capsman-enhanced' );?>
|
156 |
+
<a href="https://presspermit.com/tutorial/custom-post-visibility" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
157 |
+
|
158 |
+
<li>
|
159 |
+
<?php _e( "Custom Moderation statuses for access-controlled, multi-step publishing workflow <em>(Pro)</em>", 'capsman-enhanced' );?>
|
160 |
+
<a href="https://presspermit.com/tutorial/multi-step-moderation" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
161 |
+
|
162 |
+
<li>
|
163 |
+
<?php _e( "Regulate permissions for Edit Flow post statuses <em>(Pro)</em>", 'capsman-enhanced' );?>
|
164 |
+
<a href="https://presspermit.com/tutorial/edit-flow-integration" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
165 |
+
|
166 |
+
<li>
|
167 |
+
<?php _e( "Customize the moderated editing of published content with Revisionary or Post Forking <em>(Pro)</em>", 'capsman-enhanced' );?>
|
168 |
+
<a href="https://presspermit.com/tutorial/published-content-revision" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
169 |
+
|
170 |
+
<li>
|
171 |
+
<?php _e( "Grant Spectator, Participant or Moderator access to specific bbPress forums <em>(Pro)</em>", 'capsman-enhanced' );?>
|
172 |
+
</li>
|
173 |
+
|
174 |
+
<li>
|
175 |
+
<?php _e( "Grant supplemental content permissions to a BuddyPress group <em>(Pro)</em>", 'capsman-enhanced' );?>
|
176 |
+
<a href="https://presspermit.com/tutorial/buddypress-content-permissions" target="_blank"><img class="cme-play" alt="*" src="<?php echo $img_url;?>play.png" /></a></li>
|
177 |
+
|
178 |
+
<li>
|
179 |
+
<?php _e( "WPML integration to mirror permissions to translations <em>(Pro)</em>", 'capsman-enhanced' );?>
|
180 |
+
</li>
|
181 |
+
|
182 |
+
<li>
|
183 |
+
<?php _e( "Member support forum", 'capsman-enhanced' );?>
|
184 |
+
</li>
|
185 |
+
|
186 |
+
</ul></div>
|
187 |
+
|
188 |
+
<?php
|
189 |
+
echo '<div>';
|
190 |
+
printf( __('%1$sgrab%2$s %3$s', 'capsman-enhanced'), '<strong>', '</strong>', '<span class="plugins update-message"><a href="' . cme_plugin_info_url('press-permit-core') . '" class="thickbox" title="' . sprintf( __('%s (free install)', 'capsman-enhanced'), 'Permissions Pro' ) . '">Permissions Pro</a></span>' );
|
191 |
+
echo ' • ';
|
192 |
+
printf( __('%1$sbuy%2$s %3$s', 'capsman-enhanced'), '<strong>', '</strong>', '<a href="https://publishpress.com/presspermit/" target="_blank" title="' . sprintf( __('%s info/purchase', 'capsman-enhanced'), 'Permissions Pro' ) . '">Permissions Pro</a>' );
|
193 |
+
echo ' • ';
|
194 |
+
echo '<a href="#pp-hide">hide</a>';
|
195 |
+
echo '</div></div>';
|
196 |
+
|
197 |
+
if ( MULTISITE ) {
|
198 |
+
global $wp_roles;
|
199 |
+
global $wpdb;
|
200 |
+
|
201 |
+
if ( ! empty($_REQUEST['cme_net_sync_role'] ) ) {
|
202 |
+
switch_to_blog(1);
|
203 |
+
wp_cache_delete( $wpdb->prefix . 'user_roles', 'options' );
|
204 |
+
}
|
205 |
+
|
206 |
+
( method_exists( $wp_roles, 'for_site' ) ) ? $wp_roles->for_site() : $wp_roles->reinit();
|
207 |
+
}
|
208 |
+
$capsman->reinstate_db_roles();
|
209 |
+
|
210 |
+
$current = get_role($default);
|
211 |
+
|
212 |
+
$rcaps = $current->capabilities;
|
213 |
+
|
214 |
+
$is_administrator = current_user_can( 'administrator' ) || (is_multisite() && is_super_admin());
|
215 |
+
|
216 |
+
$custom_types = get_post_types( array( '_builtin' => false ), 'names' );
|
217 |
+
$custom_tax = get_taxonomies( array( '_builtin' => false ), 'names' );
|
218 |
+
|
219 |
+
$defined = array();
|
220 |
+
$defined['type'] = get_post_types( array( 'public' => true, 'show_ui' => true ), 'object', 'or' );
|
221 |
+
$defined['taxonomy'] = get_taxonomies( array( 'public' => true ), 'object' );
|
222 |
+
|
223 |
+
$unfiltered['type'] = apply_filters( 'pp_unfiltered_post_types', array( 'forum','topic','reply','wp_block' ) ); // bbPress' dynamic role def requires additional code to enforce stored caps
|
224 |
+
$unfiltered['taxonomy'] = apply_filters( 'pp_unfiltered_taxonomies', array( 'post_status', 'topic-tag' ) ); // avoid confusion with Edit Flow administrative taxonomy
|
225 |
+
|
226 |
+
$enabled_taxonomies = cme_get_assisted_taxonomies();
|
227 |
+
|
228 |
+
/*
|
229 |
+
if ( ( count($custom_types) || count($custom_tax) ) && ( $is_administrator || current_user_can( 'manage_pp_settings' ) ) ) {
|
230 |
+
$cap_properties[''] = array();
|
231 |
+
$force_distinct_ui = true;
|
232 |
+
}
|
233 |
+
*/
|
234 |
+
|
235 |
+
$cap_properties['edit']['type'] = array( 'edit_posts' );
|
236 |
+
|
237 |
+
foreach( $defined['type'] as $type_obj ) {
|
238 |
+
if ( 'attachment' != $type_obj->name ) {
|
239 |
+
if ( isset( $type_obj->cap->create_posts ) && ( $type_obj->cap->create_posts != $type_obj->cap->edit_posts ) ) {
|
240 |
+
$cap_properties['edit']['type'][]= 'create_posts';
|
241 |
+
break;
|
242 |
+
}
|
243 |
+
}
|
244 |
+
}
|
245 |
+
|
246 |
+
$cap_properties['edit']['type'][]= 'edit_others_posts';
|
247 |
+
$cap_properties['edit']['type'] = array_merge( $cap_properties['edit']['type'], array( 'publish_posts', 'edit_published_posts', 'edit_private_posts' ) );
|
248 |
+
|
249 |
+
$cap_properties['edit']['taxonomy'] = array( 'manage_terms' );
|
250 |
+
|
251 |
+
if ( ! defined( 'OLD_PRESSPERMIT_ACTIVE' ) )
|
252 |
+
$cap_properties['edit']['taxonomy'] = array_merge( $cap_properties['edit']['taxonomy'], array( 'edit_terms', 'assign_terms' ) );
|
253 |
+
|
254 |
+
$cap_properties['delete']['type'] = array( 'delete_posts', 'delete_others_posts' );
|
255 |
+
$cap_properties['delete']['type'] = array_merge( $cap_properties['delete']['type'], array( 'delete_published_posts', 'delete_private_posts' ) );
|
256 |
+
|
257 |
+
if ( ! defined( 'OLD_PRESSPERMIT_ACTIVE' ) )
|
258 |
+
$cap_properties['delete']['taxonomy'] = array( 'delete_terms' );
|
259 |
+
else
|
260 |
+
$cap_properties['delete']['taxonomy'] = array();
|
261 |
+
|
262 |
+
$cap_properties['read']['type'] = array( 'read_private_posts' );
|
263 |
+
$cap_properties['read']['taxonomy'] = array();
|
264 |
+
|
265 |
+
$stati = get_post_stati( array( 'internal' => false ) );
|
266 |
+
|
267 |
+
$cap_type_names = array(
|
268 |
+
'' => __( ' ', 'capsman-enhanced' ),
|
269 |
+
'read' => __( 'Reading', 'capsman-enhanced' ),
|
270 |
+
'edit' => __( 'Editing Capabilities', 'capsman-enhanced' ),
|
271 |
+
'delete' => __( 'Deletion Capabilities', 'capsman-enhanced' )
|
272 |
+
);
|
273 |
+
|
274 |
+
$cap_tips = array(
|
275 |
+
'read_private' => __( 'can read posts which are currently published with private visibility', 'capsman-enhanced' ),
|
276 |
+
'edit' => __( 'has basic editing capability (but may need other capabilities based on post status and ownership)', 'capsman-enhanced' ),
|
277 |
+
'edit_others' => __( 'can edit posts which were created by other users', 'capsman-enhanced' ),
|
278 |
+
'edit_published' => __( 'can edit posts which are currently published', 'capsman-enhanced' ),
|
279 |
+
'edit_private' => __( 'can edit posts which are currently published with private visibility', 'capsman-enhanced' ),
|
280 |
+
'publish' => __( 'can make a post publicly visible', 'capsman-enhanced' ),
|
281 |
+
'delete' => __( 'has basic deletion capability (but may need other capabilities based on post status and ownership)', 'capsman-enhanced' ),
|
282 |
+
'delete_others' => __( 'can delete posts which were created by other users', 'capsman-enhanced' ),
|
283 |
+
'delete_published' => __( 'can delete posts which are currently published', 'capsman-enhanced' ),
|
284 |
+
'delete_private' => __( 'can delete posts which are currently published with private visibility', 'capsman-enhanced' ),
|
285 |
+
);
|
286 |
+
|
287 |
+
$default_caps = array( 'read_private_posts', 'edit_posts', 'edit_others_posts', 'edit_published_posts', 'edit_private_posts', 'publish_posts', 'delete_posts', 'delete_others_posts', 'delete_published_posts', 'delete_private_posts',
|
288 |
+
'read_private_pages', 'edit_pages', 'edit_others_pages', 'edit_published_pages', 'edit_private_pages', 'publish_pages', 'delete_pages', 'delete_others_pages', 'delete_published_pages', 'delete_private_pages',
|
289 |
+
'manage_categories'
|
290 |
+
);
|
291 |
+
$type_caps = array();
|
292 |
+
$type_metacaps = array();
|
293 |
+
|
294 |
+
// Role Scoper and PP1 adjust attachment access based only on user's capabilities for the parent post
|
295 |
+
if ( defined('OLD_PRESSPERMIT_ACTIVE') ) {
|
296 |
+
unset( $defined['type']['attachment'] );
|
297 |
+
}
|
298 |
+
|
299 |
+
echo '<ul class="cme-listhoriz">';
|
300 |
+
|
301 |
+
// cap_types: read, edit, deletion
|
302 |
+
foreach( array_keys($cap_properties) as $cap_type ) {
|
303 |
+
echo '<li>';
|
304 |
+
echo '<h3>' . $cap_type_names[$cap_type] . '</h3>';
|
305 |
+
|
306 |
+
echo "<div class='cme-cap-type-tables cme-cap-type-tables-$cap_type'>";
|
307 |
+
|
308 |
+
foreach( array_keys($defined) as $item_type ) {
|
309 |
+
if ( ( 'delete' == $cap_type ) && ( 'taxonomy' == $item_type ) ) {
|
310 |
+
if ( defined('OLD_PRESSPERMIT_ACTIVE') ) {
|
311 |
+
continue;
|
312 |
+
}
|
313 |
+
|
314 |
+
$any_term_deletion_caps = false;
|
315 |
+
foreach( array_keys($defined['taxonomy']) as $_tax ) {
|
316 |
+
if ( isset( $defined['taxonomy'][$_tax]->cap->delete_terms ) && ( 'manage_categories' != $defined['taxonomy'][$_tax]->cap->delete_terms ) && ! in_array( $_tax, $unfiltered['taxonomy'] ) ) {
|
317 |
+
$any_term_deletion_caps = true;
|
318 |
+
break;
|
319 |
+
}
|
320 |
+
}
|
321 |
+
|
322 |
+
if ( ! $any_term_deletion_caps )
|
323 |
+
continue;
|
324 |
+
}
|
325 |
+
|
326 |
+
if ( ! count( $cap_properties[$cap_type][$item_type] ) )
|
327 |
+
continue;
|
328 |
+
|
329 |
+
echo "<table class='cme-typecaps cme-typecaps-$cap_type'>";
|
330 |
+
|
331 |
+
echo '<tr><th></th>';
|
332 |
+
|
333 |
+
// label cap properties
|
334 |
+
foreach( $cap_properties[$cap_type][$item_type] as $prop ) {
|
335 |
+
$prop = str_replace( '_posts', '', $prop );
|
336 |
+
$prop = str_replace( '_pages', '', $prop );
|
337 |
+
$prop = str_replace( '_terms', '', $prop );
|
338 |
+
$tip = ( isset( $cap_tips[$prop] ) ) ? "title='{$cap_tips[$prop]}'" : '';
|
339 |
+
$prop = str_replace( '_', '<br />', $prop );
|
340 |
+
$th_class = ( 'taxonomy' == $item_type ) ? ' class="term-cap"' : ' class="post-cap"';
|
341 |
+
echo "<th $tip{$th_class}>";
|
342 |
+
|
343 |
+
if ( ( 'delete' != $prop ) || ( 'taxonomy' != $item_type ) || cme_get_detailed_taxonomies() ) {
|
344 |
+
echo ucwords($prop);
|
345 |
+
}
|
346 |
+
|
347 |
+
echo '</th>';
|
348 |
+
}
|
349 |
+
|
350 |
+
echo '</tr>';
|
351 |
+
|
352 |
+
foreach( $defined[$item_type] as $key => $type_obj ) {
|
353 |
+
if ( in_array( $key, $unfiltered[$item_type] ) )
|
354 |
+
continue;
|
355 |
+
|
356 |
+
$row = "<tr class='cme_type_{$key}'>";
|
357 |
+
|
358 |
+
if ( $cap_type ) {
|
359 |
+
if ( empty($force_distinct_ui) && empty( $cap_properties[$cap_type][$item_type] ) )
|
360 |
+
continue;
|
361 |
+
|
362 |
+
$row .= "<td><a class='cap_type' href='#toggle_type_caps'>" . $type_obj->labels->name . '</a>';
|
363 |
+
$row .= '<a href="#" class="neg-type-caps"> x </a>';
|
364 |
+
$row .= '</td>';
|
365 |
+
|
366 |
+
$display_row = ! empty($force_distinct_ui);
|
367 |
+
|
368 |
+
foreach( $cap_properties[$cap_type][$item_type] as $prop ) {
|
369 |
+
$td_classes = array();
|
370 |
+
$checkbox = '';
|
371 |
+
$title = '';
|
372 |
+
|
373 |
+
if ( ! empty($type_obj->cap->$prop) && ( in_array( $type_obj->name, array( 'post', 'page' ) )
|
374 |
+
|| ! in_array( $type_obj->cap->$prop, $default_caps )
|
375 |
+
|| ( ( 'manage_categories' == $type_obj->cap->$prop ) && ( 'manage_terms' == $prop ) && ( 'category' == $type_obj->name ) ) ) ) {
|
376 |
+
|
377 |
+
// if edit_published or edit_private cap is same as edit_posts cap, don't display a checkbox for it
|
378 |
+
if ( ( ! in_array( $prop, array( 'edit_published_posts', 'edit_private_posts', 'create_posts' ) ) || ( $type_obj->cap->$prop != $type_obj->cap->edit_posts ) )
|
379 |
+
&& ( ! in_array( $prop, array( 'delete_published_posts', 'delete_private_posts' ) ) || ( $type_obj->cap->$prop != $type_obj->cap->delete_posts ) )
|
380 |
+
&& ( ! in_array( $prop, array( 'edit_terms', 'delete_terms' ) ) || ( $type_obj->cap->$prop != $type_obj->cap->manage_terms ) )
|
381 |
+
|
382 |
+
&& ( ! in_array( $prop, array( 'manage_terms', 'edit_terms', 'delete_terms', 'assign_terms' ) )
|
383 |
+
|| empty($cme_cap_helper->all_taxonomy_caps[$type_obj->cap->$prop])
|
384 |
+
|| ( $cme_cap_helper->all_taxonomy_caps[ $type_obj->cap->$prop ] <= 1 )
|
385 |
+
|| $type_obj->cap->$prop == str_replace( '_terms', "_{$type_obj->name}s", $prop )
|
386 |
+
|| $type_obj->cap->$prop == str_replace( '_terms', "_" . _cme_get_plural($type_obj->name, $type_obj), $prop )
|
387 |
+
)
|
388 |
+
|
389 |
+
&& ( in_array( $prop, array( 'manage_terms', 'edit_terms', 'delete_terms', 'assign_terms' ) )
|
390 |
+
|| empty($cme_cap_helper->all_type_caps[$type_obj->cap->$prop])
|
391 |
+
|| ( $cme_cap_helper->all_type_caps[ $type_obj->cap->$prop ] <= 1 )
|
392 |
+
|| $type_obj->cap->$prop == 'upload_files' && 'create_posts' == $prop && 'attachment' == $type_obj->name
|
393 |
+
|| $type_obj->cap->$prop == str_replace( '_posts', "_{$type_obj->name}s", $prop )
|
394 |
+
|| $type_obj->cap->$prop == str_replace( '_pages', "_{$type_obj->name}s", $prop )
|
395 |
+
|| $type_obj->cap->$prop == str_replace( '_posts', "_" . _cme_get_plural($type_obj->name, $type_obj), $prop )
|
396 |
+
|| $type_obj->cap->$prop == str_replace( '_pages', "_" . _cme_get_plural($type_obj->name, $type_obj), $prop )
|
397 |
+
)
|
398 |
+
) {
|
399 |
+
// only present these term caps up top if we are ensuring that they get enforced separately from manage_terms
|
400 |
+
if ( in_array( $prop, array( 'edit_terms', 'delete_terms', 'assign_terms' ) ) && ( ! in_array( $type_obj->name, cme_get_detailed_taxonomies() ) || defined( 'OLD_PRESSPERMIT_ACTIVE' ) ) ) {
|
401 |
+
continue;
|
402 |
+
}
|
403 |
+
|
404 |
+
$cap_name = $type_obj->cap->$prop;
|
405 |
+
|
406 |
+
if ( 'taxonomy' == $item_type )
|
407 |
+
$td_classes []= "term-cap";
|
408 |
+
else
|
409 |
+
$td_classes []= "post-cap";
|
410 |
+
|
411 |
+
if ( ! empty($pp_metagroup_caps[$cap_name]) )
|
412 |
+
$td_classes []='cm-has-via-pp';
|
413 |
+
|
414 |
+
if ( $is_administrator || current_user_can($cap_name) ) {
|
415 |
+
if ( ! empty($pp_metagroup_caps[$cap_name]) ) {
|
416 |
+
$title = ' title="' . sprintf( __( '%s: assigned by Permission Group', 'capsman-enhanced' ), $cap_name ) . '"';
|
417 |
+
} else {
|
418 |
+
$title = ' title="' . $cap_name . '"';
|
419 |
+
}
|
420 |
+
|
421 |
+
$disabled = '';
|
422 |
+
$checked = checked(1, ! empty($rcaps[$cap_name]), false );
|
423 |
+
|
424 |
+
$checkbox = '<input type="checkbox"' . $title . ' name="caps[' . $cap_name . ']" value="1" ' . $checked . $disabled . ' />';
|
425 |
+
|
426 |
+
$type_caps [$cap_name] = true;
|
427 |
+
$display_row = true;
|
428 |
+
}
|
429 |
+
} else {
|
430 |
+
//$td_classes []= "cap-unreg";
|
431 |
+
$title = 'title="' . sprintf( __( 'shared capability: %s', 'capsman-enhanced' ), esc_attr( $type_obj->cap->$prop ) ) . '"';
|
432 |
+
}
|
433 |
+
|
434 |
+
if ( isset($rcaps[$cap_name]) && empty($rcaps[$cap_name]) ) {
|
435 |
+
$td_classes []= "cap-neg";
|
436 |
+
}
|
437 |
+
} else {
|
438 |
+
$td_classes []= "cap-unreg";
|
439 |
+
}
|
440 |
+
|
441 |
+
$td_class = ( $td_classes ) ? 'class="' . implode(' ', $td_classes) . '"' : '';
|
442 |
+
|
443 |
+
$row .= "<td $td_class $title><span class='cap-x'>X</span>$checkbox";
|
444 |
+
|
445 |
+
if ( false !== strpos( $td_class, 'cap-neg' ) )
|
446 |
+
$row .= '<input type="hidden" class="cme-negation-input" name="caps[' . $cap_name . ']" value="" />';
|
447 |
+
|
448 |
+
$row .= "</td>";
|
449 |
+
}
|
450 |
+
|
451 |
+
if ('type' == $item_type) {
|
452 |
+
$type_metacaps[$type_obj->cap->read_post] = true;
|
453 |
+
$type_metacaps[$type_obj->cap->edit_post] = isset($type_obj->cap->edit_posts) && ($type_obj->cap->edit_post != $type_obj->cap->edit_posts);
|
454 |
+
$type_metacaps[$type_obj->cap->delete_post] = isset($type_obj->cap->delete_posts) && ($type_obj->cap->delete_post != $type_obj->cap->delete_posts);
|
455 |
+
|
456 |
+
} elseif ('taxonomy' == $item_type && !empty($type_obj->cap->edit_term) && !empty($type_obj->cap->delete_term)) {
|
457 |
+
$type_metacaps[$type_obj->cap->edit_term] = true;
|
458 |
+
$type_metacaps[$type_obj->cap->delete_term] = true;
|
459 |
+
}
|
460 |
+
}
|
461 |
+
|
462 |
+
if ( $display_row ) {
|
463 |
+
$row .= '</tr>';
|
464 |
+
echo $row;
|
465 |
+
}
|
466 |
+
}
|
467 |
+
|
468 |
+
echo '</table>';
|
469 |
+
|
470 |
+
} // end foreach item type
|
471 |
+
|
472 |
+
echo '</div>';
|
473 |
+
|
474 |
+
echo '</li>';
|
475 |
+
}
|
476 |
+
|
477 |
+
|
478 |
+
do_action('publishpress-caps_manager_postcaps_section', compact('current', 'rcaps', 'pp_metagroup_caps', 'is_administrator', 'default_caps', 'custom_types', 'defined', 'unfiltered', 'pp_metagroup_caps'));
|
479 |
+
|
480 |
+
$type_caps = apply_filters('publishpress_caps_manager_typecaps', $type_caps);
|
481 |
+
|
482 |
+
echo '</ul>';
|
483 |
+
|
484 |
+
// clicking on post type name toggles corresponding checkbox selections
|
485 |
+
?>
|
486 |
+
<script type="text/javascript">
|
487 |
+
/* <![CDATA[ */
|
488 |
+
jQuery(document).ready( function($) {
|
489 |
+
$('a[href="#toggle_type_caps"]').click( function() {
|
490 |
+
var chks = $(this).closest('tr').find('input');
|
491 |
+
$(chks).prop( 'checked', ! $(chks).first().is(':checked') );
|
492 |
+
return false;
|
493 |
+
});
|
494 |
+
});
|
495 |
+
/* ]]> */
|
496 |
+
</script>
|
497 |
+
<?php
|
498 |
+
|
499 |
+
echo '<p> </p><h3>' . __( 'Other WordPress Core Capabilities', 'capsman-enhanced' ) . '</h3>';
|
500 |
+
echo '<table class="form-table cme-checklist"><tr>';
|
501 |
+
|
502 |
+
$checks_per_row = get_option( 'cme_form-rows', 5 );
|
503 |
+
$i = 0; $first_row = true;
|
504 |
+
|
505 |
+
$core_caps = _cme_core_caps();
|
506 |
+
foreach( array_keys($core_caps) as $cap_name ) {
|
507 |
+
if ( ! $is_administrator && ! current_user_can($cap_name) )
|
508 |
+
continue;
|
509 |
+
|
510 |
+
if ( $i == $checks_per_row ) {
|
511 |
+
echo '</tr><tr>';
|
512 |
+
$i = 0;
|
513 |
+
}
|
514 |
+
|
515 |
+
if ( ! isset( $rcaps[$cap_name] ) )
|
516 |
+
$class = 'cap-no';
|
517 |
+
else
|
518 |
+
$class = ( $rcaps[$cap_name] ) ? 'cap-yes' : 'cap-neg';
|
519 |
+
|
520 |
+
if ( ! empty($pp_metagroup_caps[$cap_name]) ) {
|
521 |
+
$class .= ' cap-metagroup';
|
522 |
+
$title_text = sprintf( __( '%s: assigned by Permission Group', 'capsman-enhanced' ), $cap_name );
|
523 |
+
} else {
|
524 |
+
$title_text = $cap_name;
|
525 |
+
}
|
526 |
+
|
527 |
+
$disabled = '';
|
528 |
+
$checked = checked(1, ! empty($rcaps[$cap_name]), false );
|
529 |
+
$lock_capability = false;
|
530 |
+
$title = $title_text;
|
531 |
+
|
532 |
+
if ( 'read' == $cap_name ) {
|
533 |
+
if ( ! empty( $block_read_removal ) ) {
|
534 |
+
// prevent the read capability from being removed from a core role, but don't force it to be added
|
535 |
+
if ( $checked || apply_filters( 'pp_caps_force_capability_storage', false, 'read', $default ) ) {
|
536 |
+
if ( apply_filters( 'pp_caps_lock_capability', true, 'read', $default ) ) {
|
537 |
+
$lock_capability = true;
|
538 |
+
$class .= ' cap-locked';
|
539 |
+
$disabled = 'disabled="disabled"';
|
540 |
+
if ( 'administrator' != $this->current ) {
|
541 |
+
$title = esc_attr( __('Lockout Prevention: To remove read capability, first remove WordPress admin / editing capabilities, or add "dashboard_lockout_ok" capability', 'capsman-enhanced' ) );
|
542 |
+
}
|
543 |
+
}
|
544 |
+
}
|
545 |
+
}
|
546 |
+
}
|
547 |
+
|
548 |
+
?>
|
549 |
+
<td class="<?php echo $class; ?>"><span class="cap-x">X</span><label title="<?php echo $title;?>"><input type="checkbox" name="caps[<?php echo $cap_name; ?>]" value="1" <?php echo $checked . $disabled;?> />
|
550 |
+
<span>
|
551 |
+
<?php
|
552 |
+
echo str_replace( '_', ' ', $cap_name );
|
553 |
+
?>
|
554 |
+
</span></label><a href="#" class="neg-cap"> x </a>
|
555 |
+
<?php if ( false !== strpos( $class, 'cap-neg' ) ) :?>
|
556 |
+
<input type="hidden" class="cme-negation-input" name="caps[<?php echo $cap_name; ?>]" value="" />
|
557 |
+
<?php endif; ?>
|
558 |
+
</td>
|
559 |
+
|
560 |
+
<?php
|
561 |
+
|
562 |
+
if ( $lock_capability ) {
|
563 |
+
echo '<input type="hidden" name="caps[' . $cap_name . ']" value="1" />';
|
564 |
+
}
|
565 |
+
|
566 |
+
++$i;
|
567 |
+
}
|
568 |
+
|
569 |
+
if ( $i == $checks_per_row ) {
|
570 |
+
echo '</tr>';
|
571 |
+
$i = 0;
|
572 |
+
} elseif ( ! $first_row ) {
|
573 |
+
// Now close a wellformed table
|
574 |
+
for ( $i; $i < $checks_per_row; $i++ ){
|
575 |
+
echo '<td> </td>';
|
576 |
+
}
|
577 |
+
echo '</tr>';
|
578 |
+
}
|
579 |
+
?>
|
580 |
+
|
581 |
+
<tr class="cme-bulk-select">
|
582 |
+
<td colspan="<?php echo $checks_per_row;?>">
|
583 |
+
<span style="float:right">
|
584 |
+
<input type="checkbox" class="cme-check-all" title="<?php _e('check/uncheck all', 'capsman-enhanced');?>"> <a class="cme-neg-all" href="#" title="<?php _e('negate all (storing as disabled capabilities)', 'capsman-enhanced');?>">X</a> <a class="cme-switch-all" href="#" title="<?php _e('negate none (add/remove all capabilities normally)', 'capsman-enhanced');?>">X</a>
|
585 |
+
</span>
|
586 |
+
</td></tr>
|
587 |
+
|
588 |
+
</table>
|
589 |
+
<?php
|
590 |
+
$all_capabilities = apply_filters( 'capsman_get_capabilities', array_keys( $this->capabilities ), $this->ID );
|
591 |
+
$all_capabilities = apply_filters( 'members_get_capabilities', $all_capabilities );
|
592 |
+
|
593 |
+
/*
|
594 |
+
$publishpress_status_change_caps = array();
|
595 |
+
foreach( $all_capabilities as $cap_name ) {
|
596 |
+
if (0 === strpos($cap_name, 'status_change_')) {
|
597 |
+
$publishpress_status_change_caps []= $cap_name;
|
598 |
+
}
|
599 |
+
}
|
600 |
+
*/
|
601 |
+
|
602 |
+
$plugin_caps = [];
|
603 |
+
|
604 |
+
if (defined('PUBLISHPRESS_VERSION')) {
|
605 |
+
$plugin_caps['PublishPress'] = apply_filters('cme_publishpress_capabilities',
|
606 |
+
array(
|
607 |
+
'edit_metadata',
|
608 |
+
'edit_post_subscriptions',
|
609 |
+
'ppma_edit_orphan_post',
|
610 |
+
'pp_manage_roles',
|
611 |
+
'pp_set_notification_channel',
|
612 |
+
'pp_view_calendar',
|
613 |
+
'pp_view_content_overview',
|
614 |
+
'status_change',
|
615 |
+
)
|
616 |
+
);
|
617 |
+
}
|
618 |
+
|
619 |
+
if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION')) {
|
620 |
+
if ($_caps = apply_filters('cme_multiple_authors_capabilities', array())) {
|
621 |
+
$plugin_caps['PublishPress Authors'] = $_caps;
|
622 |
+
}
|
623 |
+
}
|
624 |
+
|
625 |
+
if (defined('PRESSPERMIT_VERSION')) {
|
626 |
+
$plugin_caps['PublishPress Permissions'] = apply_filters('cme_presspermit_capabilities',
|
627 |
+
array(
|
628 |
+
'edit_own_attachments',
|
629 |
+
'list_others_unattached_files',
|
630 |
+
'pp_administer_content',
|
631 |
+
'pp_assign_roles',
|
632 |
+
'pp_associate_any_page',
|
633 |
+
'pp_create_groups',
|
634 |
+
'pp_create_network_groups',
|
635 |
+
'pp_define_moderation',
|
636 |
+
'pp_define_post_status',
|
637 |
+
'pp_define_privacy',
|
638 |
+
'pp_delete_groups',
|
639 |
+
'pp_edit_groups',
|
640 |
+
'pp_exempt_edit_circle',
|
641 |
+
'pp_exempt_read_circle',
|
642 |
+
'pp_force_quick_edit',
|
643 |
+
'pp_list_all_files',
|
644 |
+
'pp_manage_capabilities',
|
645 |
+
'pp_manage_members',
|
646 |
+
'pp_manage_network_members',
|
647 |
+
'pp_manage_settings',
|
648 |
+
'pp_moderate_any',
|
649 |
+
'pp_set_associate_exceptions',
|
650 |
+
'pp_set_edit_exceptions',
|
651 |
+
'pp_set_read_exceptions',
|
652 |
+
'pp_set_revise_exceptions',
|
653 |
+
'pp_set_term_assign_exceptions',
|
654 |
+
'pp_set_term_associate_exceptions',
|
655 |
+
'pp_set_term_manage_exceptions',
|
656 |
+
'pp_unfiltered',
|
657 |
+
'set_posts_status',
|
658 |
+
)
|
659 |
+
);
|
660 |
+
}
|
661 |
+
|
662 |
+
if (defined('WC_PLUGIN_FILE')) {
|
663 |
+
$plugin_caps['WooCommerce'] = apply_filters('cme_woocommerce_capabilities',
|
664 |
+
array(
|
665 |
+
'assign_product_terms',
|
666 |
+
'assign_shop_coupon_terms',
|
667 |
+
'assign_shop_discount_terms',
|
668 |
+
'assign_shop_order_terms',
|
669 |
+
'assign_shop_payment_terms',
|
670 |
+
'create_shop_orders',
|
671 |
+
'delete_others_products',
|
672 |
+
'delete_others_shop_coupons',
|
673 |
+
'delete_others_shop_discounts',
|
674 |
+
'delete_others_shop_orders',
|
675 |
+
'delete_others_shop_payments',
|
676 |
+
'delete_private_products',
|
677 |
+
'delete_private_shop_coupons',
|
678 |
+
'delete_private_shop_orders',
|
679 |
+
'delete_private_shop_discounts',
|
680 |
+
'delete_private_shop_payments',
|
681 |
+
'delete_product_terms',
|
682 |
+
'delete_products',
|
683 |
+
'delete_published_products',
|
684 |
+
'delete_published_shop_coupons',
|
685 |
+
'delete_published_shop_discounts',
|
686 |
+
'delete_published_shop_orders',
|
687 |
+
'delete_published_shop_payments',
|
688 |
+
'delete_shop_coupons',
|
689 |
+
'delete_shop_coupon_terms',
|
690 |
+
'delete_shop_discount_terms',
|
691 |
+
'delete_shop_discounts',
|
692 |
+
'delete_shop_order_terms',
|
693 |
+
'delete_shop_orders',
|
694 |
+
'delete_shop_payments',
|
695 |
+
'delete_shop_payment_terms',
|
696 |
+
'edit_others_products',
|
697 |
+
'edit_others_shop_coupons',
|
698 |
+
'edit_others_shop_discounts',
|
699 |
+
'edit_others_shop_orders',
|
700 |
+
'edit_others_shop_payments',
|
701 |
+
'edit_private_products',
|
702 |
+
'edit_private_shop_coupons',
|
703 |
+
'edit_private_shop_discounts',
|
704 |
+
'edit_private_shop_orders',
|
705 |
+
'edit_private_shop_payments',
|
706 |
+
'edit_product_terms',
|
707 |
+
'edit_products',
|
708 |
+
'edit_published_products',
|
709 |
+
'edit_published_shop_coupons',
|
710 |
+
'edit_published_shop_discounts',
|
711 |
+
'edit_published_shop_orders',
|
712 |
+
'edit_published_shop_payments',
|
713 |
+
'edit_shop_coupon_terms',
|
714 |
+
'edit_shop_coupons',
|
715 |
+
'edit_shop_discounts',
|
716 |
+
'edit_shop_discount_terms',
|
717 |
+
'edit_shop_order_terms',
|
718 |
+
'edit_shop_orders',
|
719 |
+
'edit_shop_payments',
|
720 |
+
'edit_shop_payment_terms',
|
721 |
+
'export_shop_payments',
|
722 |
+
'export_shop_reports',
|
723 |
+
'import_shop_discounts',
|
724 |
+
'import_shop_payments',
|
725 |
+
'manage_product_terms',
|
726 |
+
'manage_shop_coupon_terms',
|
727 |
+
'manage_shop_discounts',
|
728 |
+
'manage_shop_discount_terms',
|
729 |
+
'manage_shop_payment_terms',
|
730 |
+
'manage_shop_order_terms',
|
731 |
+
'manage_shop_settings',
|
732 |
+
'manage_woocommerce',
|
733 |
+
'publish_products',
|
734 |
+
'publish_shop_coupons',
|
735 |
+
'publish_shop_discounts',
|
736 |
+
'publish_shop_orders',
|
737 |
+
'publish_shop_payments',
|
738 |
+
'read_private_products',
|
739 |
+
'read_private_shop_coupons',
|
740 |
+
'read_private_shop_discounts',
|
741 |
+
'read_private_shop_payments',
|
742 |
+
'read_private_shop_orders',
|
743 |
+
'view_admin_dashboard',
|
744 |
+
'view_shop_discount_stats',
|
745 |
+
'view_shop_payment_stats',
|
746 |
+
'view_shop_reports',
|
747 |
+
'view_shop_sensitive_data',
|
748 |
+
'view_woocommerce_reports',
|
749 |
+
)
|
750 |
+
);
|
751 |
+
}
|
752 |
+
|
753 |
+
$plugin_caps = apply_filters('cme_plugin_capabilities', $plugin_caps);
|
754 |
+
|
755 |
+
foreach($plugin_caps as $plugin => $__plugin_caps) {
|
756 |
+
$_plugin_caps = array_fill_keys($__plugin_caps, true);
|
757 |
+
|
758 |
+
echo '<h3 class="cme-cap-section">' . sprintf(__( '%s Capabilities', 'capsman-enhanced' ), str_replace('_', ' ', $plugin )) . '</h3>';
|
759 |
+
echo '<table class="form-table cme-checklist"><tr>';
|
760 |
+
|
761 |
+
$checks_per_row = get_option( 'cme_form-rows', 5 );
|
762 |
+
$i = 0; $first_row = true;
|
763 |
+
|
764 |
+
foreach( array_keys($_plugin_caps) as $cap_name ) {
|
765 |
+
if ( isset( $type_caps[$cap_name] ) || isset($core_caps[$cap_name]) || isset($type_metacaps[$cap_name]) ) {
|
766 |
+
continue;
|
767 |
+
}
|
768 |
+
|
769 |
+
if ( ! $is_administrator && ! current_user_can($cap_name) )
|
770 |
+
continue;
|
771 |
+
|
772 |
+
if ( $i == $checks_per_row ) {
|
773 |
+
echo '</tr><tr>';
|
774 |
+
$i = 0;
|
775 |
+
}
|
776 |
+
|
777 |
+
if ( ! isset( $rcaps[$cap_name] ) )
|
778 |
+
$class = 'cap-no';
|
779 |
+
else
|
780 |
+
$class = ( $rcaps[$cap_name] ) ? 'cap-yes' : 'cap-neg';
|
781 |
+
|
782 |
+
if ( ! empty($pp_metagroup_caps[$cap_name]) ) {
|
783 |
+
$class .= ' cap-metagroup';
|
784 |
+
$title_text = sprintf( __( '%s: assigned by Permission Group', 'capsman-enhanced' ), $cap_name );
|
785 |
+
} else {
|
786 |
+
$title_text = $cap_name;
|
787 |
+
}
|
788 |
+
|
789 |
+
$disabled = '';
|
790 |
+
$checked = checked(1, ! empty($rcaps[$cap_name]), false );
|
791 |
+
$title = $title_text;
|
792 |
+
?>
|
793 |
+
<td class="<?php echo $class; ?>"><span class="cap-x">X</span><label title="<?php echo $title;?>"><input type="checkbox" name="caps[<?php echo $cap_name; ?>]" value="1" <?php echo $checked . $disabled;?> />
|
794 |
+
<span>
|
795 |
+
<?php
|
796 |
+
echo str_replace( '_', ' ', $cap_name );
|
797 |
+
?>
|
798 |
+
</span></label><a href="#" class="neg-cap"> x </a>
|
799 |
+
<?php if ( false !== strpos( $class, 'cap-neg' ) ) :?>
|
800 |
+
<input type="hidden" class="cme-negation-input" name="caps[<?php echo $cap_name; ?>]" value="" />
|
801 |
+
<?php endif; ?>
|
802 |
+
</td>
|
803 |
+
|
804 |
+
<?php
|
805 |
+
++$i;
|
806 |
+
}
|
807 |
+
|
808 |
+
if ( $i == $checks_per_row ) {
|
809 |
+
echo '</tr>';
|
810 |
+
$i = 0;
|
811 |
+
} elseif ( ! $first_row ) {
|
812 |
+
// Now close a wellformed table
|
813 |
+
for ( $i; $i < $checks_per_row; $i++ ){
|
814 |
+
echo '<td> </td>';
|
815 |
+
}
|
816 |
+
echo '</tr>';
|
817 |
+
}
|
818 |
+
?>
|
819 |
+
|
820 |
+
<tr class="cme-bulk-select">
|
821 |
+
<td colspan="<?php echo $checks_per_row;?>">
|
822 |
+
<span style="float:right">
|
823 |
+
<input type="checkbox" class="cme-check-all" title="<?php _e('check/uncheck all', 'capsman-enhanced');?>"> <a class="cme-neg-all" href="#" title="<?php _e('negate all (storing as disabled capabilities)', 'capsman-enhanced');?>">X</a> <a class="cme-switch-all" href="#" title="<?php _e('negate none (add/remove all capabilities normally)', 'capsman-enhanced');?>">X</a>
|
824 |
+
</span>
|
825 |
+
</td></tr>
|
826 |
+
|
827 |
+
</table>
|
828 |
+
<?php
|
829 |
+
}
|
830 |
+
|
831 |
+
echo '<p> </p><h3 class="cme-cap-section">' . __( 'Additional Capabilities', 'capsman-enhanced' ) . '</h3>';
|
832 |
+
|
833 |
+
?>
|
834 |
+
<table class="form-table cme-checklist">
|
835 |
+
<tr>
|
836 |
+
<?php
|
837 |
+
$i = 0; $first_row = true;
|
838 |
+
|
839 |
+
foreach( $all_capabilities as $cap_name ) {
|
840 |
+
if ( ! isset($this->capabilities[$cap_name]) )
|
841 |
+
$this->capabilities[$cap_name] = str_replace( '_', ' ', $cap_name );
|
842 |
+
}
|
843 |
+
|
844 |
+
uasort( $this->capabilities, 'strnatcasecmp' ); // sort by array values, but maintain keys );
|
845 |
+
|
846 |
+
$additional_caps = apply_filters('publishpress_caps_manage_additional_caps', $this->capabilities);
|
847 |
+
|
848 |
+
foreach ($additional_caps as $cap_name => $cap) :
|
849 |
+
if ( isset( $type_caps[$cap_name] ) || isset($core_caps[$cap_name]) || isset($type_metacaps[$cap_name]) )
|
850 |
+
continue;
|
851 |
+
|
852 |
+
foreach(array_keys($plugin_caps) as $plugin) {
|
853 |
+
if ( in_array( $cap_name, $plugin_caps[$plugin]) ) {
|
854 |
+
continue 2;
|
855 |
+
}
|
856 |
+
}
|
857 |
+
|
858 |
+
if ( ! $is_administrator && empty( $current_user->allcaps[$cap_name] ) ) {
|
859 |
+
continue;
|
860 |
+
}
|
861 |
+
|
862 |
+
// Levels are not shown.
|
863 |
+
if ( preg_match( '/^level_(10|[0-9])$/i', $cap_name ) ) {
|
864 |
+
continue;
|
865 |
+
}
|
866 |
+
|
867 |
+
if ( $i == $checks_per_row ) {
|
868 |
+
echo '</tr><tr>';
|
869 |
+
$i = 0; $first_row = false;
|
870 |
+
}
|
871 |
+
|
872 |
+
if ( ! isset( $rcaps[$cap_name] ) )
|
873 |
+
$class = 'cap-no';
|
874 |
+
else
|
875 |
+
$class = ( $rcaps[$cap_name] ) ? 'cap-yes' : 'cap-neg';
|
876 |
+
|
877 |
+
if ( ! empty($pp_metagroup_caps[$cap_name]) ) {
|
878 |
+
$class .= ' cap-metagroup';
|
879 |
+
$title_text = sprintf( __( '%s: assigned by Permission Group', 'capsman-enhanced' ), $cap_name );
|
880 |
+
} else {
|
881 |
+
$title_text = $cap_name;
|
882 |
+
}
|
883 |
+
|
884 |
+
$disabled = '';
|
885 |
+
$checked = checked(1, ! empty($rcaps[$cap_name]), false );
|
886 |
+
|
887 |
+
if ( 'manage_capabilities' == $cap_name ) {
|
888 |
+
if ( ! current_user_can('administrator') ) {
|
889 |
+
continue;
|
890 |
+
} elseif ( 'administrator' == $default ) {
|
891 |
+
$class .= ' cap-locked';
|
892 |
+
$lock_manage_caps_capability = true;
|
893 |
+
$disabled = 'disabled="disabled"';
|
894 |
+
}
|
895 |
+
}
|
896 |
+
?>
|
897 |
+
<td class="<?php echo $class; ?>"><span class="cap-x">X</span><label title="<?php echo $title_text;?>"><input type="checkbox" name="caps[<?php echo $cap_name; ?>]" value="1" <?php echo $checked . $disabled;?> />
|
898 |
+
<span>
|
899 |
+
<?php
|
900 |
+
echo str_replace( '_', ' ', $cap );
|
901 |
+
?>
|
902 |
+
</span></label><a href="#" class="neg-cap"> x </a>
|
903 |
+
<?php if ( false !== strpos( $class, 'cap-neg' ) ) :?>
|
904 |
+
<input type="hidden" class="cme-negation-input" name="caps[<?php echo $cap_name; ?>]" value="" />
|
905 |
+
<?php endif; ?>
|
906 |
+
</td>
|
907 |
+
<?php
|
908 |
+
$i++;
|
909 |
+
endforeach;
|
910 |
+
|
911 |
+
if ( ! empty($lock_manage_caps_capability) ) {
|
912 |
+
echo '<input type="hidden" name="caps[manage_capabilities]" value="1" />';
|
913 |
+
}
|
914 |
+
|
915 |
+
if ( $i == $checks_per_row ) {
|
916 |
+
echo '</tr><tr>';
|
917 |
+
$i = 0;
|
918 |
+
} else {
|
919 |
+
if ( ! $first_row ) {
|
920 |
+
// Now close a wellformed table
|
921 |
+
for ( $i; $i < $checks_per_row; $i++ ){
|
922 |
+
echo '<td> </td>';
|
923 |
+
}
|
924 |
+
echo '</tr>';
|
925 |
+
}
|
926 |
+
}
|
927 |
+
?>
|
928 |
+
|
929 |
+
<tr class="cme-bulk-select">
|
930 |
+
<td colspan="<?php echo $checks_per_row;?>">
|
931 |
+
<span style="float:right">
|
932 |
+
<input type="checkbox" class="cme-check-all" title="<?php _e('check/uncheck all', 'capsman-enhanced');?>"> <a class="cme-neg-all" href="#" title="<?php _e('negate all (storing as disabled capabilities)', 'capsman-enhanced');?>">X</a> <a class="cme-switch-all" href="#" title="<?php _e('negate none (add/remove all capabilities normally)', 'capsman-enhanced');?>">X</a>
|
933 |
+
</span>
|
934 |
+
</td></tr>
|
935 |
+
|
936 |
+
</table>
|
937 |
+
|
938 |
+
<?php
|
939 |
+
if (array_intersect(array_keys(array_filter($type_metacaps)), $all_capabilities)) {
|
940 |
+
|
941 |
+
$_title = esc_attr(__('Meta capabilities are used in code as placeholders for other capabilities. Assiging to a role has no effect.'));
|
942 |
+
echo '<p> </p><h3 class="cme-cap-section" title="' . $_title . '">' . __( 'Invalid Capabilities', 'capsman-enhanced' ) . '</h3>';
|
943 |
+
?>
|
944 |
+
<table class="form-table cme-checklist">
|
945 |
+
<tr>
|
946 |
+
<?php
|
947 |
+
$i = 0; $first_row = true;
|
948 |
+
|
949 |
+
foreach( $all_capabilities as $cap_name ) {
|
950 |
+
if ( ! isset($this->capabilities[$cap_name]) )
|
951 |
+
$this->capabilities[$cap_name] = str_replace( '_', ' ', $cap_name );
|
952 |
+
}
|
953 |
+
|
954 |
+
uasort( $this->capabilities, 'strnatcasecmp' ); // sort by array values, but maintain keys );
|
955 |
+
|
956 |
+
foreach ( $this->capabilities as $cap_name => $cap ) :
|
957 |
+
if ( ! isset( $type_metacaps[$cap_name] ) )
|
958 |
+
continue;
|
959 |
+
|
960 |
+
if ( ! $is_administrator && empty( $current_user->allcaps[$cap_name] ) ) {
|
961 |
+
continue;
|
962 |
+
}
|
963 |
+
|
964 |
+
if ( $i == $checks_per_row ) {
|
965 |
+
echo '</tr><tr>';
|
966 |
+
$i = 0; $first_row = false;
|
967 |
+
}
|
968 |
+
|
969 |
+
if ( ! isset( $rcaps[$cap_name] ) )
|
970 |
+
$class = 'cap-no';
|
971 |
+
else
|
972 |
+
$class = ( $rcaps[$cap_name] ) ? 'cap-yes' : 'cap-neg';
|
973 |
+
|
974 |
+
if ( ! empty($pp_metagroup_caps[$cap_name]) ) {
|
975 |
+
$class .= ' cap-metagroup';
|
976 |
+
$title_text = sprintf( __( '%s: assigned by Permission Group', 'capsman-enhanced' ), $cap_name );
|
977 |
+
} else {
|
978 |
+
$title_text = $cap_name;
|
979 |
+
}
|
980 |
+
|
981 |
+
$disabled = '';
|
982 |
+
$checked = checked(1, ! empty($rcaps[$cap_name]), false );
|
983 |
+
?>
|
984 |
+
<td class="<?php echo $class; ?>"><span class="cap-x">X</span><label title="<?php echo $title_text;?>"><input type="checkbox" name="caps[<?php echo $cap_name; ?>]" value="1" <?php echo $checked . $disabled;?> />
|
985 |
+
<span>
|
986 |
+
<?php
|
987 |
+
echo str_replace( '_', ' ', $cap );
|
988 |
+
?>
|
989 |
+
</span></label><a href="#" class="neg-cap"> x </a>
|
990 |
+
<?php if ( false !== strpos( $class, 'cap-neg' ) ) :?>
|
991 |
+
<input type="hidden" class="cme-negation-input" name="caps[<?php echo $cap_name; ?>]" value="" />
|
992 |
+
<?php endif; ?>
|
993 |
+
</td>
|
994 |
+
<?php
|
995 |
+
$i++;
|
996 |
+
endforeach;
|
997 |
+
|
998 |
+
if ( ! empty($lock_manage_caps_capability) ) {
|
999 |
+
echo '<input type="hidden" name="caps[manage_capabilities]" value="1" />';
|
1000 |
+
}
|
1001 |
+
|
1002 |
+
if ( $i == $checks_per_row ) {
|
1003 |
+
echo '</tr><tr>';
|
1004 |
+
$i = 0;
|
1005 |
+
} else {
|
1006 |
+
if ( ! $first_row ) {
|
1007 |
+
// Now close a wellformed table
|
1008 |
+
for ( $i; $i < $checks_per_row; $i++ ){
|
1009 |
+
echo '<td> </td>';
|
1010 |
+
}
|
1011 |
+
echo '</tr>';
|
1012 |
+
}
|
1013 |
+
}
|
1014 |
+
?>
|
1015 |
+
|
1016 |
+
<tr class="cme-bulk-select">
|
1017 |
+
<td colspan="<?php echo $checks_per_row;?>">
|
1018 |
+
<span style="float:right">
|
1019 |
+
<input type="checkbox" class="cme-check-all" title="<?php _e('check/uncheck all', 'capsman-enhanced');?>"> <a class="cme-neg-all" href="#" title="<?php _e('negate all (storing as disabled capabilities)', 'capsman-enhanced');?>">X</a> <a class="cme-switch-all" href="#" title="<?php _e('negate none (add/remove all capabilities normally)', 'capsman-enhanced');?>">X</a>
|
1020 |
+
</span>
|
1021 |
+
</td></tr>
|
1022 |
+
|
1023 |
+
</table>
|
1024 |
+
<?php
|
1025 |
+
} // endif any invalid caps
|
1026 |
+
?>
|
1027 |
+
|
1028 |
+
<div>
|
1029 |
+
<?php
|
1030 |
+
$level = ak_caps2level($rcaps);
|
1031 |
+
?>
|
1032 |
+
<span title="<?php _e('Role level is mostly deprecated. However, it still determines eligibility for Post Author assignment and limits the application of user editing capabilities.', 'capsman-enhanced');?>">
|
1033 |
+
<?php _e('Role Level:', 'capsman-enhanced');?> <select name="level">
|
1034 |
+
<?php for ( $l = $this->max_level; $l >= 0; $l-- ) {?>
|
1035 |
+
<option value="<?php echo $l; ?>" style="text-align:right;"<?php selected($level, $l); ?>> <?php echo $l; ?> </option>
|
1036 |
+
<?php }
|
1037 |
+
?>
|
1038 |
+
</select>
|
1039 |
+
</span>
|
1040 |
+
|
1041 |
+
</div>
|
1042 |
+
</dd>
|
1043 |
+
</dl>
|
1044 |
+
|
1045 |
+
<?php
|
1046 |
+
$support_pp_only_roles = ( defined('PRESSPERMIT_ACTIVE') ) ? $pp_ui->pp_only_roles_ui( $default ) : false;
|
1047 |
+
cme_network_role_ui( $default );
|
1048 |
+
?>
|
1049 |
+
|
1050 |
+
<p class="submit">
|
1051 |
+
<input type="hidden" name="action" value="update" />
|
1052 |
+
<input type="hidden" name="current" value="<?php echo $default; ?>" />
|
1053 |
+
<input type="submit" name="SaveRole" value="<?php _e('Save Changes', 'capsman-enhanced') ?>" class="button-primary" />
|
1054 |
+
|
1055 |
+
<?php if ( current_user_can('administrator') && 'administrator' != $default ) : ?>
|
1056 |
+
<a class="ak-delete" title="<?php echo esc_attr(__('Delete this role', 'capsman-enhanced')) ?>" href="<?php echo wp_nonce_url("admin.php?page={$this->ID}&action=delete&role={$default}", 'delete-role_' . $default); ?>" onclick="if ( confirm('<?php echo esc_js(sprintf(__("You are about to delete the %s role.\n\n 'Cancel' to stop, 'OK' to delete.", 'capsman-enhanced'), $roles[$default])); ?>') ) { return true;}return false;"><?php _e('Delete Role', 'capsman-enhanced')?></a>
|
1057 |
+
<?php endif; ?>
|
1058 |
+
</p>
|
1059 |
+
|
1060 |
+
</td>
|
1061 |
+
<td class="sidebar">
|
1062 |
+
<dl>
|
1063 |
+
<dt><?php if ( defined('WPLANG') && WPLANG ) _e('Select New Role', 'capsman-enhanced'); else echo('Select Role to View / Edit'); ?></dt>
|
1064 |
+
<dd style="text-align:center;">
|
1065 |
+
<p><select name="role">
|
1066 |
+
<?php
|
1067 |
+
foreach ( $roles as $role => $name ) {
|
1068 |
+
$name = translate_user_role($name);
|
1069 |
+
echo '<option value="' . $role .'"'; selected($default, $role); echo '> ' . $name . ' </option>';
|
1070 |
+
}
|
1071 |
+
?>
|
1072 |
+
</select><span style="margin-left:20px"><input type="submit" name="LoadRole" value="<?php if ( defined('WPLANG') && WPLANG ) _e('Change', 'capsman-enhanced'); else echo('Load'); ?>" class="button" /></span></p>
|
1073 |
+
</dd>
|
1074 |
+
</dl>
|
1075 |
+
|
1076 |
+
<script type="text/javascript">
|
1077 |
+
/* <![CDATA[ */
|
1078 |
+
jQuery(document).ready( function($) {
|
1079 |
+
$('select[name="role"]').val('<?php echo $default;?>');
|
1080 |
+
|
1081 |
+
$('input.button[name="LoadRole"]').click(function(){
|
1082 |
+
$('#publishpress_caps_form').attr('action', 'admin.php?page=capsman&role=' + $('select[name="role"]').val());
|
1083 |
+
});
|
1084 |
+
});
|
1085 |
+
/* ]]> */
|
1086 |
+
</script>
|
1087 |
+
|
1088 |
+
<?php do_action('publishpress-caps_sidebar_top');?>
|
1089 |
+
|
1090 |
+
<dl>
|
1091 |
+
<dt><?php _e('Create New Role', 'capsman-enhanced'); ?></dt>
|
1092 |
+
<dd style="text-align:center;">
|
1093 |
+
<?php $class = ( $support_pp_only_roles ) ? 'tight-text' : 'regular-text'; ?>
|
1094 |
+
<p><input type="text" name="create-name" class="<?php echo $class;?>" placeholder="<?php _e('Role Name', 'capsman-enhanced') ?>" />
|
1095 |
+
|
1096 |
+
<?php if( $support_pp_only_roles ) : ?>
|
1097 |
+
<label for="new_role_pp_only" title="<?php _e('Make role available for supplemental assignment to Permission Groups only', 'capsman-enhanced');?>"> <input type="checkbox" name="new_role_pp_only" id="new_role_pp_only" value="1"> <?php _e('hidden', 'capsman-enhanced'); ?> </label>
|
1098 |
+
<?php endif; ?>
|
1099 |
+
|
1100 |
+
<br />
|
1101 |
+
<input type="submit" name="CreateRole" value="<?php _e('Create', 'capsman-enhanced') ?>" class="button" />
|
1102 |
+
</p>
|
1103 |
+
</dd>
|
1104 |
+
</dl>
|
1105 |
+
|
1106 |
+
<dl>
|
1107 |
+
<dt><?php defined('WPLANG') && WPLANG ? _e('Copy this role to', 'capsman-enhanced') : printf('Copy %s Role', translate_user_role($roles[$default])); ?></dt>
|
1108 |
+
<dd style="text-align:center;">
|
1109 |
+
<?php $class = ( $support_pp_only_roles ) ? 'tight-text' : 'regular-text'; ?>
|
1110 |
+
<p><input type="text" name="copy-name" class="<?php echo $class;?>" placeholder="<?php _e('Role Name', 'capsman-enhanced') ?>" />
|
1111 |
+
|
1112 |
+
<?php if( $support_pp_only_roles ) : ?>
|
1113 |
+
<label for="copy_role_pp_only" title="<?php _e('Make role available for supplemental assignment to Permission Groups only', 'capsman-enhanced');?>"> <input type="checkbox" name="copy_role_pp_only" id="copy_role_pp_only" value="1"> <?php _e('hidden', 'capsman-enhanced'); ?> </label>
|
1114 |
+
<?php endif; ?>
|
1115 |
+
|
1116 |
+
<br />
|
1117 |
+
<input type="submit" name="CopyRole" value="<?php _e('Copy', 'capsman-enhanced') ?>" class="button" />
|
1118 |
+
</p>
|
1119 |
+
</dd>
|
1120 |
+
</dl>
|
1121 |
+
|
1122 |
+
<dl>
|
1123 |
+
<dt><?php _e('Add Capability', 'capsman-enhanced'); ?></dt>
|
1124 |
+
<dd style="text-align:center;">
|
1125 |
+
<p><input type="text" name="capability-name" class="regular-text" placeholder="<?php echo 'capability_name';?>" /><br />
|
1126 |
+
<input type="submit" name="AddCap" value="<?php _e('Add to role', 'capsman-enhanced') ?>" class="button" /></p>
|
1127 |
+
</dd>
|
1128 |
+
</dl>
|
1129 |
+
|
1130 |
+
<!-- <dl class="cme-backup-tool">
|
1131 |
+
<dt><?php _e('Backup Tool', 'capsman-enhanced'); ?></dt>
|
1132 |
+
<dd style="text-align:center;">
|
1133 |
+
<p><a href="admin.php?page=capsman-tool"><?php _e('Backup / Restore Roles', 'capsman-enhanced');?></a></p>
|
1134 |
+
</dd>
|
1135 |
+
</dl> -->
|
1136 |
+
|
1137 |
+
<dl>
|
1138 |
+
<dt><?php _e('Related Permissions Plugins', 'capsman-enhanced'); ?></dt>
|
1139 |
+
<dd>
|
1140 |
+
<ul>
|
1141 |
+
<li><a href="https://publishpress.com/ma/" target="_blank"><?php _e('Multiple Authors', 'capsman-enhanced');?></a></li>
|
1142 |
+
</li>
|
1143 |
+
|
1144 |
+
<li><a href="#pp-more"><?php _e('PublishPress Permissions', 'capsman-enhanced');?></a>
|
1145 |
+
</li>
|
1146 |
+
|
1147 |
+
<?php $_url = "plugin-install.php?tab=plugin-information&plugin=publishpress&TB_iframe=true&width=640&height=678";
|
1148 |
+
$url = ( is_multisite() ) ? network_admin_url($_url) : admin_url($_url);
|
1149 |
+
?>
|
1150 |
+
<li><a class="thickbox" href="<?php echo $url;?>"><?php _e('PublishPress', 'capsman-enhanced');?></a></li>
|
1151 |
+
|
1152 |
+
<?php $_url = "plugin-install.php?tab=plugin-information&plugin=revisionary&TB_iframe=true&width=640&height=678";
|
1153 |
+
$url = ( is_multisite() ) ? network_admin_url($_url) : admin_url($_url);
|
1154 |
+
?>
|
1155 |
+
<li><a class="thickbox" href="<?php echo $url;?>"><?php _e('PublishPress Revisions', 'capsman-enhanced');?></a></li>
|
1156 |
+
|
1157 |
+
<li class="publishpress-contact"><a href="https://publishpress.com/contact" target="_blank"><?php _e('Help / Contact Form', 'capsman-enhanced');?></a></li>
|
1158 |
+
|
1159 |
+
</ul>
|
1160 |
+
</dd>
|
1161 |
+
</dl>
|
1162 |
+
|
1163 |
+
<?php
|
1164 |
+
$pp_ui->pp_types_ui( $defined['type'] );
|
1165 |
+
$pp_ui->pp_taxonomies_ui( $defined['taxonomy'] );
|
1166 |
+
|
1167 |
+
do_action('publishpress-caps_sidebar_bottom');
|
1168 |
+
?>
|
1169 |
+
</td>
|
1170 |
+
</tr>
|
1171 |
+
</table>
|
1172 |
+
</fieldset>
|
1173 |
+
</form>
|
1174 |
+
|
1175 |
+
<?php if (!defined('PUBLISHPRESS_CAPS_PRO_VERSION') || get_option('cme_display_branding')) {
|
1176 |
+
cme_publishpressFooter();
|
1177 |
+
}
|
1178 |
+
?>
|
1179 |
+
</div>
|
1180 |
+
|
1181 |
+
<?php
|
1182 |
+
function cme_network_role_ui( $default ) {
|
1183 |
+
if ( ! is_multisite() || ! is_super_admin() || ( 1 != get_current_blog_id() ) )
|
1184 |
+
return false;
|
1185 |
+
?>
|
1186 |
+
|
1187 |
+
<div style="float:right;margin-left:10px;margin-right:10px">
|
1188 |
+
<?php
|
1189 |
+
if ( ! $autocreate_roles = get_site_option( 'cme_autocreate_roles' ) )
|
1190 |
+
$autocreate_roles = array();
|
1191 |
+
|
1192 |
+
$checked = ( in_array( $default, $autocreate_roles ) ) ? 'checked="checked"': '';
|
1193 |
+
?>
|
1194 |
+
<div style="margin-bottom: 5px">
|
1195 |
+
<label for="cme_autocreate_role" title="<?php _e('Create this role definition in new (future) sites', 'capsman-enhanced');?>"><input type="checkbox" name="cme_autocreate_role" id="cme_autocreate_role" value="1" <?php echo $checked;?>> <?php _e('include in new sites', 'capsman-enhanced'); ?> </label>
|
1196 |
+
</div>
|
1197 |
+
<div>
|
1198 |
+
<label for="cme_net_sync_role" title="<?php echo esc_attr(__('Copy / update this role definition to all sites now', 'capsman-enhanced'));?>"><input type="checkbox" name="cme_net_sync_role" id="cme_net_sync_role" value="1"> <?php _e('sync role to all sites now', 'capsman-enhanced'); ?> </label>
|
1199 |
+
</div>
|
1200 |
+
</div>
|
1201 |
+
<?php
|
1202 |
+
return true;
|
1203 |
+
}
|
1204 |
+
|
1205 |
+
function cme_plugin_info_url( $plugin_slug ) {
|
1206 |
+
$_url = "plugin-install.php?tab=plugin-information&plugin=$plugin_slug&TB_iframe=true&width=640&height=678";
|
1207 |
+
return ( is_multisite() ) ? network_admin_url($_url) : admin_url($_url);
|
1208 |
+
}
|
includes/backup-handler.php
CHANGED
@@ -45,8 +45,7 @@ class Capsman_BackupHandler
|
|
45 |
break;
|
46 |
|
47 |
case 'restore_initial':
|
48 |
-
$roles = get_option($cm_roles_initial)
|
49 |
-
if ( $roles ) {
|
50 |
update_option($wp_roles, $roles);
|
51 |
ak_admin_notify(__('Roles and Capabilities restored from initial backup.', 'capsman-enhanced'));
|
52 |
} else {
|
@@ -55,14 +54,21 @@ class Capsman_BackupHandler
|
|
55 |
break;
|
56 |
|
57 |
case 'restore':
|
58 |
-
$roles = get_option($cm_roles)
|
59 |
-
if ( $roles ) {
|
60 |
update_option($wp_roles, $roles);
|
61 |
ak_admin_notify(__('Roles and Capabilities restored from last backup.', 'capsman-enhanced'));
|
62 |
} else {
|
63 |
ak_admin_error(__('Restore failed. No backup found.', 'capsman-enhanced'));
|
64 |
}
|
65 |
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
}
|
67 |
}
|
68 |
}
|
45 |
break;
|
46 |
|
47 |
case 'restore_initial':
|
48 |
+
if ($roles = get_option($cm_roles_initial)) {
|
|
|
49 |
update_option($wp_roles, $roles);
|
50 |
ak_admin_notify(__('Roles and Capabilities restored from initial backup.', 'capsman-enhanced'));
|
51 |
} else {
|
54 |
break;
|
55 |
|
56 |
case 'restore':
|
57 |
+
if ($roles = get_option($cm_roles)) {
|
|
|
58 |
update_option($wp_roles, $roles);
|
59 |
ak_admin_notify(__('Roles and Capabilities restored from last backup.', 'capsman-enhanced'));
|
60 |
} else {
|
61 |
ak_admin_error(__('Restore failed. No backup found.', 'capsman-enhanced'));
|
62 |
}
|
63 |
break;
|
64 |
+
|
65 |
+
default:
|
66 |
+
if ($roles = get_option($_POST['action'])) {
|
67 |
+
update_option($wp_roles, $roles);
|
68 |
+
ak_admin_notify(__('Roles and Capabilities restored from selected auto-backup.', 'capsman-enhanced'));
|
69 |
+
} else {
|
70 |
+
ak_admin_error(__('Restore failed. No backup found.', 'capsman-enhanced'));
|
71 |
+
}
|
72 |
}
|
73 |
}
|
74 |
}
|
includes/backup.php
CHANGED
@@ -29,6 +29,9 @@
|
|
29 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
30 |
*/
|
31 |
|
|
|
|
|
|
|
32 |
?>
|
33 |
|
34 |
<div class="wrap publishpress-caps-manage pressshack-admin-wrapper">
|
@@ -36,7 +39,7 @@
|
|
36 |
<h2><?php printf( __('Backup Tool for %1$sPublishPress Capabilities%2$s', 'capsman-enhanced'), '<a href="admin.php?page=capsman">', '</a>' );?></h2>
|
37 |
|
38 |
<form method="post" action="admin.php?page=<?php echo $this->ID ?>-tool">
|
39 |
-
<?php wp_nonce_field('capsman-backup-tool')
|
40 |
<fieldset>
|
41 |
<table id="akmin">
|
42 |
<tr>
|
@@ -48,7 +51,7 @@
|
|
48 |
<tr>
|
49 |
<th scope="row"><?php _e('Select action:', 'capsman-enhanced'); ?></th>
|
50 |
<td>
|
51 |
-
<select name="action">
|
52 |
<option value="backup"> <?php _e('Backup roles and capabilities', 'capsman-enhanced'); ?> </option>
|
53 |
|
54 |
<?php
|
@@ -56,31 +59,46 @@
|
|
56 |
<option value="restore_initial"> <?php _e('Restore initial backup', 'capsman-enhanced'); ?> </option>
|
57 |
<?php endif;?>
|
58 |
|
59 |
-
<option value="restore"> <?php _e('Restore last saved backup', 'capsman-enhanced'); ?> </option>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
</select>
|
61 |
<input type="submit" name="Perform" value="<?php _e('Do Action', 'capsman-enhanced') ?>" class="button-primary" />
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
</td>
|
63 |
</tr>
|
64 |
</table>
|
65 |
</dd>
|
66 |
|
67 |
-
<p>
|
68 |
-
<?php if( ! empty( $initial ) ):?>
|
69 |
-
<a id="cme_show_initial" href="javascript:void(0)"><?php _e('Show initial backup', 'capsman-enhanced');?></a> •
|
70 |
-
<?php endif;?>
|
71 |
-
<a id="cme_show_last" href="javascript:void(0)"><?php _e('Show last backup', 'capsman-enhanced');?></a>
|
72 |
-
</p>
|
73 |
-
|
74 |
<script type="text/javascript">
|
75 |
/* <![CDATA[ */
|
76 |
jQuery(document).ready( function($) {
|
77 |
-
$(
|
78 |
-
$('
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
84 |
});
|
85 |
});
|
86 |
/* ]]> */
|
@@ -90,16 +108,22 @@
|
|
90 |
global $wp_roles;
|
91 |
|
92 |
$initial_caption = ( $backup_datestamp = get_option( 'capsman_backup_initial_datestamp' ) ) ? sprintf( __('Initial Backup - %s', 'capsman-enhanced'), date( 'j M Y, g:i a', $backup_datestamp ) ) : __('Initial Backup', 'capsman-enhanced');
|
93 |
-
$last_caption = ( $backup_datestamp = get_option( 'capsman_backup_datestamp' ) ) ? sprintf( __('Last Backup - %s', 'capsman-enhanced'), date( 'j M Y, g:i a', $backup_datestamp ) ) : __('Last Backup', 'capsman-enhanced');
|
94 |
|
95 |
$backups = array(
|
96 |
'capsman_backup_initial' => $initial_caption,
|
97 |
'capsman_backup' => $last_caption,
|
98 |
);
|
99 |
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
foreach( $backups as $name => $caption ) {
|
101 |
if ( $backup_data = get_option( $name ) ) :?>
|
102 |
-
<div id="cme_display_<?php echo $name;?>" style="display:none;padding-left:20px;">
|
103 |
<h3><?php printf( __( "%s (%s roles)", 'capsman-enhanded' ), $caption, count($backup_data) ); ?></h3>
|
104 |
|
105 |
<?php foreach( $backup_data as $role => $props ) :?>
|
29 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
30 |
*/
|
31 |
|
32 |
+
global $wpdb;
|
33 |
+
|
34 |
+
$auto_backups = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE 'cme_backup_auto_%' ORDER BY option_id DESC");
|
35 |
?>
|
36 |
|
37 |
<div class="wrap publishpress-caps-manage pressshack-admin-wrapper">
|
39 |
<h2><?php printf( __('Backup Tool for %1$sPublishPress Capabilities%2$s', 'capsman-enhanced'), '<a href="admin.php?page=capsman">', '</a>' );?></h2>
|
40 |
|
41 |
<form method="post" action="admin.php?page=<?php echo $this->ID ?>-tool">
|
42 |
+
<?php wp_nonce_field('capsman-backup-tool');?>
|
43 |
<fieldset>
|
44 |
<table id="akmin">
|
45 |
<tr>
|
51 |
<tr>
|
52 |
<th scope="row"><?php _e('Select action:', 'capsman-enhanced'); ?></th>
|
53 |
<td>
|
54 |
+
<select id="cme_select_backup" name="action">
|
55 |
<option value="backup"> <?php _e('Backup roles and capabilities', 'capsman-enhanced'); ?> </option>
|
56 |
|
57 |
<?php
|
59 |
<option value="restore_initial"> <?php _e('Restore initial backup', 'capsman-enhanced'); ?> </option>
|
60 |
<?php endif;?>
|
61 |
|
62 |
+
<option value="restore"> <?php _e('Restore last manually saved backup', 'capsman-enhanced'); ?> </option>
|
63 |
+
|
64 |
+
<?php foreach($auto_backups as $row):
|
65 |
+
$arr = explode('_', str_replace('cme_backup_auto_', '', $row->option_name));
|
66 |
+
$arr[1] = str_replace('-', ':', $arr[1]);
|
67 |
+
$date_caption = implode(' ', $arr);
|
68 |
+
?>
|
69 |
+
<option value="<?php echo $row->option_name;?>"><?php printf(__('Restore auto-backup (%s)', 'capsman-enhanced'), $date_caption);?></option>
|
70 |
+
<?php endforeach;?>
|
71 |
</select>
|
72 |
<input type="submit" name="Perform" value="<?php _e('Do Action', 'capsman-enhanced') ?>" class="button-primary" />
|
73 |
+
|
74 |
+
<p> <span class="cme-subtext">
|
75 |
+
<?php
|
76 |
+
_e('To view the contents of a backup, select it in the dropdown above.', 'press-permit-core');
|
77 |
+
?>
|
78 |
+
</span></p>
|
79 |
</td>
|
80 |
</tr>
|
81 |
</table>
|
82 |
</dd>
|
83 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
84 |
<script type="text/javascript">
|
85 |
/* <![CDATA[ */
|
86 |
jQuery(document).ready( function($) {
|
87 |
+
$('#cme_select_backup').click(function() {
|
88 |
+
$('div.cme-show-backup').hide();
|
89 |
+
|
90 |
+
var selected_val = $(this).val();
|
91 |
+
|
92 |
+
switch(selected_val) {
|
93 |
+
case 'restore_initial':
|
94 |
+
$('#cme_display_capsman_backup_initial').show();
|
95 |
+
break;
|
96 |
+
case 'restore':
|
97 |
+
$('#cme_display_capsman_backup').show();
|
98 |
+
break;
|
99 |
+
default:
|
100 |
+
$('#cme_display_' + selected_val).show();
|
101 |
+
}
|
102 |
});
|
103 |
});
|
104 |
/* ]]> */
|
108 |
global $wp_roles;
|
109 |
|
110 |
$initial_caption = ( $backup_datestamp = get_option( 'capsman_backup_initial_datestamp' ) ) ? sprintf( __('Initial Backup - %s', 'capsman-enhanced'), date( 'j M Y, g:i a', $backup_datestamp ) ) : __('Initial Backup', 'capsman-enhanced');
|
111 |
+
$last_caption = ( $backup_datestamp = get_option( 'capsman_backup_datestamp' ) ) ? sprintf( __('Last Manual Backup - %s', 'capsman-enhanced'), date( 'j M Y, g:i a', $backup_datestamp ) ) : __('Last Backup', 'capsman-enhanced');
|
112 |
|
113 |
$backups = array(
|
114 |
'capsman_backup_initial' => $initial_caption,
|
115 |
'capsman_backup' => $last_caption,
|
116 |
);
|
117 |
|
118 |
+
foreach($auto_backups as $row) {
|
119 |
+
$arr = explode('_', str_replace('cme_backup_auto_', '', $row->option_name));
|
120 |
+
$arr[1] = str_replace('-', ':', $arr[1]);
|
121 |
+
$backups[$row->option_name] = "Auto-backup from " . implode(' ', $arr);
|
122 |
+
}
|
123 |
+
|
124 |
foreach( $backups as $name => $caption ) {
|
125 |
if ( $backup_data = get_option( $name ) ) :?>
|
126 |
+
<div id="cme_display_<?php echo $name;?>" style="display:none;padding-left:20px;" class="cme-show-backup">
|
127 |
<h3><?php printf( __( "%s (%s roles)", 'capsman-enhanded' ), $caption, count($backup_data) ); ?></h3>
|
128 |
|
129 |
<?php foreach( $backup_data as $role => $props ) :?>
|
includes/functions-admin.php
CHANGED
@@ -2,7 +2,13 @@
|
|
2 |
|
3 |
// perf enhancement: display submenu links without loading framework and plugin code
|
4 |
function cme_submenus() {
|
5 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
|
7 |
$permissions_title = __('Capabilities', 'capsman-enhanced');
|
8 |
|
@@ -27,4 +33,16 @@ function cme_submenus() {
|
|
27 |
);
|
28 |
|
29 |
add_submenu_page('capsman', __('Backup', 'capsman-enhanced'), __('Backup', 'capsman-enhanced'), $cap_name, 'capsman' . '-tool', 'cme_fakefunc');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
}
|
2 |
|
3 |
// perf enhancement: display submenu links without loading framework and plugin code
|
4 |
function cme_submenus() {
|
5 |
+
// First we check if user is administrator and can 'manage_capabilities'.
|
6 |
+
if (current_user_can('administrator') && ! current_user_can('manage_capabilities')) {
|
7 |
+
$admin = get_role('administrator');
|
8 |
+
$admin->add_cap('manage_capabilities');
|
9 |
+
}
|
10 |
+
|
11 |
+
$cap_name = (is_super_admin()) ? 'read' : 'manage_capabilities';
|
12 |
|
13 |
$permissions_title = __('Capabilities', 'capsman-enhanced');
|
14 |
|
33 |
);
|
34 |
|
35 |
add_submenu_page('capsman', __('Backup', 'capsman-enhanced'), __('Backup', 'capsman-enhanced'), $cap_name, 'capsman' . '-tool', 'cme_fakefunc');
|
36 |
+
|
37 |
+
add_submenu_page(
|
38 |
+
'capsman',
|
39 |
+
__('Upgrade to Pro', 'capsman-enhanced'),
|
40 |
+
__('Upgrade to Pro', 'capsman-enhanced'),
|
41 |
+
'read',
|
42 |
+
'capabilities-pro',
|
43 |
+
'cme_fakefunc'
|
44 |
+
);
|
45 |
+
}
|
46 |
+
|
47 |
+
function cme_fakefunc() {
|
48 |
}
|
includes/functions.php
CHANGED
@@ -69,6 +69,25 @@ function capsman_get_pp_option( $option_basename ) {
|
|
69 |
return pp_capabilities_get_permissions_option($option_basename);
|
70 |
}
|
71 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
function pp_capabilities_get_permissions_option($option_basename) {
|
73 |
return (function_exists('presspermit')) ? presspermit()->getOption($option_basename) : pp_get_option($option_basename);
|
74 |
}
|
69 |
return pp_capabilities_get_permissions_option($option_basename);
|
70 |
}
|
71 |
|
72 |
+
function pp_capabilities_autobackup() {
|
73 |
+
global $wpdb;
|
74 |
+
|
75 |
+
$roles = get_option($wpdb->prefix . 'user_roles');
|
76 |
+
update_option('cme_backup_auto_' . current_time('Y-m-d_g-i-s_a'), $roles, false);
|
77 |
+
|
78 |
+
$max_auto_backups = (defined('CME_AUTOBACKUPS')) ? CME_AUTOBACKUPS : 20;
|
79 |
+
|
80 |
+
$keep_ids = $wpdb->get_col("SELECT option_id FROM $wpdb->options WHERE option_name LIKE 'cme_backup_auto_%' ORDER BY option_id DESC LIMIT $max_auto_backups");
|
81 |
+
|
82 |
+
if (count($keep_ids) == $max_auto_backups) {
|
83 |
+
$id_csv = implode("','", $keep_ids);
|
84 |
+
|
85 |
+
$wpdb->query(
|
86 |
+
"DELETE FROM $wpdb->options WHERE option_name LIKE 'cme_backup_auto_%' AND option_id NOT IN ('$id_csv')"
|
87 |
+
);
|
88 |
+
}
|
89 |
+
}
|
90 |
+
|
91 |
function pp_capabilities_get_permissions_option($option_basename) {
|
92 |
return (function_exists('presspermit')) ? presspermit()->getOption($option_basename) : pp_get_option($option_basename);
|
93 |
}
|
includes/handler.php
CHANGED
@@ -71,7 +71,7 @@ class CapsmanHandler
|
|
71 |
|
72 |
if ( $newname = $this->createNewName($post['capability-name']) ) {
|
73 |
$role->add_cap($newname['name']);
|
74 |
-
|
75 |
// for bbPress < 2.2, need to log customization of roles following bbPress activation
|
76 |
$plugins = ( function_exists( 'bbp_get_version' ) && version_compare( bbp_get_version(), '2.2', '<' ) ) ? array( 'bbpress.php' ) : array(); // back compat
|
77 |
|
@@ -90,7 +90,7 @@ class CapsmanHandler
|
|
90 |
} else {
|
91 |
ak_admin_notify(__('Incorrect capability name.'));
|
92 |
}
|
93 |
-
|
94 |
} elseif ( ! empty($post['update_filtered_types']) || ! empty($post['update_filtered_taxonomies']) || ! empty($post['update_detailed_taxonomies']) ) {
|
95 |
//if ( /* settings saved successfully on plugins_loaded action */ ) {
|
96 |
ak_admin_notify(__('Type / Taxonomy settings saved.', 'capsman-enhanced'));
|
@@ -99,7 +99,7 @@ class CapsmanHandler
|
|
99 |
//}
|
100 |
} else {
|
101 |
if (!apply_filters('publishpress-caps_submission_ok', false)) {
|
102 |
-
|
103 |
}
|
104 |
}
|
105 |
|
@@ -185,7 +185,7 @@ class CapsmanHandler
|
|
185 |
private function saveRoleCapabilities( $role_name, $caps, $level ) {
|
186 |
$this->cm->generateNames();
|
187 |
$role = get_role($role_name);
|
188 |
-
|
189 |
// workaround to ensure db storage of customizations to bbp dynamic roles
|
190 |
$role->name = $role_name;
|
191 |
|
@@ -304,6 +304,8 @@ class CapsmanHandler
|
|
304 |
( method_exists( $wp_roles, 'for_site' ) ) ? $wp_roles->for_site() : $wp_roles->reinit();
|
305 |
}
|
306 |
} // endif multisite installation with super admin editing a main site role
|
|
|
|
|
307 |
}
|
308 |
|
309 |
|
71 |
|
72 |
if ( $newname = $this->createNewName($post['capability-name']) ) {
|
73 |
$role->add_cap($newname['name']);
|
74 |
+
|
75 |
// for bbPress < 2.2, need to log customization of roles following bbPress activation
|
76 |
$plugins = ( function_exists( 'bbp_get_version' ) && version_compare( bbp_get_version(), '2.2', '<' ) ) ? array( 'bbpress.php' ) : array(); // back compat
|
77 |
|
90 |
} else {
|
91 |
ak_admin_notify(__('Incorrect capability name.'));
|
92 |
}
|
93 |
+
|
94 |
} elseif ( ! empty($post['update_filtered_types']) || ! empty($post['update_filtered_taxonomies']) || ! empty($post['update_detailed_taxonomies']) ) {
|
95 |
//if ( /* settings saved successfully on plugins_loaded action */ ) {
|
96 |
ak_admin_notify(__('Type / Taxonomy settings saved.', 'capsman-enhanced'));
|
99 |
//}
|
100 |
} else {
|
101 |
if (!apply_filters('publishpress-caps_submission_ok', false)) {
|
102 |
+
ak_admin_error(__('Bad form received.', 'capsman-enhanced'));
|
103 |
}
|
104 |
}
|
105 |
|
185 |
private function saveRoleCapabilities( $role_name, $caps, $level ) {
|
186 |
$this->cm->generateNames();
|
187 |
$role = get_role($role_name);
|
188 |
+
|
189 |
// workaround to ensure db storage of customizations to bbp dynamic roles
|
190 |
$role->name = $role_name;
|
191 |
|
304 |
( method_exists( $wp_roles, 'for_site' ) ) ? $wp_roles->for_site() : $wp_roles->reinit();
|
305 |
}
|
306 |
} // endif multisite installation with super admin editing a main site role
|
307 |
+
|
308 |
+
pp_capabilities_autobackup();
|
309 |
}
|
310 |
|
311 |
|
includes/manager.php
CHANGED
@@ -241,6 +241,8 @@ class CapabilityManager
|
|
241 |
*/
|
242 |
protected function pluginUpdate ()
|
243 |
{
|
|
|
|
|
244 |
$backup = get_option($this->ID . '_backup');
|
245 |
if ( false === $backup ) { // No previous backup found. Save it!
|
246 |
global $wpdb;
|
@@ -248,6 +250,10 @@ class CapabilityManager
|
|
248 |
update_option( $this->ID . '_backup', $roles, false );
|
249 |
update_option( $this->ID . '_backup_datestamp', current_time( 'timestamp' ), false );
|
250 |
}
|
|
|
|
|
|
|
|
|
251 |
}
|
252 |
|
253 |
/**
|
@@ -294,8 +300,17 @@ class CapabilityManager
|
|
294 |
);
|
295 |
|
296 |
add_submenu_page('capsman', __('Backup', 'capsman-enhanced'), __('Backup', 'capsman-enhanced'), $cap_name, $this->ID . '-tool', array($this, 'backupTool'));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
297 |
}
|
298 |
-
|
299 |
/**
|
300 |
* Sets the 'manage_capabilities' cap to the administrator role.
|
301 |
*
|
241 |
*/
|
242 |
protected function pluginUpdate ()
|
243 |
{
|
244 |
+
global $wpdb;
|
245 |
+
|
246 |
$backup = get_option($this->ID . '_backup');
|
247 |
if ( false === $backup ) { // No previous backup found. Save it!
|
248 |
global $wpdb;
|
250 |
update_option( $this->ID . '_backup', $roles, false );
|
251 |
update_option( $this->ID . '_backup_datestamp', current_time( 'timestamp' ), false );
|
252 |
}
|
253 |
+
|
254 |
+
if (!$wpdb->get_var("SELECT COUNT(option_id) FROM $wpdb->options WHERE option_name LIKE 'cme_backup_auto_%'")) {
|
255 |
+
pp_capabilities_autobackup();
|
256 |
+
}
|
257 |
}
|
258 |
|
259 |
/**
|
300 |
);
|
301 |
|
302 |
add_submenu_page('capsman', __('Backup', 'capsman-enhanced'), __('Backup', 'capsman-enhanced'), $cap_name, $this->ID . '-tool', array($this, 'backupTool'));
|
303 |
+
|
304 |
+
add_submenu_page(
|
305 |
+
'capsman',
|
306 |
+
__('Upgrade to Pro', 'capsman-enhanced'),
|
307 |
+
__('Upgrade to Pro', 'capsman-enhanced'),
|
308 |
+
'read',
|
309 |
+
'capabilities-pro',
|
310 |
+
array($this, 'generalManager')
|
311 |
+
);
|
312 |
}
|
313 |
+
|
314 |
/**
|
315 |
* Sets the 'manage_capabilities' cap to the administrator role.
|
316 |
*
|
lang/capsman.mo
CHANGED
Binary file
|
lang/capsman.po
CHANGED
@@ -2,8 +2,8 @@ msgid ""
|
|
2 |
msgstr ""
|
3 |
"Project-Id-Version: Capability Manager Enhanced\n"
|
4 |
"Report-Msgid-Bugs-To: \n"
|
5 |
-
"POT-Creation-Date: 2020-
|
6 |
-
"PO-Revision-Date: 2020-
|
7 |
"Last-Translator: Kevin Behrens <kevin@publishpress.com>\n"
|
8 |
"Language-Team: PublishPress <help@publishpress.com>\n"
|
9 |
"MIME-Version: 1.0\n"
|
@@ -58,7 +58,7 @@ msgid "Capabilities for %s"
|
|
58 |
msgstr ""
|
59 |
|
60 |
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:84
|
61 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
62 |
msgid "Save Changes"
|
63 |
msgstr ""
|
64 |
|
@@ -72,7 +72,7 @@ msgid "<strong>Note:</strong> Capability changes <strong>remain in the database<
|
|
72 |
msgstr ""
|
73 |
|
74 |
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:133
|
75 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
76 |
msgid "PublishPress Permissions"
|
77 |
msgstr ""
|
78 |
|
@@ -148,135 +148,135 @@ msgstr ""
|
|
148 |
msgid "%s info/purchase"
|
149 |
msgstr ""
|
150 |
|
151 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
152 |
msgid " "
|
153 |
msgstr ""
|
154 |
|
155 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
156 |
msgid "Reading"
|
157 |
msgstr ""
|
158 |
|
159 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
160 |
msgid "Editing Capabilities"
|
161 |
msgstr ""
|
162 |
|
163 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
164 |
msgid "Deletion Capabilities"
|
165 |
msgstr ""
|
166 |
|
167 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
168 |
msgid "can read posts which are currently published with private visibility"
|
169 |
msgstr ""
|
170 |
|
171 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
172 |
msgid "has basic editing capability (but may need other capabilities based on post status and ownership)"
|
173 |
msgstr ""
|
174 |
|
175 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
176 |
msgid "can edit posts which were created by other users"
|
177 |
msgstr ""
|
178 |
|
179 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
180 |
msgid "can edit posts which are currently published"
|
181 |
msgstr ""
|
182 |
|
183 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
184 |
msgid "can edit posts which are currently published with private visibility"
|
185 |
msgstr ""
|
186 |
|
187 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
188 |
msgid "can make a post publicly visible"
|
189 |
msgstr ""
|
190 |
|
191 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
192 |
msgid "has basic deletion capability (but may need other capabilities based on post status and ownership)"
|
193 |
msgstr ""
|
194 |
|
195 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
196 |
msgid "can delete posts which were created by other users"
|
197 |
msgstr ""
|
198 |
|
199 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
200 |
msgid "can delete posts which are currently published"
|
201 |
msgstr ""
|
202 |
|
203 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
204 |
msgid "can delete posts which are currently published with private visibility"
|
205 |
msgstr ""
|
206 |
|
207 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
208 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
209 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
210 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
211 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
212 |
#, php-format
|
213 |
msgid "%s: assigned by Permission Group"
|
214 |
msgstr ""
|
215 |
|
216 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
217 |
#, php-format
|
218 |
msgid "shared capability: %s"
|
219 |
msgstr ""
|
220 |
|
221 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
222 |
msgid "Other WordPress Core Capabilities"
|
223 |
msgstr ""
|
224 |
|
225 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
226 |
msgid "Lockout Prevention: To remove read capability, first remove WordPress admin / editing capabilities, or add \"dashboard_lockout_ok\" capability"
|
227 |
msgstr ""
|
228 |
|
229 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
230 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
231 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
232 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
233 |
msgid "check/uncheck all"
|
234 |
msgstr ""
|
235 |
|
236 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
237 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
238 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
239 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
240 |
msgid "negate all (storing as disabled capabilities)"
|
241 |
msgstr ""
|
242 |
|
243 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
244 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
245 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
246 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
247 |
msgid "negate none (add/remove all capabilities normally)"
|
248 |
msgstr ""
|
249 |
|
250 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
251 |
#, php-format
|
252 |
msgid "%s Capabilities"
|
253 |
msgstr ""
|
254 |
|
255 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
256 |
msgid "Additional Capabilities"
|
257 |
msgstr ""
|
258 |
|
259 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
260 |
msgid "Meta capabilities are used in code as placeholders for other capabilities. Assiging to a role has no effect."
|
261 |
msgstr ""
|
262 |
|
263 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
264 |
msgid "Invalid Capabilities"
|
265 |
msgstr ""
|
266 |
|
267 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
268 |
msgid "Role level is mostly deprecated. However, it still determines eligibility for Post Author assignment and limits the application of user editing capabilities."
|
269 |
msgstr ""
|
270 |
|
271 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
272 |
msgid "Role Level:"
|
273 |
msgstr ""
|
274 |
|
275 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
276 |
msgid "Delete this role"
|
277 |
msgstr ""
|
278 |
|
279 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
280 |
#, php-format
|
281 |
msgid ""
|
282 |
"You are about to delete the %s role.\n"
|
@@ -284,98 +284,98 @@ msgid ""
|
|
284 |
" 'Cancel' to stop, 'OK' to delete."
|
285 |
msgstr ""
|
286 |
|
287 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
288 |
msgid "Delete Role"
|
289 |
msgstr ""
|
290 |
|
291 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
292 |
msgid "Select New Role"
|
293 |
msgstr ""
|
294 |
|
295 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
296 |
msgid "Change"
|
297 |
msgstr ""
|
298 |
|
299 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
300 |
msgid "Create New Role"
|
301 |
msgstr ""
|
302 |
|
303 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
304 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
305 |
msgid "Role Name"
|
306 |
msgstr ""
|
307 |
|
308 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
309 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
310 |
msgid "Make role available for supplemental assignment to Permission Groups only"
|
311 |
msgstr ""
|
312 |
|
313 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
314 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
315 |
msgid "hidden"
|
316 |
msgstr ""
|
317 |
|
318 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
319 |
msgid "Create"
|
320 |
msgstr ""
|
321 |
|
322 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
323 |
msgid "Copy this role to"
|
324 |
msgstr ""
|
325 |
|
326 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
327 |
msgid "Copy"
|
328 |
msgstr ""
|
329 |
|
330 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
331 |
msgid "Add Capability"
|
332 |
msgstr ""
|
333 |
|
334 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
335 |
msgid "Add to role"
|
336 |
msgstr ""
|
337 |
|
338 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
339 |
msgid "Backup Tool"
|
340 |
msgstr ""
|
341 |
|
342 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
343 |
msgid "Backup / Restore Roles"
|
344 |
msgstr ""
|
345 |
|
346 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
347 |
msgid "Related Permissions Plugins"
|
348 |
msgstr ""
|
349 |
|
350 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
351 |
msgid "Multiple Authors"
|
352 |
msgstr ""
|
353 |
|
354 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
355 |
msgid "PublishPress"
|
356 |
msgstr ""
|
357 |
|
358 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
359 |
msgid "PublishPress Revisions"
|
360 |
msgstr ""
|
361 |
|
362 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
363 |
msgid "Help / Contact Form"
|
364 |
msgstr ""
|
365 |
|
366 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
367 |
msgid "Create this role definition in new (future) sites"
|
368 |
msgstr ""
|
369 |
|
370 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
371 |
msgid "include in new sites"
|
372 |
msgstr ""
|
373 |
|
374 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
375 |
msgid "Copy / update this role definition to all sites now"
|
376 |
msgstr ""
|
377 |
|
378 |
-
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:
|
379 |
msgid "sync role to all sites now"
|
380 |
msgstr ""
|
381 |
|
@@ -387,123 +387,129 @@ msgstr ""
|
|
387 |
msgid "New backup saved."
|
388 |
msgstr ""
|
389 |
|
390 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:
|
391 |
msgid "Roles and Capabilities restored from initial backup."
|
392 |
msgstr ""
|
393 |
|
394 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:
|
395 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:
|
|
|
396 |
msgid "Restore failed. No backup found."
|
397 |
msgstr ""
|
398 |
|
399 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:
|
400 |
msgid "Roles and Capabilities restored from last backup."
|
401 |
msgstr ""
|
402 |
|
403 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:
|
|
|
|
|
|
|
|
|
404 |
msgid "Needed function to create default roles not found!"
|
405 |
msgstr ""
|
406 |
|
407 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:
|
408 |
msgid "Roles and Capabilities reset to WordPress defaults"
|
409 |
msgstr ""
|
410 |
|
411 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
412 |
#, php-format
|
413 |
msgid "Backup Tool for %1$sPublishPress Capabilities%2$s"
|
414 |
msgstr ""
|
415 |
|
416 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
417 |
msgid "Backup and Restore"
|
418 |
msgstr ""
|
419 |
|
420 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
421 |
msgid "Select action:"
|
422 |
msgstr ""
|
423 |
|
424 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
425 |
msgid "Backup roles and capabilities"
|
426 |
msgstr ""
|
427 |
|
428 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
429 |
msgid "Restore initial backup"
|
430 |
msgstr ""
|
431 |
|
432 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
433 |
-
msgid "Restore last saved backup"
|
434 |
msgstr ""
|
435 |
|
436 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
437 |
-
|
|
|
438 |
msgstr ""
|
439 |
|
440 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
441 |
-
msgid "
|
442 |
msgstr ""
|
443 |
|
444 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
445 |
-
msgid "
|
446 |
msgstr ""
|
447 |
|
448 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
449 |
#, php-format
|
450 |
msgid "Initial Backup - %s"
|
451 |
msgstr ""
|
452 |
|
453 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
454 |
msgid "Initial Backup"
|
455 |
msgstr ""
|
456 |
|
457 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
458 |
#, php-format
|
459 |
-
msgid "Last Backup - %s"
|
460 |
msgstr ""
|
461 |
|
462 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
463 |
msgid "Last Backup"
|
464 |
msgstr ""
|
465 |
|
466 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
467 |
#, php-format
|
468 |
msgid "%s (%s roles)"
|
469 |
msgstr ""
|
470 |
|
471 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
472 |
#, php-format
|
473 |
msgid "%s (level %s)"
|
474 |
msgstr ""
|
475 |
|
476 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
477 |
msgid "Reset WordPress Defaults"
|
478 |
msgstr ""
|
479 |
|
480 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
481 |
msgid "WARNING:"
|
482 |
msgstr ""
|
483 |
|
484 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
485 |
msgid "Reseting default Roles and Capabilities will set them to the WordPress install defaults."
|
486 |
msgstr ""
|
487 |
|
488 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
489 |
msgid "If you have installed any plugin that adds new roles or capabilities, these will be lost."
|
490 |
msgstr ""
|
491 |
|
492 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
493 |
msgid "It is recommended to use this only as a last resource!"
|
494 |
msgstr ""
|
495 |
|
496 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
497 |
msgid "Reset Roles and Capabilities to WordPress defaults"
|
498 |
msgstr ""
|
499 |
|
500 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
501 |
msgid ""
|
502 |
"You are about to reset Roles and Capabilities to WordPress defaults.\n"
|
503 |
" 'Cancel' to stop, 'OK' to reset."
|
504 |
msgstr ""
|
505 |
|
506 |
-
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:
|
507 |
msgid "Reset to WordPress defaults"
|
508 |
msgstr ""
|
509 |
|
@@ -520,16 +526,19 @@ msgstr ""
|
|
520 |
msgid "Edit Roles"
|
521 |
msgstr ""
|
522 |
|
523 |
-
#: F:\snapshot\capability-manager-enhanced/includes/functions-admin.php:
|
524 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:274
|
525 |
msgid "Capabilities"
|
526 |
msgstr ""
|
527 |
|
528 |
-
#: F:\snapshot\capability-manager-enhanced/includes/functions-admin.php:
|
529 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:296
|
530 |
msgid "Backup"
|
531 |
msgstr ""
|
532 |
|
|
|
|
|
|
|
|
|
|
|
533 |
#: F:\snapshot\capability-manager-enhanced/includes/handler.php:18
|
534 |
#: F:\snapshot\capability-manager-enhanced/includes/handler.php:31
|
535 |
msgid "New role created."
|
@@ -556,12 +565,12 @@ msgstr ""
|
|
556 |
msgid "You cannot remove Manage Capabilities from Administrators"
|
557 |
msgstr ""
|
558 |
|
559 |
-
#: F:\snapshot\capability-manager-enhanced/includes/handler.php:
|
560 |
#, php-format
|
561 |
msgid "Cannot delete default role. You <a href=\"%s\">have to change it first</a>."
|
562 |
msgstr ""
|
563 |
|
564 |
-
#: F:\snapshot\capability-manager-enhanced/includes/handler.php:
|
565 |
#, php-format
|
566 |
msgid "Role has been deleted. %1$d users moved to default role %2$s."
|
567 |
msgstr ""
|
@@ -590,46 +599,46 @@ msgstr ""
|
|
590 |
msgid "Add or remove capability from the role normally"
|
591 |
msgstr ""
|
592 |
|
593 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
594 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
595 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
596 |
msgid "What do you think you're doing?!?"
|
597 |
msgstr ""
|
598 |
|
599 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
600 |
msgid "New capability added to role."
|
601 |
msgstr ""
|
602 |
|
603 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
604 |
msgid "Bad form Received"
|
605 |
msgstr ""
|
606 |
|
607 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
608 |
#, php-format
|
609 |
msgid "If you like %s, please leave us a %s rating. Thank you!"
|
610 |
msgstr ""
|
611 |
|
612 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
613 |
msgid "About PublishPress Capabilities"
|
614 |
msgstr ""
|
615 |
|
616 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
617 |
msgid "About"
|
618 |
msgstr ""
|
619 |
|
620 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
621 |
msgid "Capabilites Documentation"
|
622 |
msgstr ""
|
623 |
|
624 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
625 |
msgid "Documentation"
|
626 |
msgstr ""
|
627 |
|
628 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
629 |
msgid "Contact the PublishPress team"
|
630 |
msgstr ""
|
631 |
|
632 |
-
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:
|
633 |
msgid "Contact"
|
634 |
msgstr ""
|
635 |
|
2 |
msgstr ""
|
3 |
"Project-Id-Version: Capability Manager Enhanced\n"
|
4 |
"Report-Msgid-Bugs-To: \n"
|
5 |
+
"POT-Creation-Date: 2020-03-16 19:50-0500\n"
|
6 |
+
"PO-Revision-Date: 2020-03-16 19:50-0500\n"
|
7 |
"Last-Translator: Kevin Behrens <kevin@publishpress.com>\n"
|
8 |
"Language-Team: PublishPress <help@publishpress.com>\n"
|
9 |
"MIME-Version: 1.0\n"
|
58 |
msgstr ""
|
59 |
|
60 |
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:84
|
61 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1053
|
62 |
msgid "Save Changes"
|
63 |
msgstr ""
|
64 |
|
72 |
msgstr ""
|
73 |
|
74 |
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:133
|
75 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1144
|
76 |
msgid "PublishPress Permissions"
|
77 |
msgstr ""
|
78 |
|
148 |
msgid "%s info/purchase"
|
149 |
msgstr ""
|
150 |
|
151 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:268
|
152 |
msgid " "
|
153 |
msgstr ""
|
154 |
|
155 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:269
|
156 |
msgid "Reading"
|
157 |
msgstr ""
|
158 |
|
159 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:270
|
160 |
msgid "Editing Capabilities"
|
161 |
msgstr ""
|
162 |
|
163 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:271
|
164 |
msgid "Deletion Capabilities"
|
165 |
msgstr ""
|
166 |
|
167 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:275
|
168 |
msgid "can read posts which are currently published with private visibility"
|
169 |
msgstr ""
|
170 |
|
171 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:276
|
172 |
msgid "has basic editing capability (but may need other capabilities based on post status and ownership)"
|
173 |
msgstr ""
|
174 |
|
175 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:277
|
176 |
msgid "can edit posts which were created by other users"
|
177 |
msgstr ""
|
178 |
|
179 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:278
|
180 |
msgid "can edit posts which are currently published"
|
181 |
msgstr ""
|
182 |
|
183 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:279
|
184 |
msgid "can edit posts which are currently published with private visibility"
|
185 |
msgstr ""
|
186 |
|
187 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:280
|
188 |
msgid "can make a post publicly visible"
|
189 |
msgstr ""
|
190 |
|
191 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:281
|
192 |
msgid "has basic deletion capability (but may need other capabilities based on post status and ownership)"
|
193 |
msgstr ""
|
194 |
|
195 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:282
|
196 |
msgid "can delete posts which were created by other users"
|
197 |
msgstr ""
|
198 |
|
199 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:283
|
200 |
msgid "can delete posts which are currently published"
|
201 |
msgstr ""
|
202 |
|
203 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:284
|
204 |
msgid "can delete posts which are currently published with private visibility"
|
205 |
msgstr ""
|
206 |
|
207 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:416
|
208 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:522
|
209 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:784
|
210 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:879
|
211 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:976
|
212 |
#, php-format
|
213 |
msgid "%s: assigned by Permission Group"
|
214 |
msgstr ""
|
215 |
|
216 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:431
|
217 |
#, php-format
|
218 |
msgid "shared capability: %s"
|
219 |
msgstr ""
|
220 |
|
221 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:499
|
222 |
msgid "Other WordPress Core Capabilities"
|
223 |
msgstr ""
|
224 |
|
225 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:541
|
226 |
msgid "Lockout Prevention: To remove read capability, first remove WordPress admin / editing capabilities, or add \"dashboard_lockout_ok\" capability"
|
227 |
msgstr ""
|
228 |
|
229 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:584
|
230 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:823
|
231 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:932
|
232 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1019
|
233 |
msgid "check/uncheck all"
|
234 |
msgstr ""
|
235 |
|
236 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:584
|
237 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:823
|
238 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:932
|
239 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1019
|
240 |
msgid "negate all (storing as disabled capabilities)"
|
241 |
msgstr ""
|
242 |
|
243 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:584
|
244 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:823
|
245 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:932
|
246 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1019
|
247 |
msgid "negate none (add/remove all capabilities normally)"
|
248 |
msgstr ""
|
249 |
|
250 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:758
|
251 |
#, php-format
|
252 |
msgid "%s Capabilities"
|
253 |
msgstr ""
|
254 |
|
255 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:831
|
256 |
msgid "Additional Capabilities"
|
257 |
msgstr ""
|
258 |
|
259 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:941
|
260 |
msgid "Meta capabilities are used in code as placeholders for other capabilities. Assiging to a role has no effect."
|
261 |
msgstr ""
|
262 |
|
263 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:942
|
264 |
msgid "Invalid Capabilities"
|
265 |
msgstr ""
|
266 |
|
267 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1032
|
268 |
msgid "Role level is mostly deprecated. However, it still determines eligibility for Post Author assignment and limits the application of user editing capabilities."
|
269 |
msgstr ""
|
270 |
|
271 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1033
|
272 |
msgid "Role Level:"
|
273 |
msgstr ""
|
274 |
|
275 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1056
|
276 |
msgid "Delete this role"
|
277 |
msgstr ""
|
278 |
|
279 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1056
|
280 |
#, php-format
|
281 |
msgid ""
|
282 |
"You are about to delete the %s role.\n"
|
284 |
" 'Cancel' to stop, 'OK' to delete."
|
285 |
msgstr ""
|
286 |
|
287 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1056
|
288 |
msgid "Delete Role"
|
289 |
msgstr ""
|
290 |
|
291 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1063
|
292 |
msgid "Select New Role"
|
293 |
msgstr ""
|
294 |
|
295 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1072
|
296 |
msgid "Change"
|
297 |
msgstr ""
|
298 |
|
299 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1091
|
300 |
msgid "Create New Role"
|
301 |
msgstr ""
|
302 |
|
303 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1094
|
304 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1110
|
305 |
msgid "Role Name"
|
306 |
msgstr ""
|
307 |
|
308 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1097
|
309 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1113
|
310 |
msgid "Make role available for supplemental assignment to Permission Groups only"
|
311 |
msgstr ""
|
312 |
|
313 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1097
|
314 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1113
|
315 |
msgid "hidden"
|
316 |
msgstr ""
|
317 |
|
318 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1101
|
319 |
msgid "Create"
|
320 |
msgstr ""
|
321 |
|
322 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1107
|
323 |
msgid "Copy this role to"
|
324 |
msgstr ""
|
325 |
|
326 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1117
|
327 |
msgid "Copy"
|
328 |
msgstr ""
|
329 |
|
330 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1123
|
331 |
msgid "Add Capability"
|
332 |
msgstr ""
|
333 |
|
334 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1126
|
335 |
msgid "Add to role"
|
336 |
msgstr ""
|
337 |
|
338 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1131
|
339 |
msgid "Backup Tool"
|
340 |
msgstr ""
|
341 |
|
342 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1133
|
343 |
msgid "Backup / Restore Roles"
|
344 |
msgstr ""
|
345 |
|
346 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1138
|
347 |
msgid "Related Permissions Plugins"
|
348 |
msgstr ""
|
349 |
|
350 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1141
|
351 |
msgid "Multiple Authors"
|
352 |
msgstr ""
|
353 |
|
354 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1150
|
355 |
msgid "PublishPress"
|
356 |
msgstr ""
|
357 |
|
358 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1155
|
359 |
msgid "PublishPress Revisions"
|
360 |
msgstr ""
|
361 |
|
362 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1157
|
363 |
msgid "Help / Contact Form"
|
364 |
msgstr ""
|
365 |
|
366 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1195
|
367 |
msgid "Create this role definition in new (future) sites"
|
368 |
msgstr ""
|
369 |
|
370 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1195
|
371 |
msgid "include in new sites"
|
372 |
msgstr ""
|
373 |
|
374 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1198
|
375 |
msgid "Copy / update this role definition to all sites now"
|
376 |
msgstr ""
|
377 |
|
378 |
+
#: F:\snapshot\capability-manager-enhanced/includes/admin.php:1198
|
379 |
msgid "sync role to all sites now"
|
380 |
msgstr ""
|
381 |
|
387 |
msgid "New backup saved."
|
388 |
msgstr ""
|
389 |
|
390 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:50
|
391 |
msgid "Roles and Capabilities restored from initial backup."
|
392 |
msgstr ""
|
393 |
|
394 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:52
|
395 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:61
|
396 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:70
|
397 |
msgid "Restore failed. No backup found."
|
398 |
msgstr ""
|
399 |
|
400 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:59
|
401 |
msgid "Roles and Capabilities restored from last backup."
|
402 |
msgstr ""
|
403 |
|
404 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:68
|
405 |
+
msgid "Roles and Capabilities restored from selected auto-backup."
|
406 |
+
msgstr ""
|
407 |
+
|
408 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:88
|
409 |
msgid "Needed function to create default roles not found!"
|
410 |
msgstr ""
|
411 |
|
412 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup-handler.php:101
|
413 |
msgid "Roles and Capabilities reset to WordPress defaults"
|
414 |
msgstr ""
|
415 |
|
416 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:39
|
417 |
#, php-format
|
418 |
msgid "Backup Tool for %1$sPublishPress Capabilities%2$s"
|
419 |
msgstr ""
|
420 |
|
421 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:48
|
422 |
msgid "Backup and Restore"
|
423 |
msgstr ""
|
424 |
|
425 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:52
|
426 |
msgid "Select action:"
|
427 |
msgstr ""
|
428 |
|
429 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:55
|
430 |
msgid "Backup roles and capabilities"
|
431 |
msgstr ""
|
432 |
|
433 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:59
|
434 |
msgid "Restore initial backup"
|
435 |
msgstr ""
|
436 |
|
437 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:62
|
438 |
+
msgid "Restore last manually saved backup"
|
439 |
msgstr ""
|
440 |
|
441 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:69
|
442 |
+
#, php-format
|
443 |
+
msgid "Restore auto-backup (%s)"
|
444 |
msgstr ""
|
445 |
|
446 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:72
|
447 |
+
msgid "Do Action"
|
448 |
msgstr ""
|
449 |
|
450 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:76
|
451 |
+
msgid "To view the contents of a backup, select it in the dropdown above."
|
452 |
msgstr ""
|
453 |
|
454 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:110
|
455 |
#, php-format
|
456 |
msgid "Initial Backup - %s"
|
457 |
msgstr ""
|
458 |
|
459 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:110
|
460 |
msgid "Initial Backup"
|
461 |
msgstr ""
|
462 |
|
463 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:111
|
464 |
#, php-format
|
465 |
+
msgid "Last Manual Backup - %s"
|
466 |
msgstr ""
|
467 |
|
468 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:111
|
469 |
msgid "Last Backup"
|
470 |
msgstr ""
|
471 |
|
472 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:127
|
473 |
#, php-format
|
474 |
msgid "%s (%s roles)"
|
475 |
msgstr ""
|
476 |
|
477 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:143
|
478 |
#, php-format
|
479 |
msgid "%s (level %s)"
|
480 |
msgstr ""
|
481 |
|
482 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:164
|
483 |
msgid "Reset WordPress Defaults"
|
484 |
msgstr ""
|
485 |
|
486 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:166
|
487 |
msgid "WARNING:"
|
488 |
msgstr ""
|
489 |
|
490 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:166
|
491 |
msgid "Reseting default Roles and Capabilities will set them to the WordPress install defaults."
|
492 |
msgstr ""
|
493 |
|
494 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:169
|
495 |
msgid "If you have installed any plugin that adds new roles or capabilities, these will be lost."
|
496 |
msgstr ""
|
497 |
|
498 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:170
|
499 |
msgid "It is recommended to use this only as a last resource!"
|
500 |
msgstr ""
|
501 |
|
502 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:171
|
503 |
msgid "Reset Roles and Capabilities to WordPress defaults"
|
504 |
msgstr ""
|
505 |
|
506 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:171
|
507 |
msgid ""
|
508 |
"You are about to reset Roles and Capabilities to WordPress defaults.\n"
|
509 |
" 'Cancel' to stop, 'OK' to reset."
|
510 |
msgstr ""
|
511 |
|
512 |
+
#: F:\snapshot\capability-manager-enhanced/includes/backup.php:171
|
513 |
msgid "Reset to WordPress defaults"
|
514 |
msgstr ""
|
515 |
|
526 |
msgid "Edit Roles"
|
527 |
msgstr ""
|
528 |
|
529 |
+
#: F:\snapshot\capability-manager-enhanced/includes/functions-admin.php:13
|
|
|
530 |
msgid "Capabilities"
|
531 |
msgstr ""
|
532 |
|
533 |
+
#: F:\snapshot\capability-manager-enhanced/includes/functions-admin.php:35
|
|
|
534 |
msgid "Backup"
|
535 |
msgstr ""
|
536 |
|
537 |
+
#: F:\snapshot\capability-manager-enhanced/includes/functions-admin.php:39
|
538 |
+
#: F:\snapshot\capability-manager-enhanced/includes/functions-admin.php:40
|
539 |
+
msgid "Upgrade to Pro"
|
540 |
+
msgstr ""
|
541 |
+
|
542 |
#: F:\snapshot\capability-manager-enhanced/includes/handler.php:18
|
543 |
#: F:\snapshot\capability-manager-enhanced/includes/handler.php:31
|
544 |
msgid "New role created."
|
565 |
msgid "You cannot remove Manage Capabilities from Administrators"
|
566 |
msgstr ""
|
567 |
|
568 |
+
#: F:\snapshot\capability-manager-enhanced/includes/handler.php:330
|
569 |
#, php-format
|
570 |
msgid "Cannot delete default role. You <a href=\"%s\">have to change it first</a>."
|
571 |
msgstr ""
|
572 |
|
573 |
+
#: F:\snapshot\capability-manager-enhanced/includes/handler.php:377
|
574 |
#, php-format
|
575 |
msgid "Role has been deleted. %1$d users moved to default role %2$s."
|
576 |
msgstr ""
|
599 |
msgid "Add or remove capability from the role normally"
|
600 |
msgstr ""
|
601 |
|
602 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:405
|
603 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:446
|
604 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:619
|
605 |
msgid "What do you think you're doing?!?"
|
606 |
msgstr ""
|
607 |
|
608 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:460
|
609 |
msgid "New capability added to role."
|
610 |
msgstr ""
|
611 |
|
612 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:499
|
613 |
msgid "Bad form Received"
|
614 |
msgstr ""
|
615 |
|
616 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:645
|
617 |
#, php-format
|
618 |
msgid "If you like %s, please leave us a %s rating. Thank you!"
|
619 |
msgstr ""
|
620 |
|
621 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:656
|
622 |
msgid "About PublishPress Capabilities"
|
623 |
msgstr ""
|
624 |
|
625 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:656
|
626 |
msgid "About"
|
627 |
msgstr ""
|
628 |
|
629 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:658
|
630 |
msgid "Capabilites Documentation"
|
631 |
msgstr ""
|
632 |
|
633 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:658
|
634 |
msgid "Documentation"
|
635 |
msgstr ""
|
636 |
|
637 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:660
|
638 |
msgid "Contact the PublishPress team"
|
639 |
msgstr ""
|
640 |
|
641 |
+
#: F:\snapshot\capability-manager-enhanced/includes/manager.php:660
|
642 |
msgid "Contact"
|
643 |
msgstr ""
|
644 |
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Tags: role, capabilities, post types, taxonomies, editor, network, woocommerce
|
|
4 |
Requires at least: 4.9.7
|
5 |
Tested up to: 5.3.2
|
6 |
Requires PHP: 5.6.20
|
7 |
-
Stable tag: 1.9
|
8 |
License: GPLv3
|
9 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
@@ -71,12 +71,22 @@ Yes. Users with the 'manage_capabilities' capability can edit roles. This Capabi
|
|
71 |
|
72 |
== Changelog ==
|
73 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
= 1.9 - 9 Jan 2020 =
|
75 |
* Change : Renamed to PublishPress Capabilities
|
76 |
* Feature : Capabilities link on PublishPress > Roles row opens Role Capabilities screen
|
77 |
* Feature : Role Capabilities screen links to PublishPress > Roles for member management
|
78 |
* Fixed : Browser reload caused Role Capabilities screen to display default role
|
79 |
-
* Fixed : Add Capability sidebar added custom capability to role immediately, but capability checkbox did not display as checked until reload
|
80 |
* Fixed : Category Assign or Delete capabilities were not effective due to WordPress core forcing default capability requirement
|
81 |
* Fixed : Term Assign or Delete capabilities were not effective due to WordPress core forcing default capability requirement
|
82 |
* Fixed : Multisite - On sub-sites, Role Capabilities screen did not display PublishPress Capabilities section to Super Administrators who don't have a role on the site
|
4 |
Requires at least: 4.9.7
|
5 |
Tested up to: 5.3.2
|
6 |
Requires PHP: 5.6.20
|
7 |
+
Stable tag: 1.9.2
|
8 |
License: GPLv3
|
9 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
71 |
|
72 |
== Changelog ==
|
73 |
|
74 |
+
= 1.9.2 - 16 Mar 2020 =
|
75 |
+
* Feature : Auto-backup role and capabilities on each update (and on update to this version)
|
76 |
+
* Fixed : First-time installation: Capabilities menu item not displayed until after Plugins or Users menu clicked
|
77 |
+
* Change : Third Party Plugin Capabilities - always display checkboxes even if capabilities not present in Administrator role
|
78 |
+
* Fixed : Plugin capability sections - pp_set_notification_channel and pp_manage_roles were included in both PublishPress and PublishPress Permissions sections
|
79 |
+
* Fixed : Capability Negation (Denial) bulk unselect link was ambiguous due to missing strikethrough
|
80 |
+
|
81 |
+
= 1.9.1 - 16 Jan 2020 =
|
82 |
+
* Fixed : Create Role, Copy Role, and Add Capability sidebar functions did not work with ENTER keypress (caused screen reload without applying operation)
|
83 |
+
|
84 |
= 1.9 - 9 Jan 2020 =
|
85 |
* Change : Renamed to PublishPress Capabilities
|
86 |
* Feature : Capabilities link on PublishPress > Roles row opens Role Capabilities screen
|
87 |
* Feature : Role Capabilities screen links to PublishPress > Roles for member management
|
88 |
* Fixed : Browser reload caused Role Capabilities screen to display default role
|
89 |
+
* Fixed : Add Capability sidebar added custom capability to role immediately, but capability checkbox did not display as checked until reload
|
90 |
* Fixed : Category Assign or Delete capabilities were not effective due to WordPress core forcing default capability requirement
|
91 |
* Fixed : Term Assign or Delete capabilities were not effective due to WordPress core forcing default capability requirement
|
92 |
* Fixed : Multisite - On sub-sites, Role Capabilities screen did not display PublishPress Capabilities section to Super Administrators who don't have a role on the site
|
vendor/autoload.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload.php @generated by Composer
|
4 |
+
|
5 |
+
require_once __DIR__ . '/composer/autoload_real.php';
|
6 |
+
|
7 |
+
return ComposerAutoloaderInit32a3d3886cf8ef146352508e41da4ee9::getLoader();
|
vendor/composer/ClassLoader.php
ADDED
@@ -0,0 +1,445 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Composer.
|
5 |
+
*
|
6 |
+
* (c) Nils Adermann <naderman@naderman.de>
|
7 |
+
* Jordi Boggiano <j.boggiano@seld.be>
|
8 |
+
*
|
9 |
+
* For the full copyright and license information, please view the LICENSE
|
10 |
+
* file that was distributed with this source code.
|
11 |
+
*/
|
12 |
+
|
13 |
+
namespace Composer\Autoload;
|
14 |
+
|
15 |
+
/**
|
16 |
+
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
17 |
+
*
|
18 |
+
* $loader = new \Composer\Autoload\ClassLoader();
|
19 |
+
*
|
20 |
+
* // register classes with namespaces
|
21 |
+
* $loader->add('Symfony\Component', __DIR__.'/component');
|
22 |
+
* $loader->add('Symfony', __DIR__.'/framework');
|
23 |
+
*
|
24 |
+
* // activate the autoloader
|
25 |
+
* $loader->register();
|
26 |
+
*
|
27 |
+
* // to enable searching the include path (eg. for PEAR packages)
|
28 |
+
* $loader->setUseIncludePath(true);
|
29 |
+
*
|
30 |
+
* In this example, if you try to use a class in the Symfony\Component
|
31 |
+
* namespace or one of its children (Symfony\Component\Console for instance),
|
32 |
+
* the autoloader will first look for the class under the component/
|
33 |
+
* directory, and it will then fallback to the framework/ directory if not
|
34 |
+
* found before giving up.
|
35 |
+
*
|
36 |
+
* This class is loosely based on the Symfony UniversalClassLoader.
|
37 |
+
*
|
38 |
+
* @author Fabien Potencier <fabien@symfony.com>
|
39 |
+
* @author Jordi Boggiano <j.boggiano@seld.be>
|
40 |
+
* @see http://www.php-fig.org/psr/psr-0/
|
41 |
+
* @see http://www.php-fig.org/psr/psr-4/
|
42 |
+
*/
|
43 |
+
class ClassLoader
|
44 |
+
{
|
45 |
+
// PSR-4
|
46 |
+
private $prefixLengthsPsr4 = array();
|
47 |
+
private $prefixDirsPsr4 = array();
|
48 |
+
private $fallbackDirsPsr4 = array();
|
49 |
+
|
50 |
+
// PSR-0
|
51 |
+
private $prefixesPsr0 = array();
|
52 |
+
private $fallbackDirsPsr0 = array();
|
53 |
+
|
54 |
+
private $useIncludePath = false;
|
55 |
+
private $classMap = array();
|
56 |
+
private $classMapAuthoritative = false;
|
57 |
+
private $missingClasses = array();
|
58 |
+
private $apcuPrefix;
|
59 |
+
|
60 |
+
public function getPrefixes()
|
61 |
+
{
|
62 |
+
if (!empty($this->prefixesPsr0)) {
|
63 |
+
return call_user_func_array('array_merge', $this->prefixesPsr0);
|
64 |
+
}
|
65 |
+
|
66 |
+
return array();
|
67 |
+
}
|
68 |
+
|
69 |
+
public function getPrefixesPsr4()
|
70 |
+
{
|
71 |
+
return $this->prefixDirsPsr4;
|
72 |
+
}
|
73 |
+
|
74 |
+
public function getFallbackDirs()
|
75 |
+
{
|
76 |
+
return $this->fallbackDirsPsr0;
|
77 |
+
}
|
78 |
+
|
79 |
+
public function getFallbackDirsPsr4()
|
80 |
+
{
|
81 |
+
return $this->fallbackDirsPsr4;
|
82 |
+
}
|
83 |
+
|
84 |
+
public function getClassMap()
|
85 |
+
{
|
86 |
+
return $this->classMap;
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* @param array $classMap Class to filename map
|
91 |
+
*/
|
92 |
+
public function addClassMap(array $classMap)
|
93 |
+
{
|
94 |
+
if ($this->classMap) {
|
95 |
+
$this->classMap = array_merge($this->classMap, $classMap);
|
96 |
+
} else {
|
97 |
+
$this->classMap = $classMap;
|
98 |
+
}
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Registers a set of PSR-0 directories for a given prefix, either
|
103 |
+
* appending or prepending to the ones previously set for this prefix.
|
104 |
+
*
|
105 |
+
* @param string $prefix The prefix
|
106 |
+
* @param array|string $paths The PSR-0 root directories
|
107 |
+
* @param bool $prepend Whether to prepend the directories
|
108 |
+
*/
|
109 |
+
public function add($prefix, $paths, $prepend = false)
|
110 |
+
{
|
111 |
+
if (!$prefix) {
|
112 |
+
if ($prepend) {
|
113 |
+
$this->fallbackDirsPsr0 = array_merge(
|
114 |
+
(array) $paths,
|
115 |
+
$this->fallbackDirsPsr0
|
116 |
+
);
|
117 |
+
} else {
|
118 |
+
$this->fallbackDirsPsr0 = array_merge(
|
119 |
+
$this->fallbackDirsPsr0,
|
120 |
+
(array) $paths
|
121 |
+
);
|
122 |
+
}
|
123 |
+
|
124 |
+
return;
|
125 |
+
}
|
126 |
+
|
127 |
+
$first = $prefix[0];
|
128 |
+
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
129 |
+
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
130 |
+
|
131 |
+
return;
|
132 |
+
}
|
133 |
+
if ($prepend) {
|
134 |
+
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
135 |
+
(array) $paths,
|
136 |
+
$this->prefixesPsr0[$first][$prefix]
|
137 |
+
);
|
138 |
+
} else {
|
139 |
+
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
140 |
+
$this->prefixesPsr0[$first][$prefix],
|
141 |
+
(array) $paths
|
142 |
+
);
|
143 |
+
}
|
144 |
+
}
|
145 |
+
|
146 |
+
/**
|
147 |
+
* Registers a set of PSR-4 directories for a given namespace, either
|
148 |
+
* appending or prepending to the ones previously set for this namespace.
|
149 |
+
*
|
150 |
+
* @param string $prefix The prefix/namespace, with trailing '\\'
|
151 |
+
* @param array|string $paths The PSR-4 base directories
|
152 |
+
* @param bool $prepend Whether to prepend the directories
|
153 |
+
*
|
154 |
+
* @throws \InvalidArgumentException
|
155 |
+
*/
|
156 |
+
public function addPsr4($prefix, $paths, $prepend = false)
|
157 |
+
{
|
158 |
+
if (!$prefix) {
|
159 |
+
// Register directories for the root namespace.
|
160 |
+
if ($prepend) {
|
161 |
+
$this->fallbackDirsPsr4 = array_merge(
|
162 |
+
(array) $paths,
|
163 |
+
$this->fallbackDirsPsr4
|
164 |
+
);
|
165 |
+
} else {
|
166 |
+
$this->fallbackDirsPsr4 = array_merge(
|
167 |
+
$this->fallbackDirsPsr4,
|
168 |
+
(array) $paths
|
169 |
+
);
|
170 |
+
}
|
171 |
+
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
172 |
+
// Register directories for a new namespace.
|
173 |
+
$length = strlen($prefix);
|
174 |
+
if ('\\' !== $prefix[$length - 1]) {
|
175 |
+
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
176 |
+
}
|
177 |
+
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
178 |
+
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
179 |
+
} elseif ($prepend) {
|
180 |
+
// Prepend directories for an already registered namespace.
|
181 |
+
$this->prefixDirsPsr4[$prefix] = array_merge(
|
182 |
+
(array) $paths,
|
183 |
+
$this->prefixDirsPsr4[$prefix]
|
184 |
+
);
|
185 |
+
} else {
|
186 |
+
// Append directories for an already registered namespace.
|
187 |
+
$this->prefixDirsPsr4[$prefix] = array_merge(
|
188 |
+
$this->prefixDirsPsr4[$prefix],
|
189 |
+
(array) $paths
|
190 |
+
);
|
191 |
+
}
|
192 |
+
}
|
193 |
+
|
194 |
+
/**
|
195 |
+
* Registers a set of PSR-0 directories for a given prefix,
|
196 |
+
* replacing any others previously set for this prefix.
|
197 |
+
*
|
198 |
+
* @param string $prefix The prefix
|
199 |
+
* @param array|string $paths The PSR-0 base directories
|
200 |
+
*/
|
201 |
+
public function set($prefix, $paths)
|
202 |
+
{
|
203 |
+
if (!$prefix) {
|
204 |
+
$this->fallbackDirsPsr0 = (array) $paths;
|
205 |
+
} else {
|
206 |
+
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
207 |
+
}
|
208 |
+
}
|
209 |
+
|
210 |
+
/**
|
211 |
+
* Registers a set of PSR-4 directories for a given namespace,
|
212 |
+
* replacing any others previously set for this namespace.
|
213 |
+
*
|
214 |
+
* @param string $prefix The prefix/namespace, with trailing '\\'
|
215 |
+
* @param array|string $paths The PSR-4 base directories
|
216 |
+
*
|
217 |
+
* @throws \InvalidArgumentException
|
218 |
+
*/
|
219 |
+
public function setPsr4($prefix, $paths)
|
220 |
+
{
|
221 |
+
if (!$prefix) {
|
222 |
+
$this->fallbackDirsPsr4 = (array) $paths;
|
223 |
+
} else {
|
224 |
+
$length = strlen($prefix);
|
225 |
+
if ('\\' !== $prefix[$length - 1]) {
|
226 |
+
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
227 |
+
}
|
228 |
+
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
229 |
+
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
230 |
+
}
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* Turns on searching the include path for class files.
|
235 |
+
*
|
236 |
+
* @param bool $useIncludePath
|
237 |
+
*/
|
238 |
+
public function setUseIncludePath($useIncludePath)
|
239 |
+
{
|
240 |
+
$this->useIncludePath = $useIncludePath;
|
241 |
+
}
|
242 |
+
|
243 |
+
/**
|
244 |
+
* Can be used to check if the autoloader uses the include path to check
|
245 |
+
* for classes.
|
246 |
+
*
|
247 |
+
* @return bool
|
248 |
+
*/
|
249 |
+
public function getUseIncludePath()
|
250 |
+
{
|
251 |
+
return $this->useIncludePath;
|
252 |
+
}
|
253 |
+
|
254 |
+
/**
|
255 |
+
* Turns off searching the prefix and fallback directories for classes
|
256 |
+
* that have not been registered with the class map.
|
257 |
+
*
|
258 |
+
* @param bool $classMapAuthoritative
|
259 |
+
*/
|
260 |
+
public function setClassMapAuthoritative($classMapAuthoritative)
|
261 |
+
{
|
262 |
+
$this->classMapAuthoritative = $classMapAuthoritative;
|
263 |
+
}
|
264 |
+
|
265 |
+
/**
|
266 |
+
* Should class lookup fail if not found in the current class map?
|
267 |
+
*
|
268 |
+
* @return bool
|
269 |
+
*/
|
270 |
+
public function isClassMapAuthoritative()
|
271 |
+
{
|
272 |
+
return $this->classMapAuthoritative;
|
273 |
+
}
|
274 |
+
|
275 |
+
/**
|
276 |
+
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
277 |
+
*
|
278 |
+
* @param string|null $apcuPrefix
|
279 |
+
*/
|
280 |
+
public function setApcuPrefix($apcuPrefix)
|
281 |
+
{
|
282 |
+
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
|
283 |
+
}
|
284 |
+
|
285 |
+
/**
|
286 |
+
* The APCu prefix in use, or null if APCu caching is not enabled.
|
287 |
+
*
|
288 |
+
* @return string|null
|
289 |
+
*/
|
290 |
+
public function getApcuPrefix()
|
291 |
+
{
|
292 |
+
return $this->apcuPrefix;
|
293 |
+
}
|
294 |
+
|
295 |
+
/**
|
296 |
+
* Registers this instance as an autoloader.
|
297 |
+
*
|
298 |
+
* @param bool $prepend Whether to prepend the autoloader or not
|
299 |
+
*/
|
300 |
+
public function register($prepend = false)
|
301 |
+
{
|
302 |
+
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
303 |
+
}
|
304 |
+
|
305 |
+
/**
|
306 |
+
* Unregisters this instance as an autoloader.
|
307 |
+
*/
|
308 |
+
public function unregister()
|
309 |
+
{
|
310 |
+
spl_autoload_unregister(array($this, 'loadClass'));
|
311 |
+
}
|
312 |
+
|
313 |
+
/**
|
314 |
+
* Loads the given class or interface.
|
315 |
+
*
|
316 |
+
* @param string $class The name of the class
|
317 |
+
* @return bool|null True if loaded, null otherwise
|
318 |
+
*/
|
319 |
+
public function loadClass($class)
|
320 |
+
{
|
321 |
+
if ($file = $this->findFile($class)) {
|
322 |
+
includeFile($file);
|
323 |
+
|
324 |
+
return true;
|
325 |
+
}
|
326 |
+
}
|
327 |
+
|
328 |
+
/**
|
329 |
+
* Finds the path to the file where the class is defined.
|
330 |
+
*
|
331 |
+
* @param string $class The name of the class
|
332 |
+
*
|
333 |
+
* @return string|false The path if found, false otherwise
|
334 |
+
*/
|
335 |
+
public function findFile($class)
|
336 |
+
{
|
337 |
+
// class map lookup
|
338 |
+
if (isset($this->classMap[$class])) {
|
339 |
+
return $this->classMap[$class];
|
340 |
+
}
|
341 |
+
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
342 |
+
return false;
|
343 |
+
}
|
344 |
+
if (null !== $this->apcuPrefix) {
|
345 |
+
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
|
346 |
+
if ($hit) {
|
347 |
+
return $file;
|
348 |
+
}
|
349 |
+
}
|
350 |
+
|
351 |
+
$file = $this->findFileWithExtension($class, '.php');
|
352 |
+
|
353 |
+
// Search for Hack files if we are running on HHVM
|
354 |
+
if (false === $file && defined('HHVM_VERSION')) {
|
355 |
+
$file = $this->findFileWithExtension($class, '.hh');
|
356 |
+
}
|
357 |
+
|
358 |
+
if (null !== $this->apcuPrefix) {
|
359 |
+
apcu_add($this->apcuPrefix.$class, $file);
|
360 |
+
}
|
361 |
+
|
362 |
+
if (false === $file) {
|
363 |
+
// Remember that this class does not exist.
|
364 |
+
$this->missingClasses[$class] = true;
|
365 |
+
}
|
366 |
+
|
367 |
+
return $file;
|
368 |
+
}
|
369 |
+
|
370 |
+
private function findFileWithExtension($class, $ext)
|
371 |
+
{
|
372 |
+
// PSR-4 lookup
|
373 |
+
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
374 |
+
|
375 |
+
$first = $class[0];
|
376 |
+
if (isset($this->prefixLengthsPsr4[$first])) {
|
377 |
+
$subPath = $class;
|
378 |
+
while (false !== $lastPos = strrpos($subPath, '\\')) {
|
379 |
+
$subPath = substr($subPath, 0, $lastPos);
|
380 |
+
$search = $subPath . '\\';
|
381 |
+
if (isset($this->prefixDirsPsr4[$search])) {
|
382 |
+
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
|
383 |
+
foreach ($this->prefixDirsPsr4[$search] as $dir) {
|
384 |
+
if (file_exists($file = $dir . $pathEnd)) {
|
385 |
+
return $file;
|
386 |
+
}
|
387 |
+
}
|
388 |
+
}
|
389 |
+
}
|
390 |
+
}
|
391 |
+
|
392 |
+
// PSR-4 fallback dirs
|
393 |
+
foreach ($this->fallbackDirsPsr4 as $dir) {
|
394 |
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
395 |
+
return $file;
|
396 |
+
}
|
397 |
+
}
|
398 |
+
|
399 |
+
// PSR-0 lookup
|
400 |
+
if (false !== $pos = strrpos($class, '\\')) {
|
401 |
+
// namespaced class name
|
402 |
+
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
403 |
+
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
404 |
+
} else {
|
405 |
+
// PEAR-like class name
|
406 |
+
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
407 |
+
}
|
408 |
+
|
409 |
+
if (isset($this->prefixesPsr0[$first])) {
|
410 |
+
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
411 |
+
if (0 === strpos($class, $prefix)) {
|
412 |
+
foreach ($dirs as $dir) {
|
413 |
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
414 |
+
return $file;
|
415 |
+
}
|
416 |
+
}
|
417 |
+
}
|
418 |
+
}
|
419 |
+
}
|
420 |
+
|
421 |
+
// PSR-0 fallback dirs
|
422 |
+
foreach ($this->fallbackDirsPsr0 as $dir) {
|
423 |
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
424 |
+
return $file;
|
425 |
+
}
|
426 |
+
}
|
427 |
+
|
428 |
+
// PSR-0 include paths.
|
429 |
+
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
430 |
+
return $file;
|
431 |
+
}
|
432 |
+
|
433 |
+
return false;
|
434 |
+
}
|
435 |
+
}
|
436 |
+
|
437 |
+
/**
|
438 |
+
* Scope isolated include.
|
439 |
+
*
|
440 |
+
* Prevents access to $this/self from included files.
|
441 |
+
*/
|
442 |
+
function includeFile($file)
|
443 |
+
{
|
444 |
+
include $file;
|
445 |
+
}
|
vendor/composer/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
Copyright (c) Nils Adermann, Jordi Boggiano
|
3 |
+
|
4 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5 |
+
of this software and associated documentation files (the "Software"), to deal
|
6 |
+
in the Software without restriction, including without limitation the rights
|
7 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8 |
+
copies of the Software, and to permit persons to whom the Software is furnished
|
9 |
+
to do so, subject to the following conditions:
|
10 |
+
|
11 |
+
The above copyright notice and this permission notice shall be included in all
|
12 |
+
copies or substantial portions of the Software.
|
13 |
+
|
14 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20 |
+
THE SOFTWARE.
|
21 |
+
|
vendor/composer/autoload_classmap.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_classmap.php @generated by Composer
|
4 |
+
|
5 |
+
$vendorDir = dirname(dirname(__FILE__));
|
6 |
+
$baseDir = dirname($vendorDir);
|
7 |
+
|
8 |
+
return array(
|
9 |
+
);
|
vendor/composer/autoload_namespaces.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_namespaces.php @generated by Composer
|
4 |
+
|
5 |
+
$vendorDir = dirname(dirname(__FILE__));
|
6 |
+
$baseDir = dirname($vendorDir);
|
7 |
+
|
8 |
+
return array(
|
9 |
+
'Pimple' => array($vendorDir . '/pimple/pimple/src'),
|
10 |
+
);
|
vendor/composer/autoload_psr4.php
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_psr4.php @generated by Composer
|
4 |
+
|
5 |
+
$vendorDir = dirname(dirname(__FILE__));
|
6 |
+
$baseDir = dirname($vendorDir);
|
7 |
+
|
8 |
+
return array(
|
9 |
+
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
|
10 |
+
'PPVersionNotices\\' => array($vendorDir . '/publishpress/wordpress-version-notices/src'),
|
11 |
+
);
|
vendor/composer/autoload_real.php
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_real.php @generated by Composer
|
4 |
+
|
5 |
+
class ComposerAutoloaderInit32a3d3886cf8ef146352508e41da4ee9
|
6 |
+
{
|
7 |
+
private static $loader;
|
8 |
+
|
9 |
+
public static function loadClassLoader($class)
|
10 |
+
{
|
11 |
+
if ('Composer\Autoload\ClassLoader' === $class) {
|
12 |
+
require __DIR__ . '/ClassLoader.php';
|
13 |
+
}
|
14 |
+
}
|
15 |
+
|
16 |
+
/**
|
17 |
+
* @return \Composer\Autoload\ClassLoader
|
18 |
+
*/
|
19 |
+
public static function getLoader()
|
20 |
+
{
|
21 |
+
if (null !== self::$loader) {
|
22 |
+
return self::$loader;
|
23 |
+
}
|
24 |
+
|
25 |
+
spl_autoload_register(array('ComposerAutoloaderInit32a3d3886cf8ef146352508e41da4ee9', 'loadClassLoader'), true, true);
|
26 |
+
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
27 |
+
spl_autoload_unregister(array('ComposerAutoloaderInit32a3d3886cf8ef146352508e41da4ee9', 'loadClassLoader'));
|
28 |
+
|
29 |
+
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
30 |
+
if ($useStaticLoader) {
|
31 |
+
require_once __DIR__ . '/autoload_static.php';
|
32 |
+
|
33 |
+
call_user_func(\Composer\Autoload\ComposerStaticInit32a3d3886cf8ef146352508e41da4ee9::getInitializer($loader));
|
34 |
+
} else {
|
35 |
+
$map = require __DIR__ . '/autoload_namespaces.php';
|
36 |
+
foreach ($map as $namespace => $path) {
|
37 |
+
$loader->set($namespace, $path);
|
38 |
+
}
|
39 |
+
|
40 |
+
$map = require __DIR__ . '/autoload_psr4.php';
|
41 |
+
foreach ($map as $namespace => $path) {
|
42 |
+
$loader->setPsr4($namespace, $path);
|
43 |
+
}
|
44 |
+
|
45 |
+
$classMap = require __DIR__ . '/autoload_classmap.php';
|
46 |
+
if ($classMap) {
|
47 |
+
$loader->addClassMap($classMap);
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
$loader->register(true);
|
52 |
+
|
53 |
+
return $loader;
|
54 |
+
}
|
55 |
+
}
|
vendor/composer/autoload_static.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_static.php @generated by Composer
|
4 |
+
|
5 |
+
namespace Composer\Autoload;
|
6 |
+
|
7 |
+
class ComposerStaticInit32a3d3886cf8ef146352508e41da4ee9
|
8 |
+
{
|
9 |
+
public static $prefixLengthsPsr4 = array (
|
10 |
+
'P' =>
|
11 |
+
array (
|
12 |
+
'Psr\\Container\\' => 14,
|
13 |
+
'PPVersionNotices\\' => 17,
|
14 |
+
),
|
15 |
+
);
|
16 |
+
|
17 |
+
public static $prefixDirsPsr4 = array (
|
18 |
+
'Psr\\Container\\' =>
|
19 |
+
array (
|
20 |
+
0 => __DIR__ . '/..' . '/psr/container/src',
|
21 |
+
),
|
22 |
+
'PPVersionNotices\\' =>
|
23 |
+
array (
|
24 |
+
0 => __DIR__ . '/..' . '/publishpress/wordpress-version-notices/src',
|
25 |
+
),
|
26 |
+
);
|
27 |
+
|
28 |
+
public static $prefixesPsr0 = array (
|
29 |
+
'P' =>
|
30 |
+
array (
|
31 |
+
'Pimple' =>
|
32 |
+
array (
|
33 |
+
0 => __DIR__ . '/..' . '/pimple/pimple/src',
|
34 |
+
),
|
35 |
+
),
|
36 |
+
);
|
37 |
+
|
38 |
+
public static function getInitializer(ClassLoader $loader)
|
39 |
+
{
|
40 |
+
return \Closure::bind(function () use ($loader) {
|
41 |
+
$loader->prefixLengthsPsr4 = ComposerStaticInit32a3d3886cf8ef146352508e41da4ee9::$prefixLengthsPsr4;
|
42 |
+
$loader->prefixDirsPsr4 = ComposerStaticInit32a3d3886cf8ef146352508e41da4ee9::$prefixDirsPsr4;
|
43 |
+
$loader->prefixesPsr0 = ComposerStaticInit32a3d3886cf8ef146352508e41da4ee9::$prefixesPsr0;
|
44 |
+
|
45 |
+
}, null, ClassLoader::class);
|
46 |
+
}
|
47 |
+
}
|
vendor/composer/installed.json
ADDED
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[
|
2 |
+
{
|
3 |
+
"name": "pimple/pimple",
|
4 |
+
"version": "v3.3.0",
|
5 |
+
"version_normalized": "3.3.0.0",
|
6 |
+
"source": {
|
7 |
+
"type": "git",
|
8 |
+
"url": "https://github.com/silexphp/Pimple.git",
|
9 |
+
"reference": "e55d12f9d6a0e7f9c85992b73df1267f46279930"
|
10 |
+
},
|
11 |
+
"dist": {
|
12 |
+
"type": "zip",
|
13 |
+
"url": "https://api.github.com/repos/silexphp/Pimple/zipball/e55d12f9d6a0e7f9c85992b73df1267f46279930",
|
14 |
+
"reference": "e55d12f9d6a0e7f9c85992b73df1267f46279930",
|
15 |
+
"shasum": ""
|
16 |
+
},
|
17 |
+
"require": {
|
18 |
+
"php": "^7.2.5",
|
19 |
+
"psr/container": "^1.0"
|
20 |
+
},
|
21 |
+
"require-dev": {
|
22 |
+
"symfony/phpunit-bridge": "^3.4|^4.4|^5.0"
|
23 |
+
},
|
24 |
+
"time": "2020-03-03T09:12:48+00:00",
|
25 |
+
"type": "library",
|
26 |
+
"extra": {
|
27 |
+
"branch-alias": {
|
28 |
+
"dev-master": "3.3.x-dev"
|
29 |
+
}
|
30 |
+
},
|
31 |
+
"installation-source": "dist",
|
32 |
+
"autoload": {
|
33 |
+
"psr-0": {
|
34 |
+
"Pimple": "src/"
|
35 |
+
}
|
36 |
+
},
|
37 |
+
"notification-url": "https://packagist.org/downloads/",
|
38 |
+
"license": [
|
39 |
+
"MIT"
|
40 |
+
],
|
41 |
+
"authors": [
|
42 |
+
{
|
43 |
+
"name": "Fabien Potencier",
|
44 |
+
"email": "fabien@symfony.com"
|
45 |
+
}
|
46 |
+
],
|
47 |
+
"description": "Pimple, a simple Dependency Injection Container",
|
48 |
+
"homepage": "https://pimple.symfony.com",
|
49 |
+
"keywords": [
|
50 |
+
"container",
|
51 |
+
"dependency injection"
|
52 |
+
]
|
53 |
+
},
|
54 |
+
{
|
55 |
+
"name": "psr/container",
|
56 |
+
"version": "1.0.0",
|
57 |
+
"version_normalized": "1.0.0.0",
|
58 |
+
"source": {
|
59 |
+
"type": "git",
|
60 |
+
"url": "https://github.com/php-fig/container.git",
|
61 |
+
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
|
62 |
+
},
|
63 |
+
"dist": {
|
64 |
+
"type": "zip",
|
65 |
+
"url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
66 |
+
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
67 |
+
"shasum": ""
|
68 |
+
},
|
69 |
+
"require": {
|
70 |
+
"php": ">=5.3.0"
|
71 |
+
},
|
72 |
+
"time": "2017-02-14T16:28:37+00:00",
|
73 |
+
"type": "library",
|
74 |
+
"extra": {
|
75 |
+
"branch-alias": {
|
76 |
+
"dev-master": "1.0.x-dev"
|
77 |
+
}
|
78 |
+
},
|
79 |
+
"installation-source": "dist",
|
80 |
+
"autoload": {
|
81 |
+
"psr-4": {
|
82 |
+
"Psr\\Container\\": "src/"
|
83 |
+
}
|
84 |
+
},
|
85 |
+
"notification-url": "https://packagist.org/downloads/",
|
86 |
+
"license": [
|
87 |
+
"MIT"
|
88 |
+
],
|
89 |
+
"authors": [
|
90 |
+
{
|
91 |
+
"name": "PHP-FIG",
|
92 |
+
"homepage": "http://www.php-fig.org/"
|
93 |
+
}
|
94 |
+
],
|
95 |
+
"description": "Common Container Interface (PHP FIG PSR-11)",
|
96 |
+
"homepage": "https://github.com/php-fig/container",
|
97 |
+
"keywords": [
|
98 |
+
"PSR-11",
|
99 |
+
"container",
|
100 |
+
"container-interface",
|
101 |
+
"container-interop",
|
102 |
+
"psr"
|
103 |
+
]
|
104 |
+
},
|
105 |
+
{
|
106 |
+
"name": "publishpress/wordpress-version-notices",
|
107 |
+
"version": "dev-master",
|
108 |
+
"version_normalized": "9999999-dev",
|
109 |
+
"source": {
|
110 |
+
"type": "git",
|
111 |
+
"url": "https://github.com/publishpress/WordPress-Version-Notices.git",
|
112 |
+
"reference": "8f359bd2d7f72f2ef27fca3758825b505e7e65dd"
|
113 |
+
},
|
114 |
+
"dist": {
|
115 |
+
"type": "zip",
|
116 |
+
"url": "https://api.github.com/repos/publishpress/WordPress-Version-Notices/zipball/8f359bd2d7f72f2ef27fca3758825b505e7e65dd",
|
117 |
+
"reference": "8f359bd2d7f72f2ef27fca3758825b505e7e65dd",
|
118 |
+
"shasum": ""
|
119 |
+
},
|
120 |
+
"require": {
|
121 |
+
"php": ">=5.6.20",
|
122 |
+
"pimple/pimple": "^3"
|
123 |
+
},
|
124 |
+
"require-dev": {
|
125 |
+
"lucatume/wp-browser": "^2.2"
|
126 |
+
},
|
127 |
+
"time": "2020-03-16T22:13:50+00:00",
|
128 |
+
"type": "library",
|
129 |
+
"installation-source": "dist",
|
130 |
+
"autoload": {
|
131 |
+
"psr-4": {
|
132 |
+
"PPVersionNotices\\": "src/"
|
133 |
+
}
|
134 |
+
},
|
135 |
+
"notification-url": "https://packagist.org/downloads/",
|
136 |
+
"license": [
|
137 |
+
"GPL-3.0-or-later"
|
138 |
+
],
|
139 |
+
"authors": [
|
140 |
+
{
|
141 |
+
"name": "PublishPress",
|
142 |
+
"email": "help@publishpress.com",
|
143 |
+
"homepage": "https://publishpress.com",
|
144 |
+
"role": "Developer"
|
145 |
+
}
|
146 |
+
],
|
147 |
+
"description": "Library for displaying version notices for Pro plugins in WordPress."
|
148 |
+
}
|
149 |
+
]
|
vendor/pimple/pimple/.gitignore
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
phpunit.xml
|
2 |
+
composer.lock
|
3 |
+
/vendor/
|
vendor/pimple/pimple/.php_cs.dist
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
return PhpCsFixer\Config::create()
|
4 |
+
->setRules([
|
5 |
+
'@Symfony' => true,
|
6 |
+
'@Symfony:risky' => true,
|
7 |
+
'@PHPUnit75Migration:risky' => true,
|
8 |
+
'php_unit_dedicate_assert' => true,
|
9 |
+
'array_syntax' => ['syntax' => 'short'],
|
10 |
+
'php_unit_fqcn_annotation' => true,
|
11 |
+
'no_unreachable_default_argument_value' => false,
|
12 |
+
'braces' => ['allow_single_line_closure' => true],
|
13 |
+
'heredoc_to_nowdoc' => false,
|
14 |
+
'ordered_imports' => true,
|
15 |
+
'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'],
|
16 |
+
'native_function_invocation' => ['include' => ['@compiler_optimized'], 'scope' => 'all'],
|
17 |
+
])
|
18 |
+
->setRiskyAllowed(true)
|
19 |
+
->setFinder(PhpCsFixer\Finder::create()->in(__DIR__.'/src'))
|
20 |
+
;
|
vendor/pimple/pimple/.travis.yml
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
language: php
|
2 |
+
|
3 |
+
env:
|
4 |
+
global:
|
5 |
+
- REPORT_EXIT_STATUS=1
|
6 |
+
|
7 |
+
php:
|
8 |
+
- 7.2
|
9 |
+
- 7.3
|
10 |
+
- 7.4
|
11 |
+
|
12 |
+
before_script:
|
13 |
+
- composer self-update
|
14 |
+
- COMPOSER_ROOT_VERSION=dev-master composer install
|
15 |
+
|
16 |
+
script:
|
17 |
+
- ./vendor/bin/simple-phpunit
|
vendor/pimple/pimple/CHANGELOG
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
* 3.3.0 (2020-03-03)
|
2 |
+
|
3 |
+
* Drop PHP extension
|
4 |
+
* Bump min PHP version to 7.2.5
|
5 |
+
|
6 |
+
* 3.2.3 (2018-01-21)
|
7 |
+
|
8 |
+
* prefixed all function calls with \ for extra speed
|
9 |
+
|
10 |
+
* 3.2.2 (2017-07-23)
|
11 |
+
|
12 |
+
* reverted extending a protected closure throws an exception (deprecated it instead)
|
13 |
+
|
14 |
+
* 3.2.1 (2017-07-17)
|
15 |
+
|
16 |
+
* fixed PHP error
|
17 |
+
|
18 |
+
* 3.2.0 (2017-07-17)
|
19 |
+
|
20 |
+
* added a PSR-11 service locator
|
21 |
+
* added a PSR-11 wrapper
|
22 |
+
* added ServiceIterator
|
23 |
+
* fixed extending a protected closure (now throws InvalidServiceIdentifierException)
|
24 |
+
|
25 |
+
* 3.1.0 (2017-07-03)
|
26 |
+
|
27 |
+
* deprecated the C extension
|
28 |
+
* added support for PSR-11 exceptions
|
29 |
+
|
30 |
+
* 3.0.2 (2015-09-11)
|
31 |
+
|
32 |
+
* refactored the C extension
|
33 |
+
* minor non-significant changes
|
34 |
+
|
35 |
+
* 3.0.1 (2015-07-30)
|
36 |
+
|
37 |
+
* simplified some code
|
38 |
+
* fixed a segfault in the C extension
|
39 |
+
|
40 |
+
* 3.0.0 (2014-07-24)
|
41 |
+
|
42 |
+
* removed the Pimple class alias (use Pimple\Container instead)
|
43 |
+
|
44 |
+
* 2.1.1 (2014-07-24)
|
45 |
+
|
46 |
+
* fixed compiler warnings for the C extension
|
47 |
+
* fixed code when dealing with circular references
|
48 |
+
|
49 |
+
* 2.1.0 (2014-06-24)
|
50 |
+
|
51 |
+
* moved the Pimple to Pimple\Container (with a BC layer -- Pimple is now a
|
52 |
+
deprecated alias which will be removed in Pimple 3.0)
|
53 |
+
* added Pimple\ServiceProviderInterface (and Pimple::register())
|
54 |
+
|
55 |
+
* 2.0.0 (2014-02-10)
|
56 |
+
|
57 |
+
* changed extend to automatically re-assign the extended service and keep it as shared or factory
|
58 |
+
(to keep BC, extend still returns the extended service)
|
59 |
+
* changed services to be shared by default (use factory() for factory
|
60 |
+
services)
|
61 |
+
|
62 |
+
* 1.0.0
|
63 |
+
|
64 |
+
* initial version
|
vendor/pimple/pimple/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Copyright (c) 2009-2020 Fabien Potencier
|
2 |
+
|
3 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4 |
+
of this software and associated documentation files (the "Software"), to deal
|
5 |
+
in the Software without restriction, including without limitation the rights
|
6 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7 |
+
copies of the Software, and to permit persons to whom the Software is furnished
|
8 |
+
to do so, subject to the following conditions:
|
9 |
+
|
10 |
+
The above copyright notice and this permission notice shall be included in all
|
11 |
+
copies or substantial portions of the Software.
|
12 |
+
|
13 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19 |
+
THE SOFTWARE.
|
vendor/pimple/pimple/README.rst
ADDED
@@ -0,0 +1,326 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Pimple
|
2 |
+
======
|
3 |
+
|
4 |
+
.. caution::
|
5 |
+
|
6 |
+
This is the documentation for Pimple 3.x. If you are using Pimple 1.x, read
|
7 |
+
the `Pimple 1.x documentation`_. Reading the Pimple 1.x code is also a good
|
8 |
+
way to learn more about how to create a simple Dependency Injection
|
9 |
+
Container (recent versions of Pimple are more focused on performance).
|
10 |
+
|
11 |
+
Pimple is a small Dependency Injection Container for PHP.
|
12 |
+
|
13 |
+
Installation
|
14 |
+
------------
|
15 |
+
|
16 |
+
Before using Pimple in your project, add it to your ``composer.json`` file:
|
17 |
+
|
18 |
+
.. code-block:: bash
|
19 |
+
|
20 |
+
$ ./composer.phar require pimple/pimple "^3.0"
|
21 |
+
|
22 |
+
Usage
|
23 |
+
-----
|
24 |
+
|
25 |
+
Creating a container is a matter of creating a ``Container`` instance:
|
26 |
+
|
27 |
+
.. code-block:: php
|
28 |
+
|
29 |
+
use Pimple\Container;
|
30 |
+
|
31 |
+
$container = new Container();
|
32 |
+
|
33 |
+
As many other dependency injection containers, Pimple manages two different
|
34 |
+
kind of data: **services** and **parameters**.
|
35 |
+
|
36 |
+
Defining Services
|
37 |
+
~~~~~~~~~~~~~~~~~
|
38 |
+
|
39 |
+
A service is an object that does something as part of a larger system. Examples
|
40 |
+
of services: a database connection, a templating engine, or a mailer. Almost
|
41 |
+
any **global** object can be a service.
|
42 |
+
|
43 |
+
Services are defined by **anonymous functions** that return an instance of an
|
44 |
+
object:
|
45 |
+
|
46 |
+
.. code-block:: php
|
47 |
+
|
48 |
+
// define some services
|
49 |
+
$container['session_storage'] = function ($c) {
|
50 |
+
return new SessionStorage('SESSION_ID');
|
51 |
+
};
|
52 |
+
|
53 |
+
$container['session'] = function ($c) {
|
54 |
+
return new Session($c['session_storage']);
|
55 |
+
};
|
56 |
+
|
57 |
+
Notice that the anonymous function has access to the current container
|
58 |
+
instance, allowing references to other services or parameters.
|
59 |
+
|
60 |
+
As objects are only created when you get them, the order of the definitions
|
61 |
+
does not matter.
|
62 |
+
|
63 |
+
Using the defined services is also very easy:
|
64 |
+
|
65 |
+
.. code-block:: php
|
66 |
+
|
67 |
+
// get the session object
|
68 |
+
$session = $container['session'];
|
69 |
+
|
70 |
+
// the above call is roughly equivalent to the following code:
|
71 |
+
// $storage = new SessionStorage('SESSION_ID');
|
72 |
+
// $session = new Session($storage);
|
73 |
+
|
74 |
+
Defining Factory Services
|
75 |
+
~~~~~~~~~~~~~~~~~~~~~~~~~
|
76 |
+
|
77 |
+
By default, each time you get a service, Pimple returns the **same instance**
|
78 |
+
of it. If you want a different instance to be returned for all calls, wrap your
|
79 |
+
anonymous function with the ``factory()`` method
|
80 |
+
|
81 |
+
.. code-block:: php
|
82 |
+
|
83 |
+
$container['session'] = $container->factory(function ($c) {
|
84 |
+
return new Session($c['session_storage']);
|
85 |
+
});
|
86 |
+
|
87 |
+
Now, each call to ``$container['session']`` returns a new instance of the
|
88 |
+
session.
|
89 |
+
|
90 |
+
Defining Parameters
|
91 |
+
~~~~~~~~~~~~~~~~~~~
|
92 |
+
|
93 |
+
Defining a parameter allows to ease the configuration of your container from
|
94 |
+
the outside and to store global values:
|
95 |
+
|
96 |
+
.. code-block:: php
|
97 |
+
|
98 |
+
// define some parameters
|
99 |
+
$container['cookie_name'] = 'SESSION_ID';
|
100 |
+
$container['session_storage_class'] = 'SessionStorage';
|
101 |
+
|
102 |
+
If you change the ``session_storage`` service definition like below:
|
103 |
+
|
104 |
+
.. code-block:: php
|
105 |
+
|
106 |
+
$container['session_storage'] = function ($c) {
|
107 |
+
return new $c['session_storage_class']($c['cookie_name']);
|
108 |
+
};
|
109 |
+
|
110 |
+
You can now easily change the cookie name by overriding the
|
111 |
+
``cookie_name`` parameter instead of redefining the service
|
112 |
+
definition.
|
113 |
+
|
114 |
+
Protecting Parameters
|
115 |
+
~~~~~~~~~~~~~~~~~~~~~
|
116 |
+
|
117 |
+
Because Pimple sees anonymous functions as service definitions, you need to
|
118 |
+
wrap anonymous functions with the ``protect()`` method to store them as
|
119 |
+
parameters:
|
120 |
+
|
121 |
+
.. code-block:: php
|
122 |
+
|
123 |
+
$container['random_func'] = $container->protect(function () {
|
124 |
+
return rand();
|
125 |
+
});
|
126 |
+
|
127 |
+
Modifying Services after Definition
|
128 |
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
129 |
+
|
130 |
+
In some cases you may want to modify a service definition after it has been
|
131 |
+
defined. You can use the ``extend()`` method to define additional code to be
|
132 |
+
run on your service just after it is created:
|
133 |
+
|
134 |
+
.. code-block:: php
|
135 |
+
|
136 |
+
$container['session_storage'] = function ($c) {
|
137 |
+
return new $c['session_storage_class']($c['cookie_name']);
|
138 |
+
};
|
139 |
+
|
140 |
+
$container->extend('session_storage', function ($storage, $c) {
|
141 |
+
$storage->...();
|
142 |
+
|
143 |
+
return $storage;
|
144 |
+
});
|
145 |
+
|
146 |
+
The first argument is the name of the service to extend, the second a function
|
147 |
+
that gets access to the object instance and the container.
|
148 |
+
|
149 |
+
Extending a Container
|
150 |
+
~~~~~~~~~~~~~~~~~~~~~
|
151 |
+
|
152 |
+
If you use the same libraries over and over, you might want to reuse some
|
153 |
+
services from one project to the next one; package your services into a
|
154 |
+
**provider** by implementing ``Pimple\ServiceProviderInterface``:
|
155 |
+
|
156 |
+
.. code-block:: php
|
157 |
+
|
158 |
+
use Pimple\Container;
|
159 |
+
|
160 |
+
class FooProvider implements Pimple\ServiceProviderInterface
|
161 |
+
{
|
162 |
+
public function register(Container $pimple)
|
163 |
+
{
|
164 |
+
// register some services and parameters
|
165 |
+
// on $pimple
|
166 |
+
}
|
167 |
+
}
|
168 |
+
|
169 |
+
Then, register the provider on a Container:
|
170 |
+
|
171 |
+
.. code-block:: php
|
172 |
+
|
173 |
+
$pimple->register(new FooProvider());
|
174 |
+
|
175 |
+
Fetching the Service Creation Function
|
176 |
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
177 |
+
|
178 |
+
When you access an object, Pimple automatically calls the anonymous function
|
179 |
+
that you defined, which creates the service object for you. If you want to get
|
180 |
+
raw access to this function, you can use the ``raw()`` method:
|
181 |
+
|
182 |
+
.. code-block:: php
|
183 |
+
|
184 |
+
$container['session'] = function ($c) {
|
185 |
+
return new Session($c['session_storage']);
|
186 |
+
};
|
187 |
+
|
188 |
+
$sessionFunction = $container->raw('session');
|
189 |
+
|
190 |
+
PSR-11 compatibility
|
191 |
+
--------------------
|
192 |
+
|
193 |
+
For historical reasons, the ``Container`` class does not implement the PSR-11
|
194 |
+
``ContainerInterface``. However, Pimple provides a helper class that will let
|
195 |
+
you decouple your code from the Pimple container class.
|
196 |
+
|
197 |
+
The PSR-11 container class
|
198 |
+
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
199 |
+
|
200 |
+
The ``Pimple\Psr11\Container`` class lets you access the content of an
|
201 |
+
underlying Pimple container using ``Psr\Container\ContainerInterface``
|
202 |
+
methods:
|
203 |
+
|
204 |
+
.. code-block:: php
|
205 |
+
|
206 |
+
use Pimple\Container;
|
207 |
+
use Pimple\Psr11\Container as PsrContainer;
|
208 |
+
|
209 |
+
$container = new Container();
|
210 |
+
$container['service'] = function ($c) {
|
211 |
+
return new Service();
|
212 |
+
};
|
213 |
+
$psr11 = new PsrContainer($container);
|
214 |
+
|
215 |
+
$controller = function (PsrContainer $container) {
|
216 |
+
$service = $container->get('service');
|
217 |
+
};
|
218 |
+
$controller($psr11);
|
219 |
+
|
220 |
+
Using the PSR-11 ServiceLocator
|
221 |
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
222 |
+
|
223 |
+
Sometimes, a service needs access to several other services without being sure
|
224 |
+
that all of them will actually be used. In those cases, you may want the
|
225 |
+
instantiation of the services to be lazy.
|
226 |
+
|
227 |
+
The traditional solution is to inject the entire service container to get only
|
228 |
+
the services really needed. However, this is not recommended because it gives
|
229 |
+
services a too broad access to the rest of the application and it hides their
|
230 |
+
actual dependencies.
|
231 |
+
|
232 |
+
The ``ServiceLocator`` is intended to solve this problem by giving access to a
|
233 |
+
set of predefined services while instantiating them only when actually needed.
|
234 |
+
|
235 |
+
It also allows you to make your services available under a different name than
|
236 |
+
the one used to register them. For instance, you may want to use an object
|
237 |
+
that expects an instance of ``EventDispatcherInterface`` to be available under
|
238 |
+
the name ``event_dispatcher`` while your event dispatcher has been
|
239 |
+
registered under the name ``dispatcher``:
|
240 |
+
|
241 |
+
.. code-block:: php
|
242 |
+
|
243 |
+
use Monolog\Logger;
|
244 |
+
use Pimple\Psr11\ServiceLocator;
|
245 |
+
use Psr\Container\ContainerInterface;
|
246 |
+
use Symfony\Component\EventDispatcher\EventDispatcher;
|
247 |
+
|
248 |
+
class MyService
|
249 |
+
{
|
250 |
+
/**
|
251 |
+
* "logger" must be an instance of Psr\Log\LoggerInterface
|
252 |
+
* "event_dispatcher" must be an instance of Symfony\Component\EventDispatcher\EventDispatcherInterface
|
253 |
+
*/
|
254 |
+
private $services;
|
255 |
+
|
256 |
+
public function __construct(ContainerInterface $services)
|
257 |
+
{
|
258 |
+
$this->services = $services;
|
259 |
+
}
|
260 |
+
}
|
261 |
+
|
262 |
+
$container['logger'] = function ($c) {
|
263 |
+
return new Monolog\Logger();
|
264 |
+
};
|
265 |
+
$container['dispatcher'] = function () {
|
266 |
+
return new EventDispatcher();
|
267 |
+
};
|
268 |
+
|
269 |
+
$container['service'] = function ($c) {
|
270 |
+
$locator = new ServiceLocator($c, array('logger', 'event_dispatcher' => 'dispatcher'));
|
271 |
+
|
272 |
+
return new MyService($locator);
|
273 |
+
};
|
274 |
+
|
275 |
+
Referencing a Collection of Services Lazily
|
276 |
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
277 |
+
|
278 |
+
Passing a collection of services instances in an array may prove inefficient
|
279 |
+
if the class that consumes the collection only needs to iterate over it at a
|
280 |
+
later stage, when one of its method is called. It can also lead to problems
|
281 |
+
if there is a circular dependency between one of the services stored in the
|
282 |
+
collection and the class that consumes it.
|
283 |
+
|
284 |
+
The ``ServiceIterator`` class helps you solve these issues. It receives a
|
285 |
+
list of service names during instantiation and will retrieve the services
|
286 |
+
when iterated over:
|
287 |
+
|
288 |
+
.. code-block:: php
|
289 |
+
|
290 |
+
use Pimple\Container;
|
291 |
+
use Pimple\ServiceIterator;
|
292 |
+
|
293 |
+
class AuthorizationService
|
294 |
+
{
|
295 |
+
private $voters;
|
296 |
+
|
297 |
+
public function __construct($voters)
|
298 |
+
{
|
299 |
+
$this->voters = $voters;
|
300 |
+
}
|
301 |
+
|
302 |
+
public function canAccess($resource)
|
303 |
+
{
|
304 |
+
foreach ($this->voters as $voter) {
|
305 |
+
if (true === $voter->canAccess($resource) {
|
306 |
+
return true;
|
307 |
+
}
|
308 |
+
}
|
309 |
+
|
310 |
+
return false;
|
311 |
+
}
|
312 |
+
}
|
313 |
+
|
314 |
+
$container = new Container();
|
315 |
+
|
316 |
+
$container['voter1'] = function ($c) {
|
317 |
+
return new SomeVoter();
|
318 |
+
}
|
319 |
+
$container['voter2'] = function ($c) {
|
320 |
+
return new SomeOtherVoter($c['auth']);
|
321 |
+
}
|
322 |
+
$container['auth'] = function ($c) {
|
323 |
+
return new AuthorizationService(new ServiceIterator($c, array('voter1', 'voter2'));
|
324 |
+
}
|
325 |
+
|
326 |
+
.. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1
|
vendor/pimple/pimple/composer.json
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "pimple/pimple",
|
3 |
+
"type": "library",
|
4 |
+
"description": "Pimple, a simple Dependency Injection Container",
|
5 |
+
"keywords": ["dependency injection", "container"],
|
6 |
+
"homepage": "https://pimple.symfony.com",
|
7 |
+
"license": "MIT",
|
8 |
+
"authors": [
|
9 |
+
{
|
10 |
+
"name": "Fabien Potencier",
|
11 |
+
"email": "fabien@symfony.com"
|
12 |
+
}
|
13 |
+
],
|
14 |
+
"require": {
|
15 |
+
"php": "^7.2.5",
|
16 |
+
"psr/container": "^1.0"
|
17 |
+
},
|
18 |
+
"require-dev": {
|
19 |
+
"symfony/phpunit-bridge": "^3.4|^4.4|^5.0"
|
20 |
+
},
|
21 |
+
"autoload": {
|
22 |
+
"psr-0": { "Pimple": "src/" }
|
23 |
+
},
|
24 |
+
"extra": {
|
25 |
+
"branch-alias": {
|
26 |
+
"dev-master": "3.3.x-dev"
|
27 |
+
}
|
28 |
+
}
|
29 |
+
}
|
vendor/pimple/pimple/phpunit.xml.dist
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
|
3 |
+
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
4 |
+
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd"
|
5 |
+
backupGlobals="false"
|
6 |
+
colors="true"
|
7 |
+
bootstrap="vendor/autoload.php"
|
8 |
+
>
|
9 |
+
<testsuites>
|
10 |
+
<testsuite name="Pimple Test Suite">
|
11 |
+
<directory>./src/Pimple/Tests</directory>
|
12 |
+
</testsuite>
|
13 |
+
</testsuites>
|
14 |
+
|
15 |
+
<listeners>
|
16 |
+
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" />
|
17 |
+
</listeners>
|
18 |
+
</phpunit>
|
vendor/pimple/pimple/src/Pimple/Container.php
ADDED
@@ -0,0 +1,298 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple;
|
28 |
+
|
29 |
+
use Pimple\Exception\ExpectedInvokableException;
|
30 |
+
use Pimple\Exception\FrozenServiceException;
|
31 |
+
use Pimple\Exception\InvalidServiceIdentifierException;
|
32 |
+
use Pimple\Exception\UnknownIdentifierException;
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Container main class.
|
36 |
+
*
|
37 |
+
* @author Fabien Potencier
|
38 |
+
*/
|
39 |
+
class Container implements \ArrayAccess
|
40 |
+
{
|
41 |
+
private $values = [];
|
42 |
+
private $factories;
|
43 |
+
private $protected;
|
44 |
+
private $frozen = [];
|
45 |
+
private $raw = [];
|
46 |
+
private $keys = [];
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Instantiates the container.
|
50 |
+
*
|
51 |
+
* Objects and parameters can be passed as argument to the constructor.
|
52 |
+
*
|
53 |
+
* @param array $values The parameters or objects
|
54 |
+
*/
|
55 |
+
public function __construct(array $values = [])
|
56 |
+
{
|
57 |
+
$this->factories = new \SplObjectStorage();
|
58 |
+
$this->protected = new \SplObjectStorage();
|
59 |
+
|
60 |
+
foreach ($values as $key => $value) {
|
61 |
+
$this->offsetSet($key, $value);
|
62 |
+
}
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Sets a parameter or an object.
|
67 |
+
*
|
68 |
+
* Objects must be defined as Closures.
|
69 |
+
*
|
70 |
+
* Allowing any PHP callable leads to difficult to debug problems
|
71 |
+
* as function names (strings) are callable (creating a function with
|
72 |
+
* the same name as an existing parameter would break your container).
|
73 |
+
*
|
74 |
+
* @param string $id The unique identifier for the parameter or object
|
75 |
+
* @param mixed $value The value of the parameter or a closure to define an object
|
76 |
+
*
|
77 |
+
* @throws FrozenServiceException Prevent override of a frozen service
|
78 |
+
*/
|
79 |
+
public function offsetSet($id, $value)
|
80 |
+
{
|
81 |
+
if (isset($this->frozen[$id])) {
|
82 |
+
throw new FrozenServiceException($id);
|
83 |
+
}
|
84 |
+
|
85 |
+
$this->values[$id] = $value;
|
86 |
+
$this->keys[$id] = true;
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Gets a parameter or an object.
|
91 |
+
*
|
92 |
+
* @param string $id The unique identifier for the parameter or object
|
93 |
+
*
|
94 |
+
* @return mixed The value of the parameter or an object
|
95 |
+
*
|
96 |
+
* @throws UnknownIdentifierException If the identifier is not defined
|
97 |
+
*/
|
98 |
+
public function offsetGet($id)
|
99 |
+
{
|
100 |
+
if (!isset($this->keys[$id])) {
|
101 |
+
throw new UnknownIdentifierException($id);
|
102 |
+
}
|
103 |
+
|
104 |
+
if (
|
105 |
+
isset($this->raw[$id])
|
106 |
+
|| !\is_object($this->values[$id])
|
107 |
+
|| isset($this->protected[$this->values[$id]])
|
108 |
+
|| !\method_exists($this->values[$id], '__invoke')
|
109 |
+
) {
|
110 |
+
return $this->values[$id];
|
111 |
+
}
|
112 |
+
|
113 |
+
if (isset($this->factories[$this->values[$id]])) {
|
114 |
+
return $this->values[$id]($this);
|
115 |
+
}
|
116 |
+
|
117 |
+
$raw = $this->values[$id];
|
118 |
+
$val = $this->values[$id] = $raw($this);
|
119 |
+
$this->raw[$id] = $raw;
|
120 |
+
|
121 |
+
$this->frozen[$id] = true;
|
122 |
+
|
123 |
+
return $val;
|
124 |
+
}
|
125 |
+
|
126 |
+
/**
|
127 |
+
* Checks if a parameter or an object is set.
|
128 |
+
*
|
129 |
+
* @param string $id The unique identifier for the parameter or object
|
130 |
+
*
|
131 |
+
* @return bool
|
132 |
+
*/
|
133 |
+
public function offsetExists($id)
|
134 |
+
{
|
135 |
+
return isset($this->keys[$id]);
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Unsets a parameter or an object.
|
140 |
+
*
|
141 |
+
* @param string $id The unique identifier for the parameter or object
|
142 |
+
*/
|
143 |
+
public function offsetUnset($id)
|
144 |
+
{
|
145 |
+
if (isset($this->keys[$id])) {
|
146 |
+
if (\is_object($this->values[$id])) {
|
147 |
+
unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]);
|
148 |
+
}
|
149 |
+
|
150 |
+
unset($this->values[$id], $this->frozen[$id], $this->raw[$id], $this->keys[$id]);
|
151 |
+
}
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Marks a callable as being a factory service.
|
156 |
+
*
|
157 |
+
* @param callable $callable A service definition to be used as a factory
|
158 |
+
*
|
159 |
+
* @return callable The passed callable
|
160 |
+
*
|
161 |
+
* @throws ExpectedInvokableException Service definition has to be a closure or an invokable object
|
162 |
+
*/
|
163 |
+
public function factory($callable)
|
164 |
+
{
|
165 |
+
if (!\method_exists($callable, '__invoke')) {
|
166 |
+
throw new ExpectedInvokableException('Service definition is not a Closure or invokable object.');
|
167 |
+
}
|
168 |
+
|
169 |
+
$this->factories->attach($callable);
|
170 |
+
|
171 |
+
return $callable;
|
172 |
+
}
|
173 |
+
|
174 |
+
/**
|
175 |
+
* Protects a callable from being interpreted as a service.
|
176 |
+
*
|
177 |
+
* This is useful when you want to store a callable as a parameter.
|
178 |
+
*
|
179 |
+
* @param callable $callable A callable to protect from being evaluated
|
180 |
+
*
|
181 |
+
* @return callable The passed callable
|
182 |
+
*
|
183 |
+
* @throws ExpectedInvokableException Service definition has to be a closure or an invokable object
|
184 |
+
*/
|
185 |
+
public function protect($callable)
|
186 |
+
{
|
187 |
+
if (!\method_exists($callable, '__invoke')) {
|
188 |
+
throw new ExpectedInvokableException('Callable is not a Closure or invokable object.');
|
189 |
+
}
|
190 |
+
|
191 |
+
$this->protected->attach($callable);
|
192 |
+
|
193 |
+
return $callable;
|
194 |
+
}
|
195 |
+
|
196 |
+
/**
|
197 |
+
* Gets a parameter or the closure defining an object.
|
198 |
+
*
|
199 |
+
* @param string $id The unique identifier for the parameter or object
|
200 |
+
*
|
201 |
+
* @return mixed The value of the parameter or the closure defining an object
|
202 |
+
*
|
203 |
+
* @throws UnknownIdentifierException If the identifier is not defined
|
204 |
+
*/
|
205 |
+
public function raw($id)
|
206 |
+
{
|
207 |
+
if (!isset($this->keys[$id])) {
|
208 |
+
throw new UnknownIdentifierException($id);
|
209 |
+
}
|
210 |
+
|
211 |
+
if (isset($this->raw[$id])) {
|
212 |
+
return $this->raw[$id];
|
213 |
+
}
|
214 |
+
|
215 |
+
return $this->values[$id];
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* Extends an object definition.
|
220 |
+
*
|
221 |
+
* Useful when you want to extend an existing object definition,
|
222 |
+
* without necessarily loading that object.
|
223 |
+
*
|
224 |
+
* @param string $id The unique identifier for the object
|
225 |
+
* @param callable $callable A service definition to extend the original
|
226 |
+
*
|
227 |
+
* @return callable The wrapped callable
|
228 |
+
*
|
229 |
+
* @throws UnknownIdentifierException If the identifier is not defined
|
230 |
+
* @throws FrozenServiceException If the service is frozen
|
231 |
+
* @throws InvalidServiceIdentifierException If the identifier belongs to a parameter
|
232 |
+
* @throws ExpectedInvokableException If the extension callable is not a closure or an invokable object
|
233 |
+
*/
|
234 |
+
public function extend($id, $callable)
|
235 |
+
{
|
236 |
+
if (!isset($this->keys[$id])) {
|
237 |
+
throw new UnknownIdentifierException($id);
|
238 |
+
}
|
239 |
+
|
240 |
+
if (isset($this->frozen[$id])) {
|
241 |
+
throw new FrozenServiceException($id);
|
242 |
+
}
|
243 |
+
|
244 |
+
if (!\is_object($this->values[$id]) || !\method_exists($this->values[$id], '__invoke')) {
|
245 |
+
throw new InvalidServiceIdentifierException($id);
|
246 |
+
}
|
247 |
+
|
248 |
+
if (isset($this->protected[$this->values[$id]])) {
|
249 |
+
@\trigger_error(\sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), E_USER_DEPRECATED);
|
250 |
+
}
|
251 |
+
|
252 |
+
if (!\is_object($callable) || !\method_exists($callable, '__invoke')) {
|
253 |
+
throw new ExpectedInvokableException('Extension service definition is not a Closure or invokable object.');
|
254 |
+
}
|
255 |
+
|
256 |
+
$factory = $this->values[$id];
|
257 |
+
|
258 |
+
$extended = function ($c) use ($callable, $factory) {
|
259 |
+
return $callable($factory($c), $c);
|
260 |
+
};
|
261 |
+
|
262 |
+
if (isset($this->factories[$factory])) {
|
263 |
+
$this->factories->detach($factory);
|
264 |
+
$this->factories->attach($extended);
|
265 |
+
}
|
266 |
+
|
267 |
+
return $this[$id] = $extended;
|
268 |
+
}
|
269 |
+
|
270 |
+
/**
|
271 |
+
* Returns all defined value names.
|
272 |
+
*
|
273 |
+
* @return array An array of value names
|
274 |
+
*/
|
275 |
+
public function keys()
|
276 |
+
{
|
277 |
+
return \array_keys($this->values);
|
278 |
+
}
|
279 |
+
|
280 |
+
/**
|
281 |
+
* Registers a service provider.
|
282 |
+
*
|
283 |
+
* @param ServiceProviderInterface $provider A ServiceProviderInterface instance
|
284 |
+
* @param array $values An array of values that customizes the provider
|
285 |
+
*
|
286 |
+
* @return static
|
287 |
+
*/
|
288 |
+
public function register(ServiceProviderInterface $provider, array $values = [])
|
289 |
+
{
|
290 |
+
$provider->register($this);
|
291 |
+
|
292 |
+
foreach ($values as $key => $value) {
|
293 |
+
$this[$key] = $value;
|
294 |
+
}
|
295 |
+
|
296 |
+
return $this;
|
297 |
+
}
|
298 |
+
}
|
vendor/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Exception;
|
28 |
+
|
29 |
+
use Psr\Container\ContainerExceptionInterface;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* A closure or invokable object was expected.
|
33 |
+
*
|
34 |
+
* @author Pascal Luna <skalpa@zetareticuli.org>
|
35 |
+
*/
|
36 |
+
class ExpectedInvokableException extends \InvalidArgumentException implements ContainerExceptionInterface
|
37 |
+
{
|
38 |
+
}
|
vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Exception;
|
28 |
+
|
29 |
+
use Psr\Container\ContainerExceptionInterface;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* An attempt to modify a frozen service was made.
|
33 |
+
*
|
34 |
+
* @author Pascal Luna <skalpa@zetareticuli.org>
|
35 |
+
*/
|
36 |
+
class FrozenServiceException extends \RuntimeException implements ContainerExceptionInterface
|
37 |
+
{
|
38 |
+
/**
|
39 |
+
* @param string $id Identifier of the frozen service
|
40 |
+
*/
|
41 |
+
public function __construct($id)
|
42 |
+
{
|
43 |
+
parent::__construct(\sprintf('Cannot override frozen service "%s".', $id));
|
44 |
+
}
|
45 |
+
}
|
vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Exception;
|
28 |
+
|
29 |
+
use Psr\Container\NotFoundExceptionInterface;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* An attempt to perform an operation that requires a service identifier was made.
|
33 |
+
*
|
34 |
+
* @author Pascal Luna <skalpa@zetareticuli.org>
|
35 |
+
*/
|
36 |
+
class InvalidServiceIdentifierException extends \InvalidArgumentException implements NotFoundExceptionInterface
|
37 |
+
{
|
38 |
+
/**
|
39 |
+
* @param string $id The invalid identifier
|
40 |
+
*/
|
41 |
+
public function __construct($id)
|
42 |
+
{
|
43 |
+
parent::__construct(\sprintf('Identifier "%s" does not contain an object definition.', $id));
|
44 |
+
}
|
45 |
+
}
|
vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Exception;
|
28 |
+
|
29 |
+
use Psr\Container\NotFoundExceptionInterface;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* The identifier of a valid service or parameter was expected.
|
33 |
+
*
|
34 |
+
* @author Pascal Luna <skalpa@zetareticuli.org>
|
35 |
+
*/
|
36 |
+
class UnknownIdentifierException extends \InvalidArgumentException implements NotFoundExceptionInterface
|
37 |
+
{
|
38 |
+
/**
|
39 |
+
* @param string $id The unknown identifier
|
40 |
+
*/
|
41 |
+
public function __construct($id)
|
42 |
+
{
|
43 |
+
parent::__construct(\sprintf('Identifier "%s" is not defined.', $id));
|
44 |
+
}
|
45 |
+
}
|
vendor/pimple/pimple/src/Pimple/Psr11/Container.php
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009-2017 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Psr11;
|
28 |
+
|
29 |
+
use Pimple\Container as PimpleContainer;
|
30 |
+
use Psr\Container\ContainerInterface;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* PSR-11 compliant wrapper.
|
34 |
+
*
|
35 |
+
* @author Pascal Luna <skalpa@zetareticuli.org>
|
36 |
+
*/
|
37 |
+
final class Container implements ContainerInterface
|
38 |
+
{
|
39 |
+
private $pimple;
|
40 |
+
|
41 |
+
public function __construct(PimpleContainer $pimple)
|
42 |
+
{
|
43 |
+
$this->pimple = $pimple;
|
44 |
+
}
|
45 |
+
|
46 |
+
public function get($id)
|
47 |
+
{
|
48 |
+
return $this->pimple[$id];
|
49 |
+
}
|
50 |
+
|
51 |
+
public function has($id)
|
52 |
+
{
|
53 |
+
return isset($this->pimple[$id]);
|
54 |
+
}
|
55 |
+
}
|
vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php
ADDED
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Psr11;
|
28 |
+
|
29 |
+
use Pimple\Container as PimpleContainer;
|
30 |
+
use Pimple\Exception\UnknownIdentifierException;
|
31 |
+
use Psr\Container\ContainerInterface;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Pimple PSR-11 service locator.
|
35 |
+
*
|
36 |
+
* @author Pascal Luna <skalpa@zetareticuli.org>
|
37 |
+
*/
|
38 |
+
class ServiceLocator implements ContainerInterface
|
39 |
+
{
|
40 |
+
private $container;
|
41 |
+
private $aliases = [];
|
42 |
+
|
43 |
+
/**
|
44 |
+
* @param PimpleContainer $container The Container instance used to locate services
|
45 |
+
* @param array $ids Array of service ids that can be located. String keys can be used to define aliases
|
46 |
+
*/
|
47 |
+
public function __construct(PimpleContainer $container, array $ids)
|
48 |
+
{
|
49 |
+
$this->container = $container;
|
50 |
+
|
51 |
+
foreach ($ids as $key => $id) {
|
52 |
+
$this->aliases[\is_int($key) ? $id : $key] = $id;
|
53 |
+
}
|
54 |
+
}
|
55 |
+
|
56 |
+
/**
|
57 |
+
* {@inheritdoc}
|
58 |
+
*/
|
59 |
+
public function get($id)
|
60 |
+
{
|
61 |
+
if (!isset($this->aliases[$id])) {
|
62 |
+
throw new UnknownIdentifierException($id);
|
63 |
+
}
|
64 |
+
|
65 |
+
return $this->container[$this->aliases[$id]];
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* {@inheritdoc}
|
70 |
+
*/
|
71 |
+
public function has($id)
|
72 |
+
{
|
73 |
+
return isset($this->aliases[$id]) && isset($this->container[$this->aliases[$id]]);
|
74 |
+
}
|
75 |
+
}
|
vendor/pimple/pimple/src/Pimple/ServiceIterator.php
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Lazy service iterator.
|
31 |
+
*
|
32 |
+
* @author Pascal Luna <skalpa@zetareticuli.org>
|
33 |
+
*/
|
34 |
+
final class ServiceIterator implements \Iterator
|
35 |
+
{
|
36 |
+
private $container;
|
37 |
+
private $ids;
|
38 |
+
|
39 |
+
public function __construct(Container $container, array $ids)
|
40 |
+
{
|
41 |
+
$this->container = $container;
|
42 |
+
$this->ids = $ids;
|
43 |
+
}
|
44 |
+
|
45 |
+
public function rewind()
|
46 |
+
{
|
47 |
+
\reset($this->ids);
|
48 |
+
}
|
49 |
+
|
50 |
+
public function current()
|
51 |
+
{
|
52 |
+
return $this->container[\current($this->ids)];
|
53 |
+
}
|
54 |
+
|
55 |
+
public function key()
|
56 |
+
{
|
57 |
+
return \current($this->ids);
|
58 |
+
}
|
59 |
+
|
60 |
+
public function next()
|
61 |
+
{
|
62 |
+
\next($this->ids);
|
63 |
+
}
|
64 |
+
|
65 |
+
public function valid()
|
66 |
+
{
|
67 |
+
return null !== \key($this->ids);
|
68 |
+
}
|
69 |
+
}
|
vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Pimple service provider interface.
|
31 |
+
*
|
32 |
+
* @author Fabien Potencier
|
33 |
+
* @author Dominik Zogg
|
34 |
+
*/
|
35 |
+
interface ServiceProviderInterface
|
36 |
+
{
|
37 |
+
/**
|
38 |
+
* Registers services on the given container.
|
39 |
+
*
|
40 |
+
* This method should only be used to configure services and parameters.
|
41 |
+
* It should not get services.
|
42 |
+
*
|
43 |
+
* @param Container $pimple A container instance
|
44 |
+
*/
|
45 |
+
public function register(Container $pimple);
|
46 |
+
}
|
vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Tests\Fixtures;
|
28 |
+
|
29 |
+
class Invokable
|
30 |
+
{
|
31 |
+
public function __invoke($value = null)
|
32 |
+
{
|
33 |
+
$service = new Service();
|
34 |
+
$service->value = $value;
|
35 |
+
|
36 |
+
return $service;
|
37 |
+
}
|
38 |
+
}
|
vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Tests\Fixtures;
|
28 |
+
|
29 |
+
class NonInvokable
|
30 |
+
{
|
31 |
+
public function __call($a, $b)
|
32 |
+
{
|
33 |
+
}
|
34 |
+
}
|
vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Tests\Fixtures;
|
28 |
+
|
29 |
+
use Pimple\Container;
|
30 |
+
use Pimple\ServiceProviderInterface;
|
31 |
+
|
32 |
+
class PimpleServiceProvider implements ServiceProviderInterface
|
33 |
+
{
|
34 |
+
/**
|
35 |
+
* Registers services on the given container.
|
36 |
+
*
|
37 |
+
* This method should only be used to configure services and parameters.
|
38 |
+
* It should not get services.
|
39 |
+
*
|
40 |
+
* @param Container $pimple An Container instance
|
41 |
+
*/
|
42 |
+
public function register(Container $pimple)
|
43 |
+
{
|
44 |
+
$pimple['param'] = 'value';
|
45 |
+
|
46 |
+
$pimple['service'] = function () {
|
47 |
+
return new Service();
|
48 |
+
};
|
49 |
+
|
50 |
+
$pimple['factory'] = $pimple->factory(function () {
|
51 |
+
return new Service();
|
52 |
+
});
|
53 |
+
}
|
54 |
+
}
|
vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Tests\Fixtures;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @author Igor Wiedler <igor@wiedler.ch>
|
31 |
+
*/
|
32 |
+
class Service
|
33 |
+
{
|
34 |
+
public $value;
|
35 |
+
}
|
vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Tests;
|
28 |
+
|
29 |
+
use PHPUnit\Framework\TestCase;
|
30 |
+
use Pimple\Container;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* @author Dominik Zogg <dominik.zogg@gmail.com>
|
34 |
+
*/
|
35 |
+
class PimpleServiceProviderInterfaceTest extends TestCase
|
36 |
+
{
|
37 |
+
public function testProvider()
|
38 |
+
{
|
39 |
+
$pimple = new Container();
|
40 |
+
|
41 |
+
$pimpleServiceProvider = new Fixtures\PimpleServiceProvider();
|
42 |
+
$pimpleServiceProvider->register($pimple);
|
43 |
+
|
44 |
+
$this->assertEquals('value', $pimple['param']);
|
45 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']);
|
46 |
+
|
47 |
+
$serviceOne = $pimple['factory'];
|
48 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
|
49 |
+
|
50 |
+
$serviceTwo = $pimple['factory'];
|
51 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
|
52 |
+
|
53 |
+
$this->assertNotSame($serviceOne, $serviceTwo);
|
54 |
+
}
|
55 |
+
|
56 |
+
public function testProviderWithRegisterMethod()
|
57 |
+
{
|
58 |
+
$pimple = new Container();
|
59 |
+
|
60 |
+
$pimple->register(new Fixtures\PimpleServiceProvider(), [
|
61 |
+
'anotherParameter' => 'anotherValue',
|
62 |
+
]);
|
63 |
+
|
64 |
+
$this->assertEquals('value', $pimple['param']);
|
65 |
+
$this->assertEquals('anotherValue', $pimple['anotherParameter']);
|
66 |
+
|
67 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']);
|
68 |
+
|
69 |
+
$serviceOne = $pimple['factory'];
|
70 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
|
71 |
+
|
72 |
+
$serviceTwo = $pimple['factory'];
|
73 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
|
74 |
+
|
75 |
+
$this->assertNotSame($serviceOne, $serviceTwo);
|
76 |
+
}
|
77 |
+
}
|
vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php
ADDED
@@ -0,0 +1,610 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Tests;
|
28 |
+
|
29 |
+
use PHPUnit\Framework\TestCase;
|
30 |
+
use Pimple\Container;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* @author Igor Wiedler <igor@wiedler.ch>
|
34 |
+
*/
|
35 |
+
class PimpleTest extends TestCase
|
36 |
+
{
|
37 |
+
public function testWithString()
|
38 |
+
{
|
39 |
+
$pimple = new Container();
|
40 |
+
$pimple['param'] = 'value';
|
41 |
+
|
42 |
+
$this->assertEquals('value', $pimple['param']);
|
43 |
+
}
|
44 |
+
|
45 |
+
public function testWithClosure()
|
46 |
+
{
|
47 |
+
$pimple = new Container();
|
48 |
+
$pimple['service'] = function () {
|
49 |
+
return new Fixtures\Service();
|
50 |
+
};
|
51 |
+
|
52 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']);
|
53 |
+
}
|
54 |
+
|
55 |
+
public function testServicesShouldBeDifferent()
|
56 |
+
{
|
57 |
+
$pimple = new Container();
|
58 |
+
$pimple['service'] = $pimple->factory(function () {
|
59 |
+
return new Fixtures\Service();
|
60 |
+
});
|
61 |
+
|
62 |
+
$serviceOne = $pimple['service'];
|
63 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
|
64 |
+
|
65 |
+
$serviceTwo = $pimple['service'];
|
66 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
|
67 |
+
|
68 |
+
$this->assertNotSame($serviceOne, $serviceTwo);
|
69 |
+
}
|
70 |
+
|
71 |
+
public function testShouldPassContainerAsParameter()
|
72 |
+
{
|
73 |
+
$pimple = new Container();
|
74 |
+
$pimple['service'] = function () {
|
75 |
+
return new Fixtures\Service();
|
76 |
+
};
|
77 |
+
$pimple['container'] = function ($container) {
|
78 |
+
return $container;
|
79 |
+
};
|
80 |
+
|
81 |
+
$this->assertNotSame($pimple, $pimple['service']);
|
82 |
+
$this->assertSame($pimple, $pimple['container']);
|
83 |
+
}
|
84 |
+
|
85 |
+
public function testIsset()
|
86 |
+
{
|
87 |
+
$pimple = new Container();
|
88 |
+
$pimple['param'] = 'value';
|
89 |
+
$pimple['service'] = function () {
|
90 |
+
return new Fixtures\Service();
|
91 |
+
};
|
92 |
+
|
93 |
+
$pimple['null'] = null;
|
94 |
+
|
95 |
+
$this->assertTrue(isset($pimple['param']));
|
96 |
+
$this->assertTrue(isset($pimple['service']));
|
97 |
+
$this->assertTrue(isset($pimple['null']));
|
98 |
+
$this->assertFalse(isset($pimple['non_existent']));
|
99 |
+
}
|
100 |
+
|
101 |
+
public function testConstructorInjection()
|
102 |
+
{
|
103 |
+
$params = ['param' => 'value'];
|
104 |
+
$pimple = new Container($params);
|
105 |
+
|
106 |
+
$this->assertSame($params['param'], $pimple['param']);
|
107 |
+
}
|
108 |
+
|
109 |
+
public function testOffsetGetValidatesKeyIsPresent()
|
110 |
+
{
|
111 |
+
$this->expectException(\Pimple\Exception\UnknownIdentifierException::class);
|
112 |
+
$this->expectExceptionMessage('Identifier "foo" is not defined.');
|
113 |
+
|
114 |
+
$pimple = new Container();
|
115 |
+
echo $pimple['foo'];
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* @group legacy
|
120 |
+
*/
|
121 |
+
public function testLegacyOffsetGetValidatesKeyIsPresent()
|
122 |
+
{
|
123 |
+
$this->expectException(\InvalidArgumentException::class);
|
124 |
+
$this->expectExceptionMessage('Identifier "foo" is not defined.');
|
125 |
+
|
126 |
+
$pimple = new Container();
|
127 |
+
echo $pimple['foo'];
|
128 |
+
}
|
129 |
+
|
130 |
+
public function testOffsetGetHonorsNullValues()
|
131 |
+
{
|
132 |
+
$pimple = new Container();
|
133 |
+
$pimple['foo'] = null;
|
134 |
+
$this->assertNull($pimple['foo']);
|
135 |
+
}
|
136 |
+
|
137 |
+
public function testUnset()
|
138 |
+
{
|
139 |
+
$pimple = new Container();
|
140 |
+
$pimple['param'] = 'value';
|
141 |
+
$pimple['service'] = function () {
|
142 |
+
return new Fixtures\Service();
|
143 |
+
};
|
144 |
+
|
145 |
+
unset($pimple['param'], $pimple['service']);
|
146 |
+
$this->assertFalse(isset($pimple['param']));
|
147 |
+
$this->assertFalse(isset($pimple['service']));
|
148 |
+
}
|
149 |
+
|
150 |
+
/**
|
151 |
+
* @dataProvider serviceDefinitionProvider
|
152 |
+
*/
|
153 |
+
public function testShare($service)
|
154 |
+
{
|
155 |
+
$pimple = new Container();
|
156 |
+
$pimple['shared_service'] = $service;
|
157 |
+
|
158 |
+
$serviceOne = $pimple['shared_service'];
|
159 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
|
160 |
+
|
161 |
+
$serviceTwo = $pimple['shared_service'];
|
162 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
|
163 |
+
|
164 |
+
$this->assertSame($serviceOne, $serviceTwo);
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* @dataProvider serviceDefinitionProvider
|
169 |
+
*/
|
170 |
+
public function testProtect($service)
|
171 |
+
{
|
172 |
+
$pimple = new Container();
|
173 |
+
$pimple['protected'] = $pimple->protect($service);
|
174 |
+
|
175 |
+
$this->assertSame($service, $pimple['protected']);
|
176 |
+
}
|
177 |
+
|
178 |
+
public function testGlobalFunctionNameAsParameterValue()
|
179 |
+
{
|
180 |
+
$pimple = new Container();
|
181 |
+
$pimple['global_function'] = 'strlen';
|
182 |
+
$this->assertSame('strlen', $pimple['global_function']);
|
183 |
+
}
|
184 |
+
|
185 |
+
public function testRaw()
|
186 |
+
{
|
187 |
+
$pimple = new Container();
|
188 |
+
$pimple['service'] = $definition = $pimple->factory(function () {
|
189 |
+
return 'foo';
|
190 |
+
});
|
191 |
+
$this->assertSame($definition, $pimple->raw('service'));
|
192 |
+
}
|
193 |
+
|
194 |
+
public function testRawHonorsNullValues()
|
195 |
+
{
|
196 |
+
$pimple = new Container();
|
197 |
+
$pimple['foo'] = null;
|
198 |
+
$this->assertNull($pimple->raw('foo'));
|
199 |
+
}
|
200 |
+
|
201 |
+
public function testFluentRegister()
|
202 |
+
{
|
203 |
+
$pimple = new Container();
|
204 |
+
$this->assertSame($pimple, $pimple->register($this->getMockBuilder('Pimple\ServiceProviderInterface')->getMock()));
|
205 |
+
}
|
206 |
+
|
207 |
+
public function testRawValidatesKeyIsPresent()
|
208 |
+
{
|
209 |
+
$this->expectException(\Pimple\Exception\UnknownIdentifierException::class);
|
210 |
+
$this->expectExceptionMessage('Identifier "foo" is not defined.');
|
211 |
+
|
212 |
+
$pimple = new Container();
|
213 |
+
$pimple->raw('foo');
|
214 |
+
}
|
215 |
+
|
216 |
+
/**
|
217 |
+
* @group legacy
|
218 |
+
*/
|
219 |
+
public function testLegacyRawValidatesKeyIsPresent()
|
220 |
+
{
|
221 |
+
$this->expectException(\InvalidArgumentException::class);
|
222 |
+
$this->expectExceptionMessage('Identifier "foo" is not defined.');
|
223 |
+
|
224 |
+
$pimple = new Container();
|
225 |
+
$pimple->raw('foo');
|
226 |
+
}
|
227 |
+
|
228 |
+
/**
|
229 |
+
* @dataProvider serviceDefinitionProvider
|
230 |
+
*/
|
231 |
+
public function testExtend($service)
|
232 |
+
{
|
233 |
+
$pimple = new Container();
|
234 |
+
$pimple['shared_service'] = function () {
|
235 |
+
return new Fixtures\Service();
|
236 |
+
};
|
237 |
+
$pimple['factory_service'] = $pimple->factory(function () {
|
238 |
+
return new Fixtures\Service();
|
239 |
+
});
|
240 |
+
|
241 |
+
$pimple->extend('shared_service', $service);
|
242 |
+
$serviceOne = $pimple['shared_service'];
|
243 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
|
244 |
+
$serviceTwo = $pimple['shared_service'];
|
245 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
|
246 |
+
$this->assertSame($serviceOne, $serviceTwo);
|
247 |
+
$this->assertSame($serviceOne->value, $serviceTwo->value);
|
248 |
+
|
249 |
+
$pimple->extend('factory_service', $service);
|
250 |
+
$serviceOne = $pimple['factory_service'];
|
251 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
|
252 |
+
$serviceTwo = $pimple['factory_service'];
|
253 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
|
254 |
+
$this->assertNotSame($serviceOne, $serviceTwo);
|
255 |
+
$this->assertNotSame($serviceOne->value, $serviceTwo->value);
|
256 |
+
}
|
257 |
+
|
258 |
+
public function testExtendDoesNotLeakWithFactories()
|
259 |
+
{
|
260 |
+
if (\extension_loaded('pimple')) {
|
261 |
+
$this->markTestSkipped('Pimple extension does not support this test');
|
262 |
+
}
|
263 |
+
$pimple = new Container();
|
264 |
+
|
265 |
+
$pimple['foo'] = $pimple->factory(function () {
|
266 |
+
return;
|
267 |
+
});
|
268 |
+
$pimple['foo'] = $pimple->extend('foo', function ($foo, $pimple) {
|
269 |
+
return;
|
270 |
+
});
|
271 |
+
unset($pimple['foo']);
|
272 |
+
|
273 |
+
$p = new \ReflectionProperty($pimple, 'values');
|
274 |
+
$p->setAccessible(true);
|
275 |
+
$this->assertEmpty($p->getValue($pimple));
|
276 |
+
|
277 |
+
$p = new \ReflectionProperty($pimple, 'factories');
|
278 |
+
$p->setAccessible(true);
|
279 |
+
$this->assertCount(0, $p->getValue($pimple));
|
280 |
+
}
|
281 |
+
|
282 |
+
public function testExtendValidatesKeyIsPresent()
|
283 |
+
{
|
284 |
+
$this->expectException(\Pimple\Exception\UnknownIdentifierException::class);
|
285 |
+
$this->expectExceptionMessage('Identifier "foo" is not defined.');
|
286 |
+
|
287 |
+
$pimple = new Container();
|
288 |
+
$pimple->extend('foo', function () {
|
289 |
+
});
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* @group legacy
|
294 |
+
*/
|
295 |
+
public function testLegacyExtendValidatesKeyIsPresent()
|
296 |
+
{
|
297 |
+
$this->expectException(\InvalidArgumentException::class);
|
298 |
+
$this->expectExceptionMessage('Identifier "foo" is not defined.');
|
299 |
+
|
300 |
+
$pimple = new Container();
|
301 |
+
$pimple->extend('foo', function () {
|
302 |
+
});
|
303 |
+
}
|
304 |
+
|
305 |
+
public function testKeys()
|
306 |
+
{
|
307 |
+
$pimple = new Container();
|
308 |
+
$pimple['foo'] = 123;
|
309 |
+
$pimple['bar'] = 123;
|
310 |
+
|
311 |
+
$this->assertEquals(['foo', 'bar'], $pimple->keys());
|
312 |
+
}
|
313 |
+
|
314 |
+
/** @test */
|
315 |
+
public function settingAnInvokableObjectShouldTreatItAsFactory()
|
316 |
+
{
|
317 |
+
$pimple = new Container();
|
318 |
+
$pimple['invokable'] = new Fixtures\Invokable();
|
319 |
+
|
320 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['invokable']);
|
321 |
+
}
|
322 |
+
|
323 |
+
/** @test */
|
324 |
+
public function settingNonInvokableObjectShouldTreatItAsParameter()
|
325 |
+
{
|
326 |
+
$pimple = new Container();
|
327 |
+
$pimple['non_invokable'] = new Fixtures\NonInvokable();
|
328 |
+
|
329 |
+
$this->assertInstanceOf('Pimple\Tests\Fixtures\NonInvokable', $pimple['non_invokable']);
|
330 |
+
}
|
331 |
+
|
332 |
+
/**
|
333 |
+
* @dataProvider badServiceDefinitionProvider
|
334 |
+
*/
|
335 |
+
public function testFactoryFailsForInvalidServiceDefinitions($service)
|
336 |
+
{
|
337 |
+
$this->expectException(\Pimple\Exception\ExpectedInvokableException::class);
|
338 |
+
$this->expectExceptionMessage('Service definition is not a Closure or invokable object.');
|
339 |
+
|
340 |
+
$pimple = new Container();
|
341 |
+
$pimple->factory($service);
|
342 |
+
}
|
343 |
+
|
344 |
+
/**
|
345 |
+
* @group legacy
|
346 |
+
* @dataProvider badServiceDefinitionProvider
|
347 |
+
*/
|
348 |
+
public function testLegacyFactoryFailsForInvalidServiceDefinitions($service)
|
349 |
+
{
|
350 |
+
$this->expectException(\InvalidArgumentException::class);
|
351 |
+
$this->expectExceptionMessage('Service definition is not a Closure or invokable object.');
|
352 |
+
|
353 |
+
$pimple = new Container();
|
354 |
+
$pimple->factory($service);
|
355 |
+
}
|
356 |
+
|
357 |
+
/**
|
358 |
+
* @dataProvider badServiceDefinitionProvider
|
359 |
+
*/
|
360 |
+
public function testProtectFailsForInvalidServiceDefinitions($service)
|
361 |
+
{
|
362 |
+
$this->expectException(\Pimple\Exception\ExpectedInvokableException::class);
|
363 |
+
$this->expectExceptionMessage('Callable is not a Closure or invokable object.');
|
364 |
+
|
365 |
+
$pimple = new Container();
|
366 |
+
$pimple->protect($service);
|
367 |
+
}
|
368 |
+
|
369 |
+
/**
|
370 |
+
* @group legacy
|
371 |
+
* @dataProvider badServiceDefinitionProvider
|
372 |
+
*/
|
373 |
+
public function testLegacyProtectFailsForInvalidServiceDefinitions($service)
|
374 |
+
{
|
375 |
+
$this->expectException(\InvalidArgumentException::class);
|
376 |
+
$this->expectExceptionMessage('Callable is not a Closure or invokable object.');
|
377 |
+
|
378 |
+
$pimple = new Container();
|
379 |
+
$pimple->protect($service);
|
380 |
+
}
|
381 |
+
|
382 |
+
/**
|
383 |
+
* @dataProvider badServiceDefinitionProvider
|
384 |
+
*/
|
385 |
+
public function testExtendFailsForKeysNotContainingServiceDefinitions($service)
|
386 |
+
{
|
387 |
+
$this->expectException(\Pimple\Exception\InvalidServiceIdentifierException::class);
|
388 |
+
$this->expectExceptionMessage('Identifier "foo" does not contain an object definition.');
|
389 |
+
|
390 |
+
$pimple = new Container();
|
391 |
+
$pimple['foo'] = $service;
|
392 |
+
$pimple->extend('foo', function () {
|
393 |
+
});
|
394 |
+
}
|
395 |
+
|
396 |
+
/**
|
397 |
+
* @group legacy
|
398 |
+
* @dataProvider badServiceDefinitionProvider
|
399 |
+
*/
|
400 |
+
public function testLegacyExtendFailsForKeysNotContainingServiceDefinitions($service)
|
401 |
+
{
|
402 |
+
$this->expectException(\InvalidArgumentException::class);
|
403 |
+
$this->expectExceptionMessage('Identifier "foo" does not contain an object definition.');
|
404 |
+
|
405 |
+
$pimple = new Container();
|
406 |
+
$pimple['foo'] = $service;
|
407 |
+
$pimple->extend('foo', function () {
|
408 |
+
});
|
409 |
+
}
|
410 |
+
|
411 |
+
/**
|
412 |
+
* @group legacy
|
413 |
+
* @expectedDeprecation How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "foo" should be protected?
|
414 |
+
*/
|
415 |
+
public function testExtendingProtectedClosureDeprecation()
|
416 |
+
{
|
417 |
+
$pimple = new Container();
|
418 |
+
$pimple['foo'] = $pimple->protect(function () {
|
419 |
+
return 'bar';
|
420 |
+
});
|
421 |
+
|
422 |
+
$pimple->extend('foo', function ($value) {
|
423 |
+
return $value.'-baz';
|
424 |
+
});
|
425 |
+
|
426 |
+
$this->assertSame('bar-baz', $pimple['foo']);
|
427 |
+
}
|
428 |
+
|
429 |
+
/**
|
430 |
+
* @dataProvider badServiceDefinitionProvider
|
431 |
+
*/
|
432 |
+
public function testExtendFailsForInvalidServiceDefinitions($service)
|
433 |
+
{
|
434 |
+
$this->expectException(\Pimple\Exception\ExpectedInvokableException::class);
|
435 |
+
$this->expectExceptionMessage('Extension service definition is not a Closure or invokable object.');
|
436 |
+
|
437 |
+
$pimple = new Container();
|
438 |
+
$pimple['foo'] = function () {
|
439 |
+
};
|
440 |
+
$pimple->extend('foo', $service);
|
441 |
+
}
|
442 |
+
|
443 |
+
/**
|
444 |
+
* @group legacy
|
445 |
+
* @dataProvider badServiceDefinitionProvider
|
446 |
+
*/
|
447 |
+
public function testLegacyExtendFailsForInvalidServiceDefinitions($service)
|
448 |
+
{
|
449 |
+
$this->expectException(\InvalidArgumentException::class);
|
450 |
+
$this->expectExceptionMessage('Extension service definition is not a Closure or invokable object.');
|
451 |
+
|
452 |
+
$pimple = new Container();
|
453 |
+
$pimple['foo'] = function () {
|
454 |
+
};
|
455 |
+
$pimple->extend('foo', $service);
|
456 |
+
}
|
457 |
+
|
458 |
+
public function testExtendFailsIfFrozenServiceIsNonInvokable()
|
459 |
+
{
|
460 |
+
$this->expectException(\Pimple\Exception\FrozenServiceException::class);
|
461 |
+
$this->expectExceptionMessage('Cannot override frozen service "foo".');
|
462 |
+
|
463 |
+
$pimple = new Container();
|
464 |
+
$pimple['foo'] = function () {
|
465 |
+
return new Fixtures\NonInvokable();
|
466 |
+
};
|
467 |
+
$foo = $pimple['foo'];
|
468 |
+
|
469 |
+
$pimple->extend('foo', function () {
|
470 |
+
});
|
471 |
+
}
|
472 |
+
|
473 |
+
public function testExtendFailsIfFrozenServiceIsInvokable()
|
474 |
+
{
|
475 |
+
$this->expectException(\Pimple\Exception\FrozenServiceException::class);
|
476 |
+
$this->expectExceptionMessage('Cannot override frozen service "foo".');
|
477 |
+
|
478 |
+
$pimple = new Container();
|
479 |
+
$pimple['foo'] = function () {
|
480 |
+
return new Fixtures\Invokable();
|
481 |
+
};
|
482 |
+
$foo = $pimple['foo'];
|
483 |
+
|
484 |
+
$pimple->extend('foo', function () {
|
485 |
+
});
|
486 |
+
}
|
487 |
+
|
488 |
+
/**
|
489 |
+
* Provider for invalid service definitions.
|
490 |
+
*/
|
491 |
+
public function badServiceDefinitionProvider()
|
492 |
+
{
|
493 |
+
return [
|
494 |
+
[123],
|
495 |
+
[new Fixtures\NonInvokable()],
|
496 |
+
];
|
497 |
+
}
|
498 |
+
|
499 |
+
/**
|
500 |
+
* Provider for service definitions.
|
501 |
+
*/
|
502 |
+
public function serviceDefinitionProvider()
|
503 |
+
{
|
504 |
+
return [
|
505 |
+
[function ($value) {
|
506 |
+
$service = new Fixtures\Service();
|
507 |
+
$service->value = $value;
|
508 |
+
|
509 |
+
return $service;
|
510 |
+
}],
|
511 |
+
[new Fixtures\Invokable()],
|
512 |
+
];
|
513 |
+
}
|
514 |
+
|
515 |
+
public function testDefiningNewServiceAfterFreeze()
|
516 |
+
{
|
517 |
+
$pimple = new Container();
|
518 |
+
$pimple['foo'] = function () {
|
519 |
+
return 'foo';
|
520 |
+
};
|
521 |
+
$foo = $pimple['foo'];
|
522 |
+
|
523 |
+
$pimple['bar'] = function () {
|
524 |
+
return 'bar';
|
525 |
+
};
|
526 |
+
$this->assertSame('bar', $pimple['bar']);
|
527 |
+
}
|
528 |
+
|
529 |
+
public function testOverridingServiceAfterFreeze()
|
530 |
+
{
|
531 |
+
$this->expectException(\Pimple\Exception\FrozenServiceException::class);
|
532 |
+
$this->expectExceptionMessage('Cannot override frozen service "foo".');
|
533 |
+
|
534 |
+
$pimple = new Container();
|
535 |
+
$pimple['foo'] = function () {
|
536 |
+
return 'foo';
|
537 |
+
};
|
538 |
+
$foo = $pimple['foo'];
|
539 |
+
|
540 |
+
$pimple['foo'] = function () {
|
541 |
+
return 'bar';
|
542 |
+
};
|
543 |
+
}
|
544 |
+
|
545 |
+
/**
|
546 |
+
* @group legacy
|
547 |
+
*/
|
548 |
+
public function testLegacyOverridingServiceAfterFreeze()
|
549 |
+
{
|
550 |
+
$this->expectException(\RuntimeException::class);
|
551 |
+
$this->expectExceptionMessage('Cannot override frozen service "foo".');
|
552 |
+
|
553 |
+
$pimple = new Container();
|
554 |
+
$pimple['foo'] = function () {
|
555 |
+
return 'foo';
|
556 |
+
};
|
557 |
+
$foo = $pimple['foo'];
|
558 |
+
|
559 |
+
$pimple['foo'] = function () {
|
560 |
+
return 'bar';
|
561 |
+
};
|
562 |
+
}
|
563 |
+
|
564 |
+
public function testRemovingServiceAfterFreeze()
|
565 |
+
{
|
566 |
+
$pimple = new Container();
|
567 |
+
$pimple['foo'] = function () {
|
568 |
+
return 'foo';
|
569 |
+
};
|
570 |
+
$foo = $pimple['foo'];
|
571 |
+
|
572 |
+
unset($pimple['foo']);
|
573 |
+
$pimple['foo'] = function () {
|
574 |
+
return 'bar';
|
575 |
+
};
|
576 |
+
$this->assertSame('bar', $pimple['foo']);
|
577 |
+
}
|
578 |
+
|
579 |
+
public function testExtendingService()
|
580 |
+
{
|
581 |
+
$pimple = new Container();
|
582 |
+
$pimple['foo'] = function () {
|
583 |
+
return 'foo';
|
584 |
+
};
|
585 |
+
$pimple['foo'] = $pimple->extend('foo', function ($foo, $app) {
|
586 |
+
return "$foo.bar";
|
587 |
+
});
|
588 |
+
$pimple['foo'] = $pimple->extend('foo', function ($foo, $app) {
|
589 |
+
return "$foo.baz";
|
590 |
+
});
|
591 |
+
$this->assertSame('foo.bar.baz', $pimple['foo']);
|
592 |
+
}
|
593 |
+
|
594 |
+
public function testExtendingServiceAfterOtherServiceFreeze()
|
595 |
+
{
|
596 |
+
$pimple = new Container();
|
597 |
+
$pimple['foo'] = function () {
|
598 |
+
return 'foo';
|
599 |
+
};
|
600 |
+
$pimple['bar'] = function () {
|
601 |
+
return 'bar';
|
602 |
+
};
|
603 |
+
$foo = $pimple['foo'];
|
604 |
+
|
605 |
+
$pimple['bar'] = $pimple->extend('bar', function ($bar, $app) {
|
606 |
+
return "$bar.baz";
|
607 |
+
});
|
608 |
+
$this->assertSame('bar.baz', $pimple['bar']);
|
609 |
+
}
|
610 |
+
}
|
vendor/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009-2017 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Tests\Psr11;
|
28 |
+
|
29 |
+
use PHPUnit\Framework\TestCase;
|
30 |
+
use Pimple\Container;
|
31 |
+
use Pimple\Psr11\Container as PsrContainer;
|
32 |
+
use Pimple\Tests\Fixtures\Service;
|
33 |
+
|
34 |
+
class ContainerTest extends TestCase
|
35 |
+
{
|
36 |
+
public function testGetReturnsExistingService()
|
37 |
+
{
|
38 |
+
$pimple = new Container();
|
39 |
+
$pimple['service'] = function () {
|
40 |
+
return new Service();
|
41 |
+
};
|
42 |
+
$psr = new PsrContainer($pimple);
|
43 |
+
|
44 |
+
$this->assertSame($pimple['service'], $psr->get('service'));
|
45 |
+
}
|
46 |
+
|
47 |
+
public function testGetThrowsExceptionIfServiceIsNotFound()
|
48 |
+
{
|
49 |
+
$this->expectException(\Psr\Container\NotFoundExceptionInterface::class);
|
50 |
+
$this->expectExceptionMessage('Identifier "service" is not defined.');
|
51 |
+
|
52 |
+
$pimple = new Container();
|
53 |
+
$psr = new PsrContainer($pimple);
|
54 |
+
|
55 |
+
$psr->get('service');
|
56 |
+
}
|
57 |
+
|
58 |
+
public function testHasReturnsTrueIfServiceExists()
|
59 |
+
{
|
60 |
+
$pimple = new Container();
|
61 |
+
$pimple['service'] = function () {
|
62 |
+
return new Service();
|
63 |
+
};
|
64 |
+
$psr = new PsrContainer($pimple);
|
65 |
+
|
66 |
+
$this->assertTrue($psr->has('service'));
|
67 |
+
}
|
68 |
+
|
69 |
+
public function testHasReturnsFalseIfServiceDoesNotExist()
|
70 |
+
{
|
71 |
+
$pimple = new Container();
|
72 |
+
$psr = new PsrContainer($pimple);
|
73 |
+
|
74 |
+
$this->assertFalse($psr->has('service'));
|
75 |
+
}
|
76 |
+
}
|
vendor/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php
ADDED
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Tests\Psr11;
|
28 |
+
|
29 |
+
use PHPUnit\Framework\TestCase;
|
30 |
+
use Pimple\Container;
|
31 |
+
use Pimple\Psr11\ServiceLocator;
|
32 |
+
use Pimple\Tests\Fixtures;
|
33 |
+
|
34 |
+
/**
|
35 |
+
* ServiceLocator test case.
|
36 |
+
*
|
37 |
+
* @author Pascal Luna <skalpa@zetareticuli.org>
|
38 |
+
*/
|
39 |
+
class ServiceLocatorTest extends TestCase
|
40 |
+
{
|
41 |
+
public function testCanAccessServices()
|
42 |
+
{
|
43 |
+
$pimple = new Container();
|
44 |
+
$pimple['service'] = function () {
|
45 |
+
return new Fixtures\Service();
|
46 |
+
};
|
47 |
+
$locator = new ServiceLocator($pimple, ['service']);
|
48 |
+
|
49 |
+
$this->assertSame($pimple['service'], $locator->get('service'));
|
50 |
+
}
|
51 |
+
|
52 |
+
public function testCanAccessAliasedServices()
|
53 |
+
{
|
54 |
+
$pimple = new Container();
|
55 |
+
$pimple['service'] = function () {
|
56 |
+
return new Fixtures\Service();
|
57 |
+
};
|
58 |
+
$locator = new ServiceLocator($pimple, ['alias' => 'service']);
|
59 |
+
|
60 |
+
$this->assertSame($pimple['service'], $locator->get('alias'));
|
61 |
+
}
|
62 |
+
|
63 |
+
public function testCannotAccessAliasedServiceUsingRealIdentifier()
|
64 |
+
{
|
65 |
+
$this->expectException(\Pimple\Exception\UnknownIdentifierException::class);
|
66 |
+
$this->expectExceptionMessage('Identifier "service" is not defined.');
|
67 |
+
|
68 |
+
$pimple = new Container();
|
69 |
+
$pimple['service'] = function () {
|
70 |
+
return new Fixtures\Service();
|
71 |
+
};
|
72 |
+
$locator = new ServiceLocator($pimple, ['alias' => 'service']);
|
73 |
+
|
74 |
+
$service = $locator->get('service');
|
75 |
+
}
|
76 |
+
|
77 |
+
public function testGetValidatesServiceCanBeLocated()
|
78 |
+
{
|
79 |
+
$this->expectException(\Pimple\Exception\UnknownIdentifierException::class);
|
80 |
+
$this->expectExceptionMessage('Identifier "foo" is not defined.');
|
81 |
+
|
82 |
+
$pimple = new Container();
|
83 |
+
$pimple['service'] = function () {
|
84 |
+
return new Fixtures\Service();
|
85 |
+
};
|
86 |
+
$locator = new ServiceLocator($pimple, ['alias' => 'service']);
|
87 |
+
|
88 |
+
$service = $locator->get('foo');
|
89 |
+
}
|
90 |
+
|
91 |
+
public function testGetValidatesTargetServiceExists()
|
92 |
+
{
|
93 |
+
$this->expectException(\Pimple\Exception\UnknownIdentifierException::class);
|
94 |
+
$this->expectExceptionMessage('Identifier "invalid" is not defined.');
|
95 |
+
|
96 |
+
$pimple = new Container();
|
97 |
+
$pimple['service'] = function () {
|
98 |
+
return new Fixtures\Service();
|
99 |
+
};
|
100 |
+
$locator = new ServiceLocator($pimple, ['alias' => 'invalid']);
|
101 |
+
|
102 |
+
$service = $locator->get('alias');
|
103 |
+
}
|
104 |
+
|
105 |
+
public function testHasValidatesServiceCanBeLocated()
|
106 |
+
{
|
107 |
+
$pimple = new Container();
|
108 |
+
$pimple['service1'] = function () {
|
109 |
+
return new Fixtures\Service();
|
110 |
+
};
|
111 |
+
$pimple['service2'] = function () {
|
112 |
+
return new Fixtures\Service();
|
113 |
+
};
|
114 |
+
$locator = new ServiceLocator($pimple, ['service1']);
|
115 |
+
|
116 |
+
$this->assertTrue($locator->has('service1'));
|
117 |
+
$this->assertFalse($locator->has('service2'));
|
118 |
+
}
|
119 |
+
|
120 |
+
public function testHasChecksIfTargetServiceExists()
|
121 |
+
{
|
122 |
+
$pimple = new Container();
|
123 |
+
$pimple['service'] = function () {
|
124 |
+
return new Fixtures\Service();
|
125 |
+
};
|
126 |
+
$locator = new ServiceLocator($pimple, ['foo' => 'service', 'bar' => 'invalid']);
|
127 |
+
|
128 |
+
$this->assertTrue($locator->has('foo'));
|
129 |
+
$this->assertFalse($locator->has('bar'));
|
130 |
+
}
|
131 |
+
}
|
vendor/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Pimple.
|
5 |
+
*
|
6 |
+
* Copyright (c) 2009 Fabien Potencier
|
7 |
+
*
|
8 |
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 |
+
* of this software and associated documentation files (the "Software"), to deal
|
10 |
+
* in the Software without restriction, including without limitation the rights
|
11 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 |
+
* copies of the Software, and to permit persons to whom the Software is furnished
|
13 |
+
* to do so, subject to the following conditions:
|
14 |
+
*
|
15 |
+
* The above copyright notice and this permission notice shall be included in all
|
16 |
+
* copies or substantial portions of the Software.
|
17 |
+
*
|
18 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 |
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24 |
+
* THE SOFTWARE.
|
25 |
+
*/
|
26 |
+
|
27 |
+
namespace Pimple\Tests;
|
28 |
+
|
29 |
+
use PHPUnit\Framework\TestCase;
|
30 |
+
use Pimple\Container;
|
31 |
+
use Pimple\ServiceIterator;
|
32 |
+
use Pimple\Tests\Fixtures\Service;
|
33 |
+
|
34 |
+
class ServiceIteratorTest extends TestCase
|
35 |
+
{
|
36 |
+
public function testIsIterable()
|
37 |
+
{
|
38 |
+
$pimple = new Container();
|
39 |
+
$pimple['service1'] = function () {
|
40 |
+
return new Service();
|
41 |
+
};
|
42 |
+
$pimple['service2'] = function () {
|
43 |
+
return new Service();
|
44 |
+
};
|
45 |
+
$pimple['service3'] = function () {
|
46 |
+
return new Service();
|
47 |
+
};
|
48 |
+
$iterator = new ServiceIterator($pimple, ['service1', 'service2']);
|
49 |
+
|
50 |
+
$this->assertSame(['service1' => $pimple['service1'], 'service2' => $pimple['service2']], iterator_to_array($iterator));
|
51 |
+
}
|
52 |
+
}
|
vendor/psr/container/.gitignore
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
composer.lock
|
2 |
+
composer.phar
|
3 |
+
/vendor/
|
vendor/psr/container/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
The MIT License (MIT)
|
2 |
+
|
3 |
+
Copyright (c) 2013-2016 container-interop
|
4 |
+
Copyright (c) 2016 PHP Framework Interoperability Group
|
5 |
+
|
6 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
7 |
+
this software and associated documentation files (the "Software"), to deal in
|
8 |
+
the Software without restriction, including without limitation the rights to
|
9 |
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
10 |
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
11 |
+
subject to the following conditions:
|
12 |
+
|
13 |
+
The above copyright notice and this permission notice shall be included in all
|
14 |
+
copies or substantial portions of the Software.
|
15 |
+
|
16 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
18 |
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
19 |
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
20 |
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
21 |
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
vendor/psr/container/README.md
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# PSR Container
|
2 |
+
|
3 |
+
This repository holds all interfaces/classes/traits related to [PSR-11](https://github.com/container-interop/fig-standards/blob/master/proposed/container.md).
|
4 |
+
|
5 |
+
Note that this is not a container implementation of its own. See the specification for more details.
|
vendor/psr/container/composer.json
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "psr/container",
|
3 |
+
"type": "library",
|
4 |
+
"description": "Common Container Interface (PHP FIG PSR-11)",
|
5 |
+
"keywords": ["psr", "psr-11", "container", "container-interop", "container-interface"],
|
6 |
+
"homepage": "https://github.com/php-fig/container",
|
7 |
+
"license": "MIT",
|
8 |
+
"authors": [
|
9 |
+
{
|
10 |
+
"name": "PHP-FIG",
|
11 |
+
"homepage": "http://www.php-fig.org/"
|
12 |
+
}
|
13 |
+
],
|
14 |
+
"require": {
|
15 |
+
"php": ">=5.3.0"
|
16 |
+
},
|
17 |
+
"autoload": {
|
18 |
+
"psr-4": {
|
19 |
+
"Psr\\Container\\": "src/"
|
20 |
+
}
|
21 |
+
},
|
22 |
+
"extra": {
|
23 |
+
"branch-alias": {
|
24 |
+
"dev-master": "1.0.x-dev"
|
25 |
+
}
|
26 |
+
}
|
27 |
+
}
|
vendor/psr/container/src/ContainerExceptionInterface.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
|
4 |
+
*/
|
5 |
+
|
6 |
+
namespace Psr\Container;
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Base interface representing a generic exception in a container.
|
10 |
+
*/
|
11 |
+
interface ContainerExceptionInterface
|
12 |
+
{
|
13 |
+
}
|
vendor/psr/container/src/ContainerInterface.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
|
4 |
+
*/
|
5 |
+
|
6 |
+
namespace Psr\Container;
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Describes the interface of a container that exposes methods to read its entries.
|
10 |
+
*/
|
11 |
+
interface ContainerInterface
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* Finds an entry of the container by its identifier and returns it.
|
15 |
+
*
|
16 |
+
* @param string $id Identifier of the entry to look for.
|
17 |
+
*
|
18 |
+
* @throws NotFoundExceptionInterface No entry was found for **this** identifier.
|
19 |
+
* @throws ContainerExceptionInterface Error while retrieving the entry.
|
20 |
+
*
|
21 |
+
* @return mixed Entry.
|
22 |
+
*/
|
23 |
+
public function get($id);
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Returns true if the container can return an entry for the given identifier.
|
27 |
+
* Returns false otherwise.
|
28 |
+
*
|
29 |
+
* `has($id)` returning true does not mean that `get($id)` will not throw an exception.
|
30 |
+
* It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`.
|
31 |
+
*
|
32 |
+
* @param string $id Identifier of the entry to look for.
|
33 |
+
*
|
34 |
+
* @return bool
|
35 |
+
*/
|
36 |
+
public function has($id);
|
37 |
+
}
|
vendor/psr/container/src/NotFoundExceptionInterface.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
|
4 |
+
*/
|
5 |
+
|
6 |
+
namespace Psr\Container;
|
7 |
+
|
8 |
+
/**
|
9 |
+
* No entry was found in the container.
|
10 |
+
*/
|
11 |
+
interface NotFoundExceptionInterface extends ContainerExceptionInterface
|
12 |
+
{
|
13 |
+
}
|
vendor/publishpress/wordpress-version-notices/.env.testing.dist
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
WP_ROOT_FOLDER="/var/www/html"
|
2 |
+
TEST_SITE_WP_ADMIN_PATH="/wp-admin"
|
3 |
+
TEST_SITE_DB_NAME="wordpress"
|
4 |
+
TEST_SITE_DB_HOST="127.0.0.1:32881"
|
5 |
+
TEST_SITE_DB_USER="root"
|
6 |
+
TEST_SITE_DB_PASSWORD="root"
|
7 |
+
TEST_SITE_TABLE_PREFIX="wp_"
|
8 |
+
TEST_DB_NAME="wordpress"
|
9 |
+
TEST_DB_HOST="127.0.0.1:32881"
|
10 |
+
TEST_DB_USER="root"
|
11 |
+
TEST_DB_PASSWORD="root"
|
12 |
+
TEST_TABLE_PREFIX="wp_"
|
13 |
+
TEST_SITE_WP_URL="http://localhost:32880"
|
14 |
+
TEST_SITE_WP_DOMAIN="localhost:32880"
|
15 |
+
TEST_SITE_ADMIN_EMAIL="dev@example.com"
|
16 |
+
TEST_SITE_ADMIN_USERNAME="admin"
|
17 |
+
TEST_SITE_ADMIN_PASSWORD="admin"
|
vendor/publishpress/wordpress-version-notices/.gitignore
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# OS generated files #
|
2 |
+
######################
|
3 |
+
.DS_Store
|
4 |
+
.DS_Store?
|
5 |
+
._*
|
6 |
+
.Spotlight-V100
|
7 |
+
.Trashes
|
8 |
+
ehthumbs.db
|
9 |
+
Thumbs.db
|
10 |
+
.idea
|
11 |
+
|
12 |
+
*.sublime-project
|
13 |
+
*.sublime-workspace
|
14 |
+
|
15 |
+
# Ignores the "dev" composer file
|
16 |
+
/src/vendor
|
17 |
+
/packages
|
18 |
+
|
19 |
+
.svn
|
20 |
+
.git
|
21 |
+
wpcom-helper.php
|
22 |
+
|
23 |
+
/local.sh
|
24 |
+
node_modules
|
25 |
+
|
26 |
+
/.properties.ini
|
27 |
+
|
28 |
+
/vendor
|
29 |
+
.idea
|
30 |
+
/dist
|
31 |
+
.env.testing
|
vendor/publishpress/wordpress-version-notices/README.md
ADDED
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# WordPress Version Notices
|
2 |
+
|
3 |
+
|
4 |
+
## Description
|
5 |
+
|
6 |
+
Library for displaying ads for Pro plugins in WordPress.
|
7 |
+
|
8 |
+
## Installation
|
9 |
+
|
10 |
+
```shell script
|
11 |
+
$ composer update --no-dev
|
12 |
+
```
|
13 |
+
|
14 |
+
## Integrating into a plugin
|
15 |
+
|
16 |
+
Due to a conflict in the tests we didn't register the include file in the Composer's autoload for now. You can manually require it and add a filter for the settings.
|
17 |
+
|
18 |
+
```php
|
19 |
+
if (!defined('PP_VERSION_NOTICES_LOADED')) {
|
20 |
+
require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'publishpress' . DIRECTORY_SEPARATOR
|
21 |
+
. 'wordpress-version-notices' . DIRECTORY_SEPARATOR . 'includes.php';
|
22 |
+
}
|
23 |
+
|
24 |
+
add_filter(\PPVersionNotices\Module\TopNotice\Module::SETTINGS_FILTER, function ($settings) {
|
25 |
+
$settings['dumb-plugin-one'] = [
|
26 |
+
'message' => 'You\'re using Dumb Plugin One Free. Please, %supgrade to pro%s.',
|
27 |
+
'link' => 'http://example.com/upgrade',
|
28 |
+
'screens' => [
|
29 |
+
[
|
30 |
+
'base' => 'edit',
|
31 |
+
'id' => 'edit-post',
|
32 |
+
'post_type' => 'post',
|
33 |
+
],
|
34 |
+
]
|
35 |
+
];
|
36 |
+
|
37 |
+
return $settings;
|
38 |
+
});
|
39 |
+
```
|
40 |
+
|
41 |
+
### Params
|
42 |
+
|
43 |
+
* message: Type the respective message for the banner, adding the button text between '%s'. This string will be used as format for `sprint` .
|
44 |
+
* link: The full link for the button
|
45 |
+
* screen: An array of screen parameters used to decide what page should display the banner. Each item of the array can be a boolean or an array with a key-value array specifying the required params from the screen (WP_Screen) object. You can bypass the library's filter algorithm adding a `true` item to it. This allows you to create your own function to check the screen returning a boolean value.
|
46 |
+
|
47 |
+
## Testing
|
48 |
+
|
49 |
+
Create a new WordPress installation dedicated for testing.
|
50 |
+
|
51 |
+
Make sure to copy the file `.env.testing.dist` as `.env.testing` and update the variables according to your environment.
|
52 |
+
|
53 |
+
Install the dependencies using composer:
|
54 |
+
|
55 |
+
```shell script
|
56 |
+
$ composer install
|
57 |
+
```
|
58 |
+
|
59 |
+
or
|
60 |
+
|
61 |
+
```shell script
|
62 |
+
$ composer update
|
63 |
+
```
|
64 |
+
|
65 |
+
Run the script:
|
66 |
+
|
67 |
+
```shell script
|
68 |
+
$ bin/test.sh
|
69 |
+
```
|
70 |
+
|
71 |
+
The scripts were implemented for *nix systems. Not adapted for Windows yet.
|
72 |
+
|
73 |
+
## License
|
74 |
+
|
75 |
+
License: [GPLv3 or later](http://www.gnu.org/licenses/gpl-3.0.html)
|
vendor/publishpress/wordpress-version-notices/assets/css/top-notice-bold-purple.css
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.pp-version-notice-bold-purple {
|
2 |
+
background: #655897;
|
3 |
+
height: auto;
|
4 |
+
box-sizing: border-box;
|
5 |
+
padding: 18px 7px 20px 7px;
|
6 |
+
text-align: center;
|
7 |
+
position: relative;
|
8 |
+
overflow: hidden;
|
9 |
+
line-height: 20px;
|
10 |
+
margin-left: -20px;
|
11 |
+
font-size: 16px;
|
12 |
+
color: #fff;
|
13 |
+
}
|
14 |
+
|
15 |
+
.pp-version-notice-bold-purple .pp-version-notice-bold-purple-button a {
|
16 |
+
background: #FCB223;
|
17 |
+
color: #000 !important;
|
18 |
+
font-weight: normal;
|
19 |
+
text-decoration: none;
|
20 |
+
padding: 9px 12px;
|
21 |
+
-webkit-border-radius: 4px;
|
22 |
+
-moz-border-radius: 4px;
|
23 |
+
border-radius: 4px;
|
24 |
+
box-sizing: border-box;
|
25 |
+
border: 1px solid #fca871;
|
26 |
+
break-inside: avoid;
|
27 |
+
white-space: nowrap;
|
28 |
+
}
|
29 |
+
|
30 |
+
.pp-version-notice-bold-purple .pp-version-notice-bold-purple-button a:hover {
|
31 |
+
background: #fcca46;
|
32 |
+
color: #000 !important;
|
33 |
+
}
|
34 |
+
|
35 |
+
@media only screen and (min-width: 1075px) {
|
36 |
+
.pp-version-notice-bold-purple-message,
|
37 |
+
.pp-version-notice-bold-purple-button {
|
38 |
+
display: inline-block;
|
39 |
+
}
|
40 |
+
|
41 |
+
.pp-version-notice-bold-purple-message {
|
42 |
+
margin-right: 25px;
|
43 |
+
}
|
44 |
+
}
|
45 |
+
|
46 |
+
@media only screen and (max-width: 1074px) {
|
47 |
+
.pp-version-notice-bold-purple-message,
|
48 |
+
.pp-version-notice-bold-purple-button {
|
49 |
+
display: block;
|
50 |
+
}
|
51 |
+
|
52 |
+
.pp-version-notice-bold-purple-button {
|
53 |
+
margin-top: 20px;
|
54 |
+
}
|
55 |
+
|
56 |
+
.pp-version-notice-bold-purple-button a {
|
57 |
+
max-width: 170px;
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
61 |
+
@media only screen and (max-width: 600px) {
|
62 |
+
.pp-version-notice-bold-purple {
|
63 |
+
padding-top: 60px;
|
64 |
+
}
|
65 |
+
}
|
vendor/publishpress/wordpress-version-notices/bin/acceptance.sh
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/sh
|
2 |
+
|
3 |
+
bin/update-code-for-tests.sh
|
4 |
+
|
5 |
+
echo 'Running the acceptance tests'
|
6 |
+
echo '-------------------------------------------'
|
7 |
+
vendor/bin/codecept run acceptance
|
vendor/publishpress/wordpress-version-notices/bin/test.sh
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/sh
|
2 |
+
|
3 |
+
bin/update-code-for-tests.sh
|
4 |
+
|
5 |
+
echo 'Running the tests'
|
6 |
+
echo '-------------------------------------------'
|
7 |
+
vendor/bin/codecept run
|
vendor/publishpress/wordpress-version-notices/bin/update-code-for-tests.sh
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/sh
|
2 |
+
|
3 |
+
# Copy the dumb plugin into the test site
|
4 |
+
echo 'Copying the dumb plugin one'
|
5 |
+
rsync -a tests/_data/dumb-plugin-one ~/Volumes/wordpress_tests/wp-content/plugins/
|
6 |
+
echo 'Copying the dumb plugin two'
|
7 |
+
rsync -a tests/_data/dumb-plugin-two ~/Volumes/wordpress_tests/wp-content/plugins/
|
8 |
+
|
9 |
+
# Copy the library into the dumb plugin
|
10 |
+
echo 'Copying the library into the dumb plugin one'
|
11 |
+
rsync -a ./ ~/Volumes/wordpress_tests/wp-content/plugins/dumb-plugin-one/vendor/publishpress/wordpress-version-notices/ --exclude .git
|
12 |
+
echo 'Copying the library into the dumb plugin two'
|
13 |
+
rsync -a ./ ~/Volumes/wordpress_tests/wp-content/plugins/dumb-plugin-two/vendor/publishpress/wordpress-version-notices/ --exclude .git
|
vendor/publishpress/wordpress-version-notices/bin/wpunit.sh
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/sh
|
2 |
+
|
3 |
+
bin/update-code-for-tests.sh
|
4 |
+
|
5 |
+
echo 'Running the wpunit tests'
|
6 |
+
echo '-------------------------------------------'
|
7 |
+
vendor/bin/codecept run wpunit
|
vendor/publishpress/wordpress-version-notices/codeception.dist.yml
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
paths:
|
2 |
+
tests: tests
|
3 |
+
output: tests/_output
|
4 |
+
data: tests/_data
|
5 |
+
support: tests/_support
|
6 |
+
envs: tests/_envs
|
7 |
+
actor_suffix: Tester
|
8 |
+
extensions:
|
9 |
+
enabled:
|
10 |
+
- Codeception\Extension\RunFailed
|
11 |
+
commands:
|
12 |
+
- Codeception\Command\GenerateWPUnit
|
13 |
+
- Codeception\Command\GenerateWPRestApi
|
14 |
+
- Codeception\Command\GenerateWPRestController
|
15 |
+
- Codeception\Command\GenerateWPRestPostTypeController
|
16 |
+
- Codeception\Command\GenerateWPAjax
|
17 |
+
- Codeception\Command\GenerateWPCanonical
|
18 |
+
- Codeception\Command\GenerateWPXMLRPC
|
19 |
+
params:
|
20 |
+
- .env.testing
|
vendor/publishpress/wordpress-version-notices/codeception.yml
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
paths:
|
2 |
+
tests: tests
|
3 |
+
output: tests/_output
|
4 |
+
data: tests/_data
|
5 |
+
support: tests/_support
|
6 |
+
envs: tests/_envs
|
7 |
+
actor_suffix: Tester
|
8 |
+
extensions:
|
9 |
+
enabled:
|
10 |
+
- Codeception\Extension\RunFailed
|
11 |
+
commands:
|
12 |
+
- Codeception\Command\GenerateWPUnit
|
13 |
+
- Codeception\Command\GenerateWPRestApi
|
14 |
+
- Codeception\Command\GenerateWPRestController
|
15 |
+
- Codeception\Command\GenerateWPRestPostTypeController
|
16 |
+
- Codeception\Command\GenerateWPAjax
|
17 |
+
- Codeception\Command\GenerateWPCanonical
|
18 |
+
- Codeception\Command\GenerateWPXMLRPC
|
19 |
+
params:
|
20 |
+
- .env.testing
|
vendor/publishpress/wordpress-version-notices/composer.json
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "publishpress/wordpress-version-notices",
|
3 |
+
"description": "Library for displaying version notices for Pro plugins in WordPress.",
|
4 |
+
"type": "library",
|
5 |
+
"license": "GPL-3.0-or-later",
|
6 |
+
"authors": [
|
7 |
+
{
|
8 |
+
"name": "PublishPress",
|
9 |
+
"email": "help@publishpress.com",
|
10 |
+
"homepage": "https://publishpress.com",
|
11 |
+
"role": "Developer"
|
12 |
+
}
|
13 |
+
],
|
14 |
+
"config": {
|
15 |
+
"preferred-install": "dist"
|
16 |
+
},
|
17 |
+
"autoload": {
|
18 |
+
"psr-4": {
|
19 |
+
"PPVersionNotices\\": "src/"
|
20 |
+
}
|
21 |
+
},
|
22 |
+
"minimum-stability": "stable",
|
23 |
+
"require": {
|
24 |
+
"php": ">=5.6.20",
|
25 |
+
"pimple/pimple": "^3"
|
26 |
+
},
|
27 |
+
"require-dev": {
|
28 |
+
"lucatume/wp-browser": "^2.2"
|
29 |
+
}
|
30 |
+
}
|
vendor/publishpress/wordpress-version-notices/composer.lock
ADDED
@@ -0,0 +1,7340 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_readme": [
|
3 |
+
"This file locks the dependencies of your project to a known state",
|
4 |
+
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
5 |
+
"This file is @generated automatically"
|
6 |
+
],
|
7 |
+
"content-hash": "5576835b87dff2a49ef7733bfee9ca92",
|
8 |
+
"packages": [
|
9 |
+
{
|
10 |
+
"name": "pimple/pimple",
|
11 |
+
"version": "v3.3.0",
|
12 |
+
"source": {
|
13 |
+
"type": "git",
|
14 |
+
"url": "https://github.com/silexphp/Pimple.git",
|
15 |
+
"reference": "e55d12f9d6a0e7f9c85992b73df1267f46279930"
|
16 |
+
},
|
17 |
+
"dist": {
|
18 |
+
"type": "zip",
|
19 |
+
"url": "https://api.github.com/repos/silexphp/Pimple/zipball/e55d12f9d6a0e7f9c85992b73df1267f46279930",
|
20 |
+
"reference": "e55d12f9d6a0e7f9c85992b73df1267f46279930",
|
21 |
+
"shasum": ""
|
22 |
+
},
|
23 |
+
"require": {
|
24 |
+
"php": "^7.2.5",
|
25 |
+
"psr/container": "^1.0"
|
26 |
+
},
|
27 |
+
"require-dev": {
|
28 |
+
"symfony/phpunit-bridge": "^3.4|^4.4|^5.0"
|
29 |
+
},
|
30 |
+
"type": "library",
|
31 |
+
"extra": {
|
32 |
+
"branch-alias": {
|
33 |
+
"dev-master": "3.3.x-dev"
|
34 |
+
}
|
35 |
+
},
|
36 |
+
"autoload": {
|
37 |
+
"psr-0": {
|
38 |
+
"Pimple": "src/"
|
39 |
+
}
|
40 |
+
},
|
41 |
+
"notification-url": "https://packagist.org/downloads/",
|
42 |
+
"license": [
|
43 |
+
"MIT"
|
44 |
+
],
|
45 |
+
"authors": [
|
46 |
+
{
|
47 |
+
"name": "Fabien Potencier",
|
48 |
+
"email": "fabien@symfony.com"
|
49 |
+
}
|
50 |
+
],
|
51 |
+
"description": "Pimple, a simple Dependency Injection Container",
|
52 |
+
"homepage": "https://pimple.symfony.com",
|
53 |
+
"keywords": [
|
54 |
+
"container",
|
55 |
+
"dependency injection"
|
56 |
+
],
|
57 |
+
"time": "2020-03-03T09:12:48+00:00"
|
58 |
+
},
|
59 |
+
{
|
60 |
+
"name": "psr/container",
|
61 |
+
"version": "1.0.0",
|
62 |
+
"source": {
|
63 |
+
"type": "git",
|
64 |
+
"url": "https://github.com/php-fig/container.git",
|
65 |
+
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
|
66 |
+
},
|
67 |
+
"dist": {
|
68 |
+
"type": "zip",
|
69 |
+
"url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
70 |
+
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
71 |
+
"shasum": ""
|
72 |
+
},
|
73 |
+
"require": {
|
74 |
+
"php": ">=5.3.0"
|
75 |
+
},
|
76 |
+
"type": "library",
|
77 |
+
"extra": {
|
78 |
+
"branch-alias": {
|
79 |
+
"dev-master": "1.0.x-dev"
|
80 |
+
}
|
81 |
+
},
|
82 |
+
"autoload": {
|
83 |
+
"psr-4": {
|
84 |
+
"Psr\\Container\\": "src/"
|
85 |
+
}
|
86 |
+
},
|
87 |
+
"notification-url": "https://packagist.org/downloads/",
|
88 |
+
"license": [
|
89 |
+
"MIT"
|
90 |
+
],
|
91 |
+
"authors": [
|
92 |
+
{
|
93 |
+
"name": "PHP-FIG",
|
94 |
+
"homepage": "http://www.php-fig.org/"
|
95 |
+
}
|
96 |
+
],
|
97 |
+
"description": "Common Container Interface (PHP FIG PSR-11)",
|
98 |
+
"homepage": "https://github.com/php-fig/container",
|
99 |
+
"keywords": [
|
100 |
+
"PSR-11",
|
101 |
+
"container",
|
102 |
+
"container-interface",
|
103 |
+
"container-interop",
|
104 |
+
"psr"
|
105 |
+
],
|
106 |
+
"time": "2017-02-14T16:28:37+00:00"
|
107 |
+
}
|
108 |
+
],
|
109 |
+
"packages-dev": [
|
110 |
+
{
|
111 |
+
"name": "antecedent/patchwork",
|
112 |
+
"version": "2.1.12",
|
113 |
+
"source": {
|
114 |
+
"type": "git",
|
115 |
+
"url": "https://github.com/antecedent/patchwork.git",
|
116 |
+
"reference": "b98e046dd4c0acc34a0846604f06f6111654d9ea"
|
117 |
+
},
|
118 |
+
"dist": {
|
119 |
+
"type": "zip",
|
120 |
+
"url": "https://api.github.com/repos/antecedent/patchwork/zipball/b98e046dd4c0acc34a0846604f06f6111654d9ea",
|
121 |
+
"reference": "b98e046dd4c0acc34a0846604f06f6111654d9ea",
|
122 |
+
"shasum": ""
|
123 |
+
},
|
124 |
+
"require": {
|
125 |
+
"php": ">=5.4.0"
|
126 |
+
},
|
127 |
+
"require-dev": {
|
128 |
+
"phpunit/phpunit": ">=4"
|
129 |
+
},
|
130 |
+
"type": "library",
|
131 |
+
"notification-url": "https://packagist.org/downloads/",
|
132 |
+
"license": [
|
133 |
+
"MIT"
|
134 |
+
],
|
135 |
+
"authors": [
|
136 |
+
{
|
137 |
+
"name": "Ignas Rudaitis",
|
138 |
+
"email": "ignas.rudaitis@gmail.com"
|
139 |
+
}
|
140 |
+
],
|
141 |
+
"description": "Method redefinition (monkey-patching) functionality for PHP.",
|
142 |
+
"homepage": "http://patchwork2.org/",
|
143 |
+
"keywords": [
|
144 |
+
"aop",
|
145 |
+
"aspect",
|
146 |
+
"interception",
|
147 |
+
"monkeypatching",
|
148 |
+
"redefinition",
|
149 |
+
"runkit",
|
150 |
+
"testing"
|
151 |
+
],
|
152 |
+
"time": "2019-12-22T17:52:09+00:00"
|
153 |
+
},
|
154 |
+
{
|
155 |
+
"name": "behat/gherkin",
|
156 |
+
"version": "v4.6.1",
|
157 |
+
"source": {
|
158 |
+
"type": "git",
|
159 |
+
"url": "https://github.com/Behat/Gherkin.git",
|
160 |
+
"reference": "25bdcaf37898b4a939fa3031d5d753ced97e4759"
|
161 |
+
},
|
162 |
+
"dist": {
|
163 |
+
"type": "zip",
|
164 |
+
"url": "https://api.github.com/repos/Behat/Gherkin/zipball/25bdcaf37898b4a939fa3031d5d753ced97e4759",
|
165 |
+
"reference": "25bdcaf37898b4a939fa3031d5d753ced97e4759",
|
166 |
+
"shasum": ""
|
167 |
+
},
|
168 |
+
"require": {
|
169 |
+
"php": ">=5.3.1"
|
170 |
+
},
|
171 |
+
"require-dev": {
|
172 |
+
"phpunit/phpunit": "~4.5|~5",
|
173 |
+
"symfony/phpunit-bridge": "~2.7|~3|~4",
|
174 |
+
"symfony/yaml": "~2.3|~3|~4"
|
175 |
+
},
|
176 |
+
"suggest": {
|
177 |
+
"symfony/yaml": "If you want to parse features, represented in YAML files"
|
178 |
+
},
|
179 |
+
"type": "library",
|
180 |
+
"extra": {
|
181 |
+
"branch-alias": {
|
182 |
+
"dev-master": "4.4-dev"
|
183 |
+
}
|
184 |
+
},
|
185 |
+
"autoload": {
|
186 |
+
"psr-0": {
|
187 |
+
"Behat\\Gherkin": "src/"
|
188 |
+
}
|
189 |
+
},
|
190 |
+
"notification-url": "https://packagist.org/downloads/",
|
191 |
+
"license": [
|
192 |
+
"MIT"
|
193 |
+
],
|
194 |
+
"authors": [
|
195 |
+
{
|
196 |
+
"name": "Konstantin Kudryashov",
|
197 |
+
"email": "ever.zet@gmail.com",
|
198 |
+
"homepage": "http://everzet.com"
|
199 |
+
}
|
200 |
+
],
|
201 |
+
"description": "Gherkin DSL parser for PHP 5.3",
|
202 |
+
"homepage": "http://behat.org/",
|
203 |
+
"keywords": [
|
204 |
+
"BDD",
|
205 |
+
"Behat",
|
206 |
+
"Cucumber",
|
207 |
+
"DSL",
|
208 |
+
"gherkin",
|
209 |
+
"parser"
|
210 |
+
],
|
211 |
+
"time": "2020-02-27T11:29:57+00:00"
|
212 |
+
},
|
213 |
+
{
|
214 |
+
"name": "codeception/codeception",
|
215 |
+
"version": "3.1.2",
|
216 |
+
"source": {
|
217 |
+
"type": "git",
|
218 |
+
"url": "https://github.com/Codeception/Codeception.git",
|
219 |
+
"reference": "5ea172de7b1b2e61dcdd50d73f8368886c549fb4"
|
220 |
+
},
|
221 |
+
"dist": {
|
222 |
+
"type": "zip",
|
223 |
+
"url": "https://api.github.com/repos/Codeception/Codeception/zipball/5ea172de7b1b2e61dcdd50d73f8368886c549fb4",
|
224 |
+
"reference": "5ea172de7b1b2e61dcdd50d73f8368886c549fb4",
|
225 |
+
"shasum": ""
|
226 |
+
},
|
227 |
+
"require": {
|
228 |
+
"behat/gherkin": "^4.4.0",
|
229 |
+
"codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.0.3",
|
230 |
+
"codeception/stub": "^2.0 | ^3.0",
|
231 |
+
"ext-curl": "*",
|
232 |
+
"ext-json": "*",
|
233 |
+
"ext-mbstring": "*",
|
234 |
+
"facebook/webdriver": "^1.6.0",
|
235 |
+
"guzzlehttp/guzzle": "^6.3.0",
|
236 |
+
"guzzlehttp/psr7": "~1.4",
|
237 |
+
"hoa/console": "~3.0",
|
238 |
+
"php": ">=5.6.0 <8.0",
|
239 |
+
"symfony/browser-kit": ">=2.7 <5.0",
|
240 |
+
"symfony/console": ">=2.7 <5.0",
|
241 |
+
"symfony/css-selector": ">=2.7 <5.0",
|
242 |
+
"symfony/dom-crawler": ">=2.7 <5.0",
|
243 |
+
"symfony/event-dispatcher": ">=2.7 <5.0",
|
244 |
+
"symfony/finder": ">=2.7 <5.0",
|
245 |
+
"symfony/yaml": ">=2.7 <5.0"
|
246 |
+
},
|
247 |
+
"require-dev": {
|
248 |
+
"codeception/specify": "~0.3",
|
249 |
+
"doctrine/annotations": "^1",
|
250 |
+
"doctrine/data-fixtures": "^1",
|
251 |
+
"doctrine/orm": "^2",
|
252 |
+
"flow/jsonpath": "~0.2",
|
253 |
+
"monolog/monolog": "~1.8",
|
254 |
+
"pda/pheanstalk": "~3.0",
|
255 |
+
"php-amqplib/php-amqplib": "~2.4",
|
256 |
+
"predis/predis": "^1.0",
|
257 |
+
"ramsey/uuid-doctrine": "^1.5",
|
258 |
+
"squizlabs/php_codesniffer": "~2.0",
|
259 |
+
"symfony/process": ">=2.7 <5.0",
|
260 |
+
"vlucas/phpdotenv": "^3.0"
|
261 |
+
},
|
262 |
+
"suggest": {
|
263 |
+
"aws/aws-sdk-php": "For using AWS Auth in REST module and Queue module",
|
264 |
+
"codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests",
|
265 |
+
"codeception/specify": "BDD-style code blocks",
|
266 |
+
"codeception/verify": "BDD-style assertions",
|
267 |
+
"flow/jsonpath": "For using JSONPath in REST module",
|
268 |
+
"league/factory-muffin": "For DataFactory module",
|
269 |
+
"league/factory-muffin-faker": "For Faker support in DataFactory module",
|
270 |
+
"phpseclib/phpseclib": "for SFTP option in FTP Module",
|
271 |
+
"stecman/symfony-console-completion": "For BASH autocompletion",
|
272 |
+
"symfony/phpunit-bridge": "For phpunit-bridge support"
|
273 |
+
},
|
274 |
+
"bin": [
|
275 |
+
"codecept"
|
276 |
+
],
|
277 |
+
"type": "library",
|
278 |
+
"extra": {
|
279 |
+
"branch-alias": []
|
280 |
+
},
|
281 |
+
"autoload": {
|
282 |
+
"psr-4": {
|
283 |
+
"Codeception\\": "src/Codeception",
|
284 |
+
"Codeception\\Extension\\": "ext"
|
285 |
+
}
|
286 |
+
},
|
287 |
+
"notification-url": "https://packagist.org/downloads/",
|
288 |
+
"license": [
|
289 |
+
"MIT"
|
290 |
+
],
|
291 |
+
"authors": [
|
292 |
+
{
|
293 |
+
"name": "Michael Bodnarchuk",
|
294 |
+
"email": "davert@mail.ua",
|
295 |
+
"homepage": "http://codegyre.com"
|
296 |
+
}
|
297 |
+
],
|
298 |
+
"description": "BDD-style testing framework",
|
299 |
+
"homepage": "http://codeception.com/",
|
300 |
+
"keywords": [
|
301 |
+
"BDD",
|
302 |
+
"TDD",
|
303 |
+
"acceptance testing",
|
304 |
+
"functional testing",
|
305 |
+
"unit testing"
|
306 |
+
],
|
307 |
+
"time": "2019-10-19T13:15:55+00:00"
|
308 |
+
},
|
309 |
+
{
|
310 |
+
"name": "codeception/phpunit-wrapper",
|
311 |
+
"version": "8.1.1",
|
312 |
+
"source": {
|
313 |
+
"type": "git",
|
314 |
+
"url": "https://github.com/Codeception/phpunit-wrapper.git",
|
315 |
+
"reference": "f1370a15e5fe60e7347b1c60642479b923a7ceef"
|
316 |
+
},
|
317 |
+
"dist": {
|
318 |
+
"type": "zip",
|
319 |
+
"url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/f1370a15e5fe60e7347b1c60642479b923a7ceef",
|
320 |
+
"reference": "f1370a15e5fe60e7347b1c60642479b923a7ceef",
|
321 |
+
"shasum": ""
|
322 |
+
},
|
323 |
+
"require": {
|
324 |
+
"php": ">=7.2",
|
325 |
+
"phpunit/php-code-coverage": "^7.0",
|
326 |
+
"phpunit/phpunit": "^8.0",
|
327 |
+
"sebastian/comparator": "^3.0",
|
328 |
+
"sebastian/diff": "^3.0"
|
329 |
+
},
|
330 |
+
"require-dev": {
|
331 |
+
"codeception/specify": "*",
|
332 |
+
"vlucas/phpdotenv": "^3.0"
|
333 |
+
},
|
334 |
+
"type": "library",
|
335 |
+
"autoload": {
|
336 |
+
"psr-4": {
|
337 |
+
"Codeception\\PHPUnit\\": "src\\"
|
338 |
+
}
|
339 |
+
},
|
340 |
+
"notification-url": "https://packagist.org/downloads/",
|
341 |
+
"license": [
|
342 |
+
"MIT"
|
343 |
+
],
|
344 |
+
"authors": [
|
345 |
+
{
|
346 |
+
"name": "Davert",
|
347 |
+
"email": "davert.php@resend.cc"
|
348 |
+
}
|
349 |
+
],
|
350 |
+
"description": "PHPUnit classes used by Codeception",
|
351 |
+
"time": "2019-12-21T16:08:14+00:00"
|
352 |
+
},
|
353 |
+
{
|
354 |
+
"name": "codeception/stub",
|
355 |
+
"version": "3.6.1",
|
356 |
+
"source": {
|
357 |
+
"type": "git",
|
358 |
+
"url": "https://github.com/Codeception/Stub.git",
|
359 |
+
"reference": "a3ba01414cbee76a1bced9f9b6b169cc8d203880"
|
360 |
+
},
|
361 |
+
"dist": {
|
362 |
+
"type": "zip",
|
363 |
+
"url": "https://api.github.com/repos/Codeception/Stub/zipball/a3ba01414cbee76a1bced9f9b6b169cc8d203880",
|
364 |
+
"reference": "a3ba01414cbee76a1bced9f9b6b169cc8d203880",
|
365 |
+
"shasum": ""
|
366 |
+
},
|
367 |
+
"require": {
|
368 |
+
"phpunit/phpunit": "^8.4 | ^9.0"
|
369 |
+
},
|
370 |
+
"type": "library",
|
371 |
+
"autoload": {
|
372 |
+
"psr-4": {
|
373 |
+
"Codeception\\": "src/"
|
374 |
+
}
|
375 |
+
},
|
376 |
+
"notification-url": "https://packagist.org/downloads/",
|
377 |
+
"license": [
|
378 |
+
"MIT"
|
379 |
+
],
|
380 |
+
"description": "Flexible Stub wrapper for PHPUnit's Mock Builder",
|
381 |
+
"time": "2020-02-07T18:42:28+00:00"
|
382 |
+
},
|
383 |
+
{
|
384 |
+
"name": "composer/ca-bundle",
|
385 |
+
"version": "1.2.6",
|
386 |
+
"source": {
|
387 |
+
"type": "git",
|
388 |
+
"url": "https://github.com/composer/ca-bundle.git",
|
389 |
+
"reference": "47fe531de31fca4a1b997f87308e7d7804348f7e"
|
390 |
+
},
|
391 |
+
"dist": {
|
392 |
+
"type": "zip",
|
393 |
+
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/47fe531de31fca4a1b997f87308e7d7804348f7e",
|
394 |
+
"reference": "47fe531de31fca4a1b997f87308e7d7804348f7e",
|
395 |
+
"shasum": ""
|
396 |
+
},
|
397 |
+
"require": {
|
398 |
+
"ext-openssl": "*",
|
399 |
+
"ext-pcre": "*",
|
400 |
+
"php": "^5.3.2 || ^7.0 || ^8.0"
|
401 |
+
},
|
402 |
+
"require-dev": {
|
403 |
+
"phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
|
404 |
+
"psr/log": "^1.0",
|
405 |
+
"symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
|
406 |
+
},
|
407 |
+
"type": "library",
|
408 |
+
"extra": {
|
409 |
+
"branch-alias": {
|
410 |
+
"dev-master": "1.x-dev"
|
411 |
+
}
|
412 |
+
},
|
413 |
+
"autoload": {
|
414 |
+
"psr-4": {
|
415 |
+
"Composer\\CaBundle\\": "src"
|
416 |
+
}
|
417 |
+
},
|
418 |
+
"notification-url": "https://packagist.org/downloads/",
|
419 |
+
"license": [
|
420 |
+
"MIT"
|
421 |
+
],
|
422 |
+
"authors": [
|
423 |
+
{
|
424 |
+
"name": "Jordi Boggiano",
|
425 |
+
"email": "j.boggiano@seld.be",
|
426 |
+
"homepage": "http://seld.be"
|
427 |
+
}
|
428 |
+
],
|
429 |
+
"description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
|
430 |
+
"keywords": [
|
431 |
+
"cabundle",
|
432 |
+
"cacert",
|
433 |
+
"certificate",
|
434 |
+
"ssl",
|
435 |
+
"tls"
|
436 |
+
],
|
437 |
+
"time": "2020-01-13T10:02:55+00:00"
|
438 |
+
},
|
439 |
+
{
|
440 |
+
"name": "composer/composer",
|
441 |
+
"version": "1.10.0",
|
442 |
+
"source": {
|
443 |
+
"type": "git",
|
444 |
+
"url": "https://github.com/composer/composer.git",
|
445 |
+
"reference": "472c917b2a083ec7d2fa25c55fd099d1300e2515"
|
446 |
+
},
|
447 |
+
"dist": {
|
448 |
+
"type": "zip",
|
449 |
+
"url": "https://api.github.com/repos/composer/composer/zipball/472c917b2a083ec7d2fa25c55fd099d1300e2515",
|
450 |
+
"reference": "472c917b2a083ec7d2fa25c55fd099d1300e2515",
|
451 |
+
"shasum": ""
|
452 |
+
},
|
453 |
+
"require": {
|
454 |
+
"composer/ca-bundle": "^1.0",
|
455 |
+
"composer/semver": "^1.0",
|
456 |
+
"composer/spdx-licenses": "^1.2",
|
457 |
+
"composer/xdebug-handler": "^1.1",
|
458 |
+
"justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0",
|
459 |
+
"php": "^5.3.2 || ^7.0",
|
460 |
+
"psr/log": "^1.0",
|
461 |
+
"seld/jsonlint": "^1.4",
|
462 |
+
"seld/phar-utils": "^1.0",
|
463 |
+
"symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0",
|
464 |
+
"symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0",
|
465 |
+
"symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0",
|
466 |
+
"symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0"
|
467 |
+
},
|
468 |
+
"conflict": {
|
469 |
+
"symfony/console": "2.8.38"
|
470 |
+
},
|
471 |
+
"require-dev": {
|
472 |
+
"phpspec/prophecy": "^1.10",
|
473 |
+
"symfony/phpunit-bridge": "^3.4"
|
474 |
+
},
|
475 |
+
"suggest": {
|
476 |
+
"ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
|
477 |
+
"ext-zip": "Enabling the zip extension allows you to unzip archives",
|
478 |
+
"ext-zlib": "Allow gzip compression of HTTP requests"
|
479 |
+
},
|
480 |
+
"bin": [
|
481 |
+
"bin/composer"
|
482 |
+
],
|
483 |
+
"type": "library",
|
484 |
+
"extra": {
|
485 |
+
"branch-alias": {
|
486 |
+
"dev-master": "1.10-dev"
|
487 |
+
}
|
488 |
+
},
|
489 |
+
"autoload": {
|
490 |
+
"psr-4": {
|
491 |
+
"Composer\\": "src/Composer"
|
492 |
+
}
|
493 |
+
},
|
494 |
+
"notification-url": "https://packagist.org/downloads/",
|
495 |
+
"license": [
|
496 |
+
"MIT"
|
497 |
+
],
|
498 |
+
"authors": [
|
499 |
+
{
|
500 |
+
"name": "Nils Adermann",
|
501 |
+
"email": "naderman@naderman.de",
|
502 |
+
"homepage": "http://www.naderman.de"
|
503 |
+
},
|
504 |
+
{
|
505 |
+
"name": "Jordi Boggiano",
|
506 |
+
"email": "j.boggiano@seld.be",
|
507 |
+
"homepage": "http://seld.be"
|
508 |
+
}
|
509 |
+
],
|
510 |
+
"description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.",
|
511 |
+
"homepage": "https://getcomposer.org/",
|
512 |
+
"keywords": [
|
513 |
+
"autoload",
|
514 |
+
"dependency",
|
515 |
+
"package"
|
516 |
+
],
|
517 |
+
"time": "2020-03-10T13:08:05+00:00"
|
518 |
+
},
|
519 |
+
{
|
520 |
+
"name": "composer/semver",
|
521 |
+
"version": "1.5.1",
|
522 |
+
"source": {
|
523 |
+
"type": "git",
|
524 |
+
"url": "https://github.com/composer/semver.git",
|
525 |
+
"reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de"
|
526 |
+
},
|
527 |
+
"dist": {
|
528 |
+
"type": "zip",
|
529 |
+
"url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de",
|
530 |
+
"reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de",
|
531 |
+
"shasum": ""
|
532 |
+
},
|
533 |
+
"require": {
|
534 |
+
"php": "^5.3.2 || ^7.0"
|
535 |
+
},
|
536 |
+
"require-dev": {
|
537 |
+
"phpunit/phpunit": "^4.5 || ^5.0.5"
|
538 |
+
},
|
539 |
+
"type": "library",
|
540 |
+
"extra": {
|
541 |
+
"branch-alias": {
|
542 |
+
"dev-master": "1.x-dev"
|
543 |
+
}
|
544 |
+
},
|
545 |
+
"autoload": {
|
546 |
+
"psr-4": {
|
547 |
+
"Composer\\Semver\\": "src"
|
548 |
+
}
|
549 |
+
},
|
550 |
+
"notification-url": "https://packagist.org/downloads/",
|
551 |
+
"license": [
|
552 |
+
"MIT"
|
553 |
+
],
|
554 |
+
"authors": [
|
555 |
+
{
|
556 |
+
"name": "Nils Adermann",
|
557 |
+
"email": "naderman@naderman.de",
|
558 |
+
"homepage": "http://www.naderman.de"
|
559 |
+
},
|
560 |
+
{
|
561 |
+
"name": "Jordi Boggiano",
|
562 |
+
"email": "j.boggiano@seld.be",
|
563 |
+
"homepage": "http://seld.be"
|
564 |
+
},
|
565 |
+
{
|
566 |
+
"name": "Rob Bast",
|
567 |
+
"email": "rob.bast@gmail.com",
|
568 |
+
"homepage": "http://robbast.nl"
|
569 |
+
}
|
570 |
+
],
|
571 |
+
"description": "Semver library that offers utilities, version constraint parsing and validation.",
|
572 |
+
"keywords": [
|
573 |
+
"semantic",
|
574 |
+
"semver",
|
575 |
+
"validation",
|
576 |
+
"versioning"
|
577 |
+
],
|
578 |
+
"time": "2020-01-13T12:06:48+00:00"
|
579 |
+
},
|
580 |
+
{
|
581 |
+
"name": "composer/spdx-licenses",
|
582 |
+
"version": "1.5.3",
|
583 |
+
"source": {
|
584 |
+
"type": "git",
|
585 |
+
"url": "https://github.com/composer/spdx-licenses.git",
|
586 |
+
"reference": "0c3e51e1880ca149682332770e25977c70cf9dae"
|
587 |
+
},
|
588 |
+
"dist": {
|
589 |
+
"type": "zip",
|
590 |
+
"url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae",
|
591 |
+
"reference": "0c3e51e1880ca149682332770e25977c70cf9dae",
|
592 |
+
"shasum": ""
|
593 |
+
},
|
594 |
+
"require": {
|
595 |
+
"php": "^5.3.2 || ^7.0 || ^8.0"
|
596 |
+
},
|
597 |
+
"require-dev": {
|
598 |
+
"phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7"
|
599 |
+
},
|
600 |
+
"type": "library",
|
601 |
+
"extra": {
|
602 |
+
"branch-alias": {
|
603 |
+
"dev-master": "1.x-dev"
|
604 |
+
}
|
605 |
+
},
|
606 |
+
"autoload": {
|
607 |
+
"psr-4": {
|
608 |
+
"Composer\\Spdx\\": "src"
|
609 |
+
}
|
610 |
+
},
|
611 |
+
"notification-url": "https://packagist.org/downloads/",
|
612 |
+
"license": [
|
613 |
+
"MIT"
|
614 |
+
],
|
615 |
+
"authors": [
|
616 |
+
{
|
617 |
+
"name": "Nils Adermann",
|
618 |
+
"email": "naderman@naderman.de",
|
619 |
+
"homepage": "http://www.naderman.de"
|
620 |
+
},
|
621 |
+
{
|
622 |
+
"name": "Jordi Boggiano",
|
623 |
+
"email": "j.boggiano@seld.be",
|
624 |
+
"homepage": "http://seld.be"
|
625 |
+
},
|
626 |
+
{
|
627 |
+
"name": "Rob Bast",
|
628 |
+
"email": "rob.bast@gmail.com",
|
629 |
+
"homepage": "http://robbast.nl"
|
630 |
+
}
|
631 |
+
],
|
632 |
+
"description": "SPDX licenses list and validation library.",
|
633 |
+
"keywords": [
|
634 |
+
"license",
|
635 |
+
"spdx",
|
636 |
+
"validator"
|
637 |
+
],
|
638 |
+
"time": "2020-02-14T07:44:31+00:00"
|
639 |
+
},
|
640 |
+
{
|
641 |
+
"name": "composer/xdebug-handler",
|
642 |
+
"version": "1.4.1",
|
643 |
+
"source": {
|
644 |
+
"type": "git",
|
645 |
+
"url": "https://github.com/composer/xdebug-handler.git",
|
646 |
+
"reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7"
|
647 |
+
},
|
648 |
+
"dist": {
|
649 |
+
"type": "zip",
|
650 |
+
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7",
|
651 |
+
"reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7",
|
652 |
+
"shasum": ""
|
653 |
+
},
|
654 |
+
"require": {
|
655 |
+
"php": "^5.3.2 || ^7.0 || ^8.0",
|
656 |
+
"psr/log": "^1.0"
|
657 |
+
},
|
658 |
+
"require-dev": {
|
659 |
+
"phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
|
660 |
+
},
|
661 |
+
"type": "library",
|
662 |
+
"autoload": {
|
663 |
+
"psr-4": {
|
664 |
+
"Composer\\XdebugHandler\\": "src"
|
665 |
+
}
|
666 |
+
},
|
667 |
+
"notification-url": "https://packagist.org/downloads/",
|
668 |
+
"license": [
|
669 |
+
"MIT"
|
670 |
+
],
|
671 |
+
"authors": [
|
672 |
+
{
|
673 |
+
"name": "John Stevenson",
|
674 |
+
"email": "john-stevenson@blueyonder.co.uk"
|
675 |
+
}
|
676 |
+
],
|
677 |
+
"description": "Restarts a process without Xdebug.",
|
678 |
+
"keywords": [
|
679 |
+
"Xdebug",
|
680 |
+
"performance"
|
681 |
+
],
|
682 |
+
"time": "2020-03-01T12:26:26+00:00"
|
683 |
+
},
|
684 |
+
{
|
685 |
+
"name": "cweagans/composer-patches",
|
686 |
+
"version": "1.6.7",
|
687 |
+
"source": {
|
688 |
+
"type": "git",
|
689 |
+
"url": "https://github.com/cweagans/composer-patches.git",
|
690 |
+
"reference": "2e6f72a2ad8d59cd7e2b729f218bf42adb14f590"
|
691 |
+
},
|
692 |
+
"dist": {
|
693 |
+
"type": "zip",
|
694 |
+
"url": "https://api.github.com/repos/cweagans/composer-patches/zipball/2e6f72a2ad8d59cd7e2b729f218bf42adb14f590",
|
695 |
+
"reference": "2e6f72a2ad8d59cd7e2b729f218bf42adb14f590",
|
696 |
+
"shasum": ""
|
697 |
+
},
|
698 |
+
"require": {
|
699 |
+
"composer-plugin-api": "^1.0",
|
700 |
+
"php": ">=5.3.0"
|
701 |
+
},
|
702 |
+
"require-dev": {
|
703 |
+
"composer/composer": "~1.0",
|
704 |
+
"phpunit/phpunit": "~4.6"
|
705 |
+
},
|
706 |
+
"type": "composer-plugin",
|
707 |
+
"extra": {
|
708 |
+
"class": "cweagans\\Composer\\Patches"
|
709 |
+
},
|
710 |
+
"autoload": {
|
711 |
+
"psr-4": {
|
712 |
+
"cweagans\\Composer\\": "src"
|
713 |
+
}
|
714 |
+
},
|
715 |
+
"notification-url": "https://packagist.org/downloads/",
|
716 |
+
"license": [
|
717 |
+
"BSD-3-Clause"
|
718 |
+
],
|
719 |
+
"authors": [
|
720 |
+
{
|
721 |
+
"name": "Cameron Eagans",
|
722 |
+
"email": "me@cweagans.net"
|
723 |
+
}
|
724 |
+
],
|
725 |
+
"description": "Provides a way to patch Composer packages.",
|
726 |
+
"time": "2019-08-29T20:11:49+00:00"
|
727 |
+
},
|
728 |
+
{
|
729 |
+
"name": "dg/mysql-dump",
|
730 |
+
"version": "v1.5.1",
|
731 |
+
"source": {
|
732 |
+
"type": "git",
|
733 |
+
"url": "https://github.com/dg/MySQL-dump.git",
|
734 |
+
"reference": "e0e287b715b43293773a8b0edf8514f606e01780"
|
735 |
+
},
|
736 |
+
"dist": {
|
737 |
+
"type": "zip",
|
738 |
+
"url": "https://api.github.com/repos/dg/MySQL-dump/zipball/e0e287b715b43293773a8b0edf8514f606e01780",
|
739 |
+
"reference": "e0e287b715b43293773a8b0edf8514f606e01780",
|
740 |
+
"shasum": ""
|
741 |
+
},
|
742 |
+
"require": {
|
743 |
+
"php": ">=5.6"
|
744 |
+
},
|
745 |
+
"type": "library",
|
746 |
+
"autoload": {
|
747 |
+
"classmap": [
|
748 |
+
"src/"
|
749 |
+
]
|
750 |
+
},
|
751 |
+
"notification-url": "https://packagist.org/downloads/",
|
752 |
+
"license": [
|
753 |
+
"BSD-3-Clause"
|
754 |
+
],
|
755 |
+
"authors": [
|
756 |
+
{
|
757 |
+
"name": "David Grudl",
|
758 |
+
"homepage": "http://davidgrudl.com"
|
759 |
+
}
|
760 |
+
],
|
761 |
+
"description": "MySQL database dump.",
|
762 |
+
"homepage": "https://github.com/dg/MySQL-dump",
|
763 |
+
"keywords": [
|
764 |
+
"mysql"
|
765 |
+
],
|
766 |
+
"time": "2019-09-10T21:36:25+00:00"
|
767 |
+
},
|
768 |
+
{
|
769 |
+
"name": "doctrine/inflector",
|
770 |
+
"version": "1.3.1",
|
771 |
+
"source": {
|
772 |
+
"type": "git",
|
773 |
+
"url": "https://github.com/doctrine/inflector.git",
|
774 |
+
"reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1"
|
775 |
+
},
|
776 |
+
"dist": {
|
777 |
+
"type": "zip",
|
778 |
+
"url": "https://api.github.com/repos/doctrine/inflector/zipball/ec3a55242203ffa6a4b27c58176da97ff0a7aec1",
|
779 |
+
"reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1",
|
780 |
+
"shasum": ""
|
781 |
+
},
|
782 |
+
"require": {
|
783 |
+
"php": "^7.1"
|
784 |
+
},
|
785 |
+
"require-dev": {
|
786 |
+
"phpunit/phpunit": "^6.2"
|
787 |
+
},
|
788 |
+
"type": "library",
|
789 |
+
"extra": {
|
790 |
+
"branch-alias": {
|
791 |
+
"dev-master": "1.3.x-dev"
|
792 |
+
}
|
793 |
+
},
|
794 |
+
"autoload": {
|
795 |
+
"psr-4": {
|
796 |
+
"Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector"
|
797 |
+
}
|
798 |
+
},
|
799 |
+
"notification-url": "https://packagist.org/downloads/",
|
800 |
+
"license": [
|
801 |
+
"MIT"
|
802 |
+
],
|
803 |
+
"authors": [
|
804 |
+
{
|
805 |
+
"name": "Guilherme Blanco",
|
806 |
+
"email": "guilhermeblanco@gmail.com"
|
807 |
+
},
|
808 |
+
{
|
809 |
+
"name": "Roman Borschel",
|
810 |
+
"email": "roman@code-factory.org"
|
811 |
+
},
|
812 |
+
{
|
813 |
+
"name": "Benjamin Eberlei",
|
814 |
+
"email": "kontakt@beberlei.de"
|
815 |
+
},
|
816 |
+
{
|
817 |
+
"name": "Jonathan Wage",
|
818 |
+
"email": "jonwage@gmail.com"
|
819 |
+
},
|
820 |
+
{
|
821 |
+
"name": "Johannes Schmitt",
|
822 |
+
"email": "schmittjoh@gmail.com"
|
823 |
+
}
|
824 |
+
],
|
825 |
+
"description": "Common String Manipulations with regard to casing and singular/plural rules.",
|
826 |
+
"homepage": "http://www.doctrine-project.org",
|
827 |
+
"keywords": [
|
828 |
+
"inflection",
|
829 |
+
"pluralize",
|
830 |
+
"singularize",
|
831 |
+
"string"
|
832 |
+
],
|
833 |
+
"time": "2019-10-30T19:59:35+00:00"
|
834 |
+
},
|
835 |
+
{
|
836 |
+
"name": "doctrine/instantiator",
|
837 |
+
"version": "1.3.0",
|
838 |
+
"source": {
|
839 |
+
"type": "git",
|
840 |
+
"url": "https://github.com/doctrine/instantiator.git",
|
841 |
+
"reference": "ae466f726242e637cebdd526a7d991b9433bacf1"
|
842 |
+
},
|
843 |
+
"dist": {
|
844 |
+
"type": "zip",
|
845 |
+
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1",
|
846 |
+
"reference": "ae466f726242e637cebdd526a7d991b9433bacf1",
|
847 |
+
"shasum": ""
|
848 |
+
},
|
849 |
+
"require": {
|
850 |
+
"php": "^7.1"
|
851 |
+
},
|
852 |
+
"require-dev": {
|
853 |
+
"doctrine/coding-standard": "^6.0",
|
854 |
+
"ext-pdo": "*",
|
855 |
+
"ext-phar": "*",
|
856 |
+
"phpbench/phpbench": "^0.13",
|
857 |
+
"phpstan/phpstan-phpunit": "^0.11",
|
858 |
+
"phpstan/phpstan-shim": "^0.11",
|
859 |
+
"phpunit/phpunit": "^7.0"
|
860 |
+
},
|
861 |
+
"type": "library",
|
862 |
+
"extra": {
|
863 |
+
"branch-alias": {
|
864 |
+
"dev-master": "1.2.x-dev"
|
865 |
+
}
|
866 |
+
},
|
867 |
+
"autoload": {
|
868 |
+
"psr-4": {
|
869 |
+
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
|
870 |
+
}
|
871 |
+
},
|
872 |
+
"notification-url": "https://packagist.org/downloads/",
|
873 |
+
"license": [
|
874 |
+
"MIT"
|
875 |
+
],
|
876 |
+
"authors": [
|
877 |
+
{
|
878 |
+
"name": "Marco Pivetta",
|
879 |
+
"email": "ocramius@gmail.com",
|
880 |
+
"homepage": "http://ocramius.github.com/"
|
881 |
+
}
|
882 |
+
],
|
883 |
+
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
|
884 |
+
"homepage": "https://www.doctrine-project.org/projects/instantiator.html",
|
885 |
+
"keywords": [
|
886 |
+
"constructor",
|
887 |
+
"instantiate"
|
888 |
+
],
|
889 |
+
"time": "2019-10-21T16:45:58+00:00"
|
890 |
+
},
|
891 |
+
{
|
892 |
+
"name": "facebook/webdriver",
|
893 |
+
"version": "1.7.1",
|
894 |
+
"source": {
|
895 |
+
"type": "git",
|
896 |
+
"url": "https://github.com/php-webdriver/php-webdriver-archive.git",
|
897 |
+
"reference": "e43de70f3c7166169d0f14a374505392734160e5"
|
898 |
+
},
|
899 |
+
"dist": {
|
900 |
+
"type": "zip",
|
901 |
+
"url": "https://api.github.com/repos/php-webdriver/php-webdriver-archive/zipball/e43de70f3c7166169d0f14a374505392734160e5",
|
902 |
+
"reference": "e43de70f3c7166169d0f14a374505392734160e5",
|
903 |
+
"shasum": ""
|
904 |
+
},
|
905 |
+
"require": {
|
906 |
+
"ext-curl": "*",
|
907 |
+
"ext-json": "*",
|
908 |
+
"ext-mbstring": "*",
|
909 |
+
"ext-zip": "*",
|
910 |
+
"php": "^5.6 || ~7.0",
|
911 |
+
"symfony/process": "^2.8 || ^3.1 || ^4.0"
|
912 |
+
},
|
913 |
+
"require-dev": {
|
914 |
+
"friendsofphp/php-cs-fixer": "^2.0",
|
915 |
+
"jakub-onderka/php-parallel-lint": "^0.9.2",
|
916 |
+
"php-coveralls/php-coveralls": "^2.0",
|
917 |
+
"php-mock/php-mock-phpunit": "^1.1",
|
918 |
+
"phpunit/phpunit": "^5.7",
|
919 |
+
"sebastian/environment": "^1.3.4 || ^2.0 || ^3.0",
|
920 |
+
"squizlabs/php_codesniffer": "^2.6",
|
921 |
+
"symfony/var-dumper": "^3.3 || ^4.0"
|
922 |
+
},
|
923 |
+
"suggest": {
|
924 |
+
"ext-SimpleXML": "For Firefox profile creation"
|
925 |
+
},
|
926 |
+
"type": "library",
|
927 |
+
"extra": {
|
928 |
+
"branch-alias": {
|
929 |
+
"dev-community": "1.5-dev"
|
930 |
+
}
|
931 |
+
},
|
932 |
+
"autoload": {
|
933 |
+
"psr-4": {
|
934 |
+
"Facebook\\WebDriver\\": "lib/"
|
935 |
+
}
|
936 |
+
},
|
937 |
+
"notification-url": "https://packagist.org/downloads/",
|
938 |
+
"license": [
|
939 |
+
"Apache-2.0"
|
940 |
+
],
|
941 |
+
"description": "A PHP client for Selenium WebDriver",
|
942 |
+
"homepage": "https://github.com/facebook/php-webdriver",
|
943 |
+
"keywords": [
|
944 |
+
"facebook",
|
945 |
+
"php",
|
946 |
+
"selenium",
|
947 |
+
"webdriver"
|
948 |
+
],
|
949 |
+
"abandoned": "php-webdriver/webdriver",
|
950 |
+
"time": "2019-06-13T08:02:18+00:00"
|
951 |
+
},
|
952 |
+
{
|
953 |
+
"name": "gettext/gettext",
|
954 |
+
"version": "v4.8.2",
|
955 |
+
"source": {
|
956 |
+
"type": "git",
|
957 |
+
"url": "https://github.com/php-gettext/Gettext.git",
|
958 |
+
"reference": "e474f872f2c8636cf53fd283ec4ce1218f3d236a"
|
959 |
+
},
|
960 |
+
"dist": {
|
961 |
+
"type": "zip",
|
962 |
+
"url": "https://api.github.com/repos/php-gettext/Gettext/zipball/e474f872f2c8636cf53fd283ec4ce1218f3d236a",
|
963 |
+
"reference": "e474f872f2c8636cf53fd283ec4ce1218f3d236a",
|
964 |
+
"shasum": ""
|
965 |
+
},
|
966 |
+
"require": {
|
967 |
+
"gettext/languages": "^2.3",
|
968 |
+
"php": ">=5.4.0"
|
969 |
+
},
|
970 |
+
"require-dev": {
|
971 |
+
"illuminate/view": "*",
|
972 |
+
"phpunit/phpunit": "^4.8|^5.7|^6.5",
|
973 |
+
"squizlabs/php_codesniffer": "^3.0",
|
974 |
+
"symfony/yaml": "~2",
|
975 |
+
"twig/extensions": "*",
|
976 |
+
"twig/twig": "^1.31|^2.0"
|
977 |
+
},
|
978 |
+
"suggest": {
|
979 |
+
"illuminate/view": "Is necessary if you want to use the Blade extractor",
|
980 |
+
"symfony/yaml": "Is necessary if you want to use the Yaml extractor/generator",
|
981 |
+
"twig/extensions": "Is necessary if you want to use the Twig extractor",
|
982 |
+
"twig/twig": "Is necessary if you want to use the Twig extractor"
|
983 |
+
},
|
984 |
+
"type": "library",
|
985 |
+
"autoload": {
|
986 |
+
"psr-4": {
|
987 |
+
"Gettext\\": "src"
|
988 |
+
}
|
989 |
+
},
|
990 |
+
"notification-url": "https://packagist.org/downloads/",
|
991 |
+
"license": [
|
992 |
+
"MIT"
|
993 |
+
],
|
994 |
+
"authors": [
|
995 |
+
{
|
996 |
+
"name": "Oscar Otero",
|
997 |
+
"email": "oom@oscarotero.com",
|
998 |
+
"homepage": "http://oscarotero.com",
|
999 |
+
"role": "Developer"
|
1000 |
+
}
|
1001 |
+
],
|
1002 |
+
"description": "PHP gettext manager",
|
1003 |
+
"homepage": "https://github.com/oscarotero/Gettext",
|
1004 |
+
"keywords": [
|
1005 |
+
"JS",
|
1006 |
+
"gettext",
|
1007 |
+
"i18n",
|
1008 |
+
"mo",
|
1009 |
+
"po",
|
1010 |
+
"translation"
|
1011 |
+
],
|
1012 |
+
"time": "2019-12-02T10:21:14+00:00"
|
1013 |
+
},
|
1014 |
+
{
|
1015 |
+
"name": "gettext/languages",
|
1016 |
+
"version": "2.6.0",
|
1017 |
+
"source": {
|
1018 |
+
"type": "git",
|
1019 |
+
"url": "https://github.com/php-gettext/Languages.git",
|
1020 |
+
"reference": "38ea0482f649e0802e475f0ed19fa993bcb7a618"
|
1021 |
+
},
|
1022 |
+
"dist": {
|
1023 |
+
"type": "zip",
|
1024 |
+
"url": "https://api.github.com/repos/php-gettext/Languages/zipball/38ea0482f649e0802e475f0ed19fa993bcb7a618",
|
1025 |
+
"reference": "38ea0482f649e0802e475f0ed19fa993bcb7a618",
|
1026 |
+
"shasum": ""
|
1027 |
+
},
|
1028 |
+
"require": {
|
1029 |
+
"php": ">=5.3"
|
1030 |
+
},
|
1031 |
+
"require-dev": {
|
1032 |
+
"friendsofphp/php-cs-fixer": "^2.16.0",
|
1033 |
+
"phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4"
|
1034 |
+
},
|
1035 |
+
"bin": [
|
1036 |
+
"bin/export-plural-rules"
|
1037 |
+
],
|
1038 |
+
"type": "library",
|
1039 |
+
"autoload": {
|
1040 |
+
"psr-4": {
|
1041 |
+
"Gettext\\Languages\\": "src/"
|
1042 |
+
}
|
1043 |
+
},
|
1044 |
+
"notification-url": "https://packagist.org/downloads/",
|
1045 |
+
"license": [
|
1046 |
+
"MIT"
|
1047 |
+
],
|
1048 |
+
"authors": [
|
1049 |
+
{
|
1050 |
+
"name": "Michele Locati",
|
1051 |
+
"email": "mlocati@gmail.com",
|
1052 |
+
"role": "Developer"
|
1053 |
+
}
|
1054 |
+
],
|
1055 |
+
"description": "gettext languages with plural rules",
|
1056 |
+
"homepage": "https://github.com/php-gettext/Languages",
|
1057 |
+
"keywords": [
|
1058 |
+
"cldr",
|
1059 |
+
"i18n",
|
1060 |
+
"internationalization",
|
1061 |
+
"l10n",
|
1062 |
+
"language",
|
1063 |
+
"languages",
|
1064 |
+
"localization",
|
1065 |
+
"php",
|
1066 |
+
"plural",
|
1067 |
+
"plural rules",
|
1068 |
+
"plurals",
|
1069 |
+
"translate",
|
1070 |
+
"translations",
|
1071 |
+
"unicode"
|
1072 |
+
],
|
1073 |
+
"time": "2019-11-13T10:30:21+00:00"
|
1074 |
+
},
|
1075 |
+
{
|
1076 |
+
"name": "gumlet/php-image-resize",
|
1077 |
+
"version": "1.9.2",
|
1078 |
+
"source": {
|
1079 |
+
"type": "git",
|
1080 |
+
"url": "https://github.com/gumlet/php-image-resize.git",
|
1081 |
+
"reference": "06339a9c1b167acd58173db226f57957a6617547"
|
1082 |
+
},
|
1083 |
+
"dist": {
|
1084 |
+
"type": "zip",
|
1085 |
+
"url": "https://api.github.com/repos/gumlet/php-image-resize/zipball/06339a9c1b167acd58173db226f57957a6617547",
|
1086 |
+
"reference": "06339a9c1b167acd58173db226f57957a6617547",
|
1087 |
+
"shasum": ""
|
1088 |
+
},
|
1089 |
+
"require": {
|
1090 |
+
"ext-fileinfo": "*",
|
1091 |
+
"ext-gd": "*",
|
1092 |
+
"php": ">=5.5.0"
|
1093 |
+
},
|
1094 |
+
"require-dev": {
|
1095 |
+
"apigen/apigen": "^4.1",
|
1096 |
+
"ext-exif": "*",
|
1097 |
+
"ext-gd": "*",
|
1098 |
+
"php-coveralls/php-coveralls": "^2.1",
|
1099 |
+
"phpunit/phpunit": "^4.8"
|
1100 |
+
},
|
1101 |
+
"suggest": {
|
1102 |
+
"ext-exif": "Auto-rotate jpeg files"
|
1103 |
+
},
|
1104 |
+
"type": "library",
|
1105 |
+
"autoload": {
|
1106 |
+
"psr-4": {
|
1107 |
+
"Gumlet\\": "lib/"
|
1108 |
+
}
|
1109 |
+
},
|
1110 |
+
"notification-url": "https://packagist.org/downloads/",
|
1111 |
+
"license": [
|
1112 |
+
"MIT"
|
1113 |
+
],
|
1114 |
+
"authors": [
|
1115 |
+
{
|
1116 |
+
"name": "Aditya Patadia",
|
1117 |
+
"homepage": "http://aditya.patadia.org/"
|
1118 |
+
}
|
1119 |
+
],
|
1120 |
+
"description": "PHP class to re-size and scale images",
|
1121 |
+
"homepage": "https://github.com/gumlet/php-image-resize",
|
1122 |
+
"keywords": [
|
1123 |
+
"image",
|
1124 |
+
"php",
|
1125 |
+
"resize",
|
1126 |
+
"scale"
|
1127 |
+
],
|
1128 |
+
"time": "2019-01-01T13:53:00+00:00"
|
1129 |
+
},
|
1130 |
+
{
|
1131 |
+
"name": "guzzlehttp/guzzle",
|
1132 |
+
"version": "6.5.2",
|
1133 |
+
"source": {
|
1134 |
+
"type": "git",
|
1135 |
+
"url": "https://github.com/guzzle/guzzle.git",
|
1136 |
+
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82"
|
1137 |
+
},
|
1138 |
+
"dist": {
|
1139 |
+
"type": "zip",
|
1140 |
+
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82",
|
1141 |
+
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82",
|
1142 |
+
"shasum": ""
|
1143 |
+
},
|
1144 |
+
"require": {
|
1145 |
+
"ext-json": "*",
|
1146 |
+
"guzzlehttp/promises": "^1.0",
|
1147 |
+
"guzzlehttp/psr7": "^1.6.1",
|
1148 |
+
"php": ">=5.5"
|
1149 |
+
},
|
1150 |
+
"require-dev": {
|
1151 |
+
"ext-curl": "*",
|
1152 |
+
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
|
1153 |
+
"psr/log": "^1.1"
|
1154 |
+
},
|
1155 |
+
"suggest": {
|
1156 |
+
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
|
1157 |
+
"psr/log": "Required for using the Log middleware"
|
1158 |
+
},
|
1159 |
+
"type": "library",
|
1160 |
+
"extra": {
|
1161 |
+
"branch-alias": {
|
1162 |
+
"dev-master": "6.5-dev"
|
1163 |
+
}
|
1164 |
+
},
|
1165 |
+
"autoload": {
|
1166 |
+
"psr-4": {
|
1167 |
+
"GuzzleHttp\\": "src/"
|
1168 |
+
},
|
1169 |
+
"files": [
|
1170 |
+
"src/functions_include.php"
|
1171 |
+
]
|
1172 |
+
},
|
1173 |
+
"notification-url": "https://packagist.org/downloads/",
|
1174 |
+
"license": [
|
1175 |
+
"MIT"
|
1176 |
+
],
|
1177 |
+
"authors": [
|
1178 |
+
{
|
1179 |
+
"name": "Michael Dowling",
|
1180 |
+
"email": "mtdowling@gmail.com",
|
1181 |
+
"homepage": "https://github.com/mtdowling"
|
1182 |
+
}
|
1183 |
+
],
|
1184 |
+
"description": "Guzzle is a PHP HTTP client library",
|
1185 |
+
"homepage": "http://guzzlephp.org/",
|
1186 |
+
"keywords": [
|
1187 |
+
"client",
|
1188 |
+
"curl",
|
1189 |
+
"framework",
|
1190 |
+
"http",
|
1191 |
+
"http client",
|
1192 |
+
"rest",
|
1193 |
+
"web service"
|
1194 |
+
],
|
1195 |
+
"time": "2019-12-23T11:57:10+00:00"
|
1196 |
+
},
|
1197 |
+
{
|
1198 |
+
"name": "guzzlehttp/promises",
|
1199 |
+
"version": "v1.3.1",
|
1200 |
+
"source": {
|
1201 |
+
"type": "git",
|
1202 |
+
"url": "https://github.com/guzzle/promises.git",
|
1203 |
+
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
|
1204 |
+
},
|
1205 |
+
"dist": {
|
1206 |
+
"type": "zip",
|
1207 |
+
"url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
|
1208 |
+
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
|
1209 |
+
"shasum": ""
|
1210 |
+
},
|
1211 |
+
"require": {
|
1212 |
+
"php": ">=5.5.0"
|
1213 |
+
},
|
1214 |
+
"require-dev": {
|
1215 |
+
"phpunit/phpunit": "^4.0"
|
1216 |
+
},
|
1217 |
+
"type": "library",
|
1218 |
+
"extra": {
|
1219 |
+
"branch-alias": {
|
1220 |
+
"dev-master": "1.4-dev"
|
1221 |
+
}
|
1222 |
+
},
|
1223 |
+
"autoload": {
|
1224 |
+
"psr-4": {
|
1225 |
+
"GuzzleHttp\\Promise\\": "src/"
|
1226 |
+
},
|
1227 |
+
"files": [
|
1228 |
+
"src/functions_include.php"
|
1229 |
+
]
|
1230 |
+
},
|
1231 |
+
"notification-url": "https://packagist.org/downloads/",
|
1232 |
+
"license": [
|
1233 |
+
"MIT"
|
1234 |
+
],
|
1235 |
+
"authors": [
|
1236 |
+
{
|
1237 |
+
"name": "Michael Dowling",
|
1238 |
+
"email": "mtdowling@gmail.com",
|
1239 |
+
"homepage": "https://github.com/mtdowling"
|
1240 |
+
}
|
1241 |
+
],
|
1242 |
+
"description": "Guzzle promises library",
|
1243 |
+
"keywords": [
|
1244 |
+
"promise"
|
1245 |
+
],
|
1246 |
+
"time": "2016-12-20T10:07:11+00:00"
|
1247 |
+
},
|
1248 |
+
{
|
1249 |
+
"name": "guzzlehttp/psr7",
|
1250 |
+
"version": "1.6.1",
|
1251 |
+
"source": {
|
1252 |
+
"type": "git",
|
1253 |
+
"url": "https://github.com/guzzle/psr7.git",
|
1254 |
+
"reference": "239400de7a173fe9901b9ac7c06497751f00727a"
|
1255 |
+
},
|
1256 |
+
"dist": {
|
1257 |
+
"type": "zip",
|
1258 |
+
"url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
|
1259 |
+
"reference": "239400de7a173fe9901b9ac7c06497751f00727a",
|
1260 |
+
"shasum": ""
|
1261 |
+
},
|
1262 |
+
"require": {
|
1263 |
+
"php": ">=5.4.0",
|
1264 |
+
"psr/http-message": "~1.0",
|
1265 |
+
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
|
1266 |
+
},
|
1267 |
+
"provide": {
|
1268 |
+
"psr/http-message-implementation": "1.0"
|
1269 |
+
},
|
1270 |
+
"require-dev": {
|
1271 |
+
"ext-zlib": "*",
|
1272 |
+
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
|
1273 |
+
},
|
1274 |
+
"suggest": {
|
1275 |
+
"zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
|
1276 |
+
},
|
1277 |
+
"type": "library",
|
1278 |
+
"extra": {
|
1279 |
+
"branch-alias": {
|
1280 |
+
"dev-master": "1.6-dev"
|
1281 |
+
}
|
1282 |
+
},
|
1283 |
+
"autoload": {
|
1284 |
+
"psr-4": {
|
1285 |
+
"GuzzleHttp\\Psr7\\": "src/"
|
1286 |
+
},
|
1287 |
+
"files": [
|
1288 |
+
"src/functions_include.php"
|
1289 |
+
]
|
1290 |
+
},
|
1291 |
+
"notification-url": "https://packagist.org/downloads/",
|
1292 |
+
"license": [
|
1293 |
+
"MIT"
|
1294 |
+
],
|
1295 |
+
"authors": [
|
1296 |
+
{
|
1297 |
+
"name": "Michael Dowling",
|
1298 |
+
"email": "mtdowling@gmail.com",
|
1299 |
+
"homepage": "https://github.com/mtdowling"
|
1300 |
+
},
|
1301 |
+
{
|
1302 |
+
"name": "Tobias Schultze",
|
1303 |
+
"homepage": "https://github.com/Tobion"
|
1304 |
+
}
|
1305 |
+
],
|
1306 |
+
"description": "PSR-7 message implementation that also provides common utility methods",
|
1307 |
+
"keywords": [
|
1308 |
+
"http",
|
1309 |
+
"message",
|
1310 |
+
"psr-7",
|
1311 |
+
"request",
|
1312 |
+
"response",
|
1313 |
+
"stream",
|
1314 |
+
"uri",
|
1315 |
+
"url"
|
1316 |
+
],
|
1317 |
+
"time": "2019-07-01T23:21:34+00:00"
|
1318 |
+
},
|
1319 |
+
{
|
1320 |
+
"name": "hautelook/phpass",
|
1321 |
+
"version": "0.3.5",
|
1322 |
+
"source": {
|
1323 |
+
"type": "git",
|
1324 |
+
"url": "https://github.com/hautelook/phpass.git",
|
1325 |
+
"reference": "b4cbd9b67ed3ef5672ec79d8e0c46d24bd844abd"
|
1326 |
+
},
|
1327 |
+
"dist": {
|
1328 |
+
"type": "zip",
|
1329 |
+
"url": "https://api.github.com/repos/hautelook/phpass/zipball/b4cbd9b67ed3ef5672ec79d8e0c46d24bd844abd",
|
1330 |
+
"reference": "b4cbd9b67ed3ef5672ec79d8e0c46d24bd844abd",
|
1331 |
+
"shasum": ""
|
1332 |
+
},
|
1333 |
+
"require": {
|
1334 |
+
"php": ">=5.3.3"
|
1335 |
+
},
|
1336 |
+
"type": "library",
|
1337 |
+
"autoload": {
|
1338 |
+
"psr-0": {
|
1339 |
+
"Hautelook": "src/"
|
1340 |
+
}
|
1341 |
+
},
|
1342 |
+
"notification-url": "https://packagist.org/downloads/",
|
1343 |
+
"license": [
|
1344 |
+
"Public Domain"
|
1345 |
+
],
|
1346 |
+
"authors": [
|
1347 |
+
{
|
1348 |
+
"name": "Solar Designer",
|
1349 |
+
"email": "solar@openwall.com",
|
1350 |
+
"homepage": "http://openwall.com/phpass/"
|
1351 |
+
}
|
1352 |
+
],
|
1353 |
+
"description": "Portable PHP password hashing framework",
|
1354 |
+
"homepage": "http://github.com/hautelook/phpass/",
|
1355 |
+
"keywords": [
|
1356 |
+
"blowfish",
|
1357 |
+
"crypt",
|
1358 |
+
"password",
|
1359 |
+
"security"
|
1360 |
+
],
|
1361 |
+
"time": "2012-08-31T00:00:00+00:00"
|
1362 |
+
},
|
1363 |
+
{
|
1364 |
+
"name": "hoa/consistency",
|
1365 |
+
"version": "1.17.05.02",
|
1366 |
+
"source": {
|
1367 |
+
"type": "git",
|
1368 |
+
"url": "https://github.com/hoaproject/Consistency.git",
|
1369 |
+
"reference": "fd7d0adc82410507f332516faf655b6ed22e4c2f"
|
1370 |
+
},
|
1371 |
+
"dist": {
|
1372 |
+
"type": "zip",
|
1373 |
+
"url": "https://api.github.com/repos/hoaproject/Consistency/zipball/fd7d0adc82410507f332516faf655b6ed22e4c2f",
|
1374 |
+
"reference": "fd7d0adc82410507f332516faf655b6ed22e4c2f",
|
1375 |
+
"shasum": ""
|
1376 |
+
},
|
1377 |
+
"require": {
|
1378 |
+
"hoa/exception": "~1.0",
|
1379 |
+
"php": ">=5.5.0"
|
1380 |
+
},
|
1381 |
+
"require-dev": {
|
1382 |
+
"hoa/stream": "~1.0",
|
1383 |
+
"hoa/test": "~2.0"
|
1384 |
+
},
|
1385 |
+
"type": "library",
|
1386 |
+
"extra": {
|
1387 |
+
"branch-alias": {
|
1388 |
+
"dev-master": "1.x-dev"
|
1389 |
+
}
|
1390 |
+
},
|
1391 |
+
"autoload": {
|
1392 |
+
"psr-4": {
|
1393 |
+
"Hoa\\Consistency\\": "."
|
1394 |
+
},
|
1395 |
+
"files": [
|
1396 |
+
"Prelude.php"
|
1397 |
+
]
|
1398 |
+
},
|
1399 |
+
"notification-url": "https://packagist.org/downloads/",
|
1400 |
+
"license": [
|
1401 |
+
"BSD-3-Clause"
|
1402 |
+
],
|
1403 |
+
"authors": [
|
1404 |
+
{
|
1405 |
+
"name": "Ivan Enderlin",
|
1406 |
+
"email": "ivan.enderlin@hoa-project.net"
|
1407 |
+
},
|
1408 |
+
{
|
1409 |
+
"name": "Hoa community",
|
1410 |
+
"homepage": "https://hoa-project.net/"
|
1411 |
+
}
|
1412 |
+
],
|
1413 |
+
"description": "The Hoa\\Consistency library.",
|
1414 |
+
"homepage": "https://hoa-project.net/",
|
1415 |
+
"keywords": [
|
1416 |
+
"autoloader",
|
1417 |
+
"callable",
|
1418 |
+
"consistency",
|
1419 |
+
"entity",
|
1420 |
+
"flex",
|
1421 |
+
"keyword",
|
1422 |
+
"library"
|
1423 |
+
],
|
1424 |
+
"time": "2017-05-02T12:18:12+00:00"
|
1425 |
+
},
|
1426 |
+
{
|
1427 |
+
"name": "hoa/console",
|
1428 |
+
"version": "3.17.05.02",
|
1429 |
+
"source": {
|
1430 |
+
"type": "git",
|
1431 |
+
"url": "https://github.com/hoaproject/Console.git",
|
1432 |
+
"reference": "e231fd3ea70e6d773576ae78de0bdc1daf331a66"
|
1433 |
+
},
|
1434 |
+
"dist": {
|
1435 |
+
"type": "zip",
|
1436 |
+
"url": "https://api.github.com/repos/hoaproject/Console/zipball/e231fd3ea70e6d773576ae78de0bdc1daf331a66",
|
1437 |
+
"reference": "e231fd3ea70e6d773576ae78de0bdc1daf331a66",
|
1438 |
+
"shasum": ""
|
1439 |
+
},
|
1440 |
+
"require": {
|
1441 |
+
"hoa/consistency": "~1.0",
|
1442 |
+
"hoa/event": "~1.0",
|
1443 |
+
"hoa/exception": "~1.0",
|
1444 |
+
"hoa/file": "~1.0",
|
1445 |
+
"hoa/protocol": "~1.0",
|
1446 |
+
"hoa/stream": "~1.0",
|
1447 |
+
"hoa/ustring": "~4.0"
|
1448 |
+
},
|
1449 |
+
"require-dev": {
|
1450 |
+
"hoa/test": "~2.0"
|
1451 |
+
},
|
1452 |
+
"suggest": {
|
1453 |
+
"ext-pcntl": "To enable hoa://Event/Console/Window:resize.",
|
1454 |
+
"hoa/dispatcher": "To use the console kit.",
|
1455 |
+
"hoa/router": "To use the console kit."
|
1456 |
+
},
|
1457 |
+
"type": "library",
|
1458 |
+
"extra": {
|
1459 |
+
"branch-alias": {
|
1460 |
+
"dev-master": "3.x-dev"
|
1461 |
+
}
|
1462 |
+
},
|
1463 |
+
"autoload": {
|
1464 |
+
"psr-4": {
|
1465 |
+
"Hoa\\Console\\": "."
|
1466 |
+
}
|
1467 |
+
},
|
1468 |
+
"notification-url": "https://packagist.org/downloads/",
|
1469 |
+
"license": [
|
1470 |
+
"BSD-3-Clause"
|
1471 |
+
],
|
1472 |
+
"authors": [
|
1473 |
+
{
|
1474 |
+
"name": "Ivan Enderlin",
|
1475 |
+
"email": "ivan.enderlin@hoa-project.net"
|
1476 |
+
},
|
1477 |
+
{
|
1478 |
+
"name": "Hoa community",
|
1479 |
+
"homepage": "https://hoa-project.net/"
|
1480 |
+
}
|
1481 |
+
],
|
1482 |
+
"description": "The Hoa\\Console library.",
|
1483 |
+
"homepage": "https://hoa-project.net/",
|
1484 |
+
"keywords": [
|
1485 |
+
"autocompletion",
|
1486 |
+
"chrome",
|
1487 |
+
"cli",
|
1488 |
+
"console",
|
1489 |
+
"cursor",
|
1490 |
+
"getoption",
|
1491 |
+
"library",
|
1492 |
+
"option",
|
1493 |
+
"parser",
|
1494 |
+
"processus",
|
1495 |
+
"readline",
|
1496 |
+
"terminfo",
|
1497 |
+
"tput",
|
1498 |
+
"window"
|
1499 |
+
],
|
1500 |
+
"time": "2017-05-02T12:26:19+00:00"
|
1501 |
+
},
|
1502 |
+
{
|
1503 |
+
"name": "hoa/event",
|
1504 |
+
"version": "1.17.01.13",
|
1505 |
+
"source": {
|
1506 |
+
"type": "git",
|
1507 |
+
"url": "https://github.com/hoaproject/Event.git",
|
1508 |
+
"reference": "6c0060dced212ffa3af0e34bb46624f990b29c54"
|
1509 |
+
},
|
1510 |
+
"dist": {
|
1511 |
+
"type": "zip",
|
1512 |
+
"url": "https://api.github.com/repos/hoaproject/Event/zipball/6c0060dced212ffa3af0e34bb46624f990b29c54",
|
1513 |
+
"reference": "6c0060dced212ffa3af0e34bb46624f990b29c54",
|
1514 |
+
"shasum": ""
|
1515 |
+
},
|
1516 |
+
"require": {
|
1517 |
+
"hoa/consistency": "~1.0",
|
1518 |
+
"hoa/exception": "~1.0"
|
1519 |
+
},
|
1520 |
+
"require-dev": {
|
1521 |
+
"hoa/test": "~2.0"
|
1522 |
+
},
|
1523 |
+
"type": "library",
|
1524 |
+
"extra": {
|
1525 |
+
"branch-alias": {
|
1526 |
+
"dev-master": "1.x-dev"
|
1527 |
+
}
|
1528 |
+
},
|
1529 |
+
"autoload": {
|
1530 |
+
"psr-4": {
|
1531 |
+
"Hoa\\Event\\": "."
|
1532 |
+
}
|
1533 |
+
},
|
1534 |
+
"notification-url": "https://packagist.org/downloads/",
|
1535 |
+
"license": [
|
1536 |
+
"BSD-3-Clause"
|
1537 |
+
],
|
1538 |
+
"authors": [
|
1539 |
+
{
|
1540 |
+
"name": "Ivan Enderlin",
|
1541 |
+
"email": "ivan.enderlin@hoa-project.net"
|
1542 |
+
},
|
1543 |
+
{
|
1544 |
+
"name": "Hoa community",
|
1545 |
+
"homepage": "https://hoa-project.net/"
|
1546 |
+
}
|
1547 |
+
],
|
1548 |
+
"description": "The Hoa\\Event library.",
|
1549 |
+
"homepage": "https://hoa-project.net/",
|
1550 |
+
"keywords": [
|
1551 |
+
"event",
|
1552 |
+
"library",
|
1553 |
+
"listener",
|
1554 |
+
"observer"
|
1555 |
+
],
|
1556 |
+
"time": "2017-01-13T15:30:50+00:00"
|
1557 |
+
},
|
1558 |
+
{
|
1559 |
+
"name": "hoa/exception",
|
1560 |
+
"version": "1.17.01.16",
|
1561 |
+
"source": {
|
1562 |
+
"type": "git",
|
1563 |
+
"url": "https://github.com/hoaproject/Exception.git",
|
1564 |
+
"reference": "091727d46420a3d7468ef0595651488bfc3a458f"
|
1565 |
+
},
|
1566 |
+
"dist": {
|
1567 |
+
"type": "zip",
|
1568 |
+
"url": "https://api.github.com/repos/hoaproject/Exception/zipball/091727d46420a3d7468ef0595651488bfc3a458f",
|
1569 |
+
"reference": "091727d46420a3d7468ef0595651488bfc3a458f",
|
1570 |
+
"shasum": ""
|
1571 |
+
},
|
1572 |
+
"require": {
|
1573 |
+
"hoa/consistency": "~1.0",
|
1574 |
+
"hoa/event": "~1.0"
|
1575 |
+
},
|
1576 |
+
"require-dev": {
|
1577 |
+
"hoa/test": "~2.0"
|
1578 |
+
},
|
1579 |
+
"type": "library",
|
1580 |
+
"extra": {
|
1581 |
+
"branch-alias": {
|
1582 |
+
"dev-master": "1.x-dev"
|
1583 |
+
}
|
1584 |
+
},
|
1585 |
+
"autoload": {
|
1586 |
+
"psr-4": {
|
1587 |
+
"Hoa\\Exception\\": "."
|
1588 |
+
}
|
1589 |
+
},
|
1590 |
+
"notification-url": "https://packagist.org/downloads/",
|
1591 |
+
"license": [
|
1592 |
+
"BSD-3-Clause"
|
1593 |
+
],
|
1594 |
+
"authors": [
|
1595 |
+
{
|
1596 |
+
"name": "Ivan Enderlin",
|
1597 |
+
"email": "ivan.enderlin@hoa-project.net"
|
1598 |
+
},
|
1599 |
+
{
|
1600 |
+
"name": "Hoa community",
|
1601 |
+
"homepage": "https://hoa-project.net/"
|
1602 |
+
}
|
1603 |
+
],
|
1604 |
+
"description": "The Hoa\\Exception library.",
|
1605 |
+
"homepage": "https://hoa-project.net/",
|
1606 |
+
"keywords": [
|
1607 |
+
"exception",
|
1608 |
+
"library"
|
1609 |
+
],
|
1610 |
+
"time": "2017-01-16T07:53:27+00:00"
|
1611 |
+
},
|
1612 |
+
{
|
1613 |
+
"name": "hoa/file",
|
1614 |
+
"version": "1.17.07.11",
|
1615 |
+
"source": {
|
1616 |
+
"type": "git",
|
1617 |
+
"url": "https://github.com/hoaproject/File.git",
|
1618 |
+
"reference": "35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca"
|
1619 |
+
},
|
1620 |
+
"dist": {
|
1621 |
+
"type": "zip",
|
1622 |
+
"url": "https://api.github.com/repos/hoaproject/File/zipball/35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca",
|
1623 |
+
"reference": "35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca",
|
1624 |
+
"shasum": ""
|
1625 |
+
},
|
1626 |
+
"require": {
|
1627 |
+
"hoa/consistency": "~1.0",
|
1628 |
+
"hoa/event": "~1.0",
|
1629 |
+
"hoa/exception": "~1.0",
|
1630 |
+
"hoa/iterator": "~2.0",
|
1631 |
+
"hoa/stream": "~1.0"
|
1632 |
+
},
|
1633 |
+
"require-dev": {
|
1634 |
+
"hoa/test": "~2.0"
|
1635 |
+
},
|
1636 |
+
"type": "library",
|
1637 |
+
"extra": {
|
1638 |
+
"branch-alias": {
|
1639 |
+
"dev-master": "1.x-dev"
|
1640 |
+
}
|
1641 |
+
},
|
1642 |
+
"autoload": {
|
1643 |
+
"psr-4": {
|
1644 |
+
"Hoa\\File\\": "."
|
1645 |
+
}
|
1646 |
+
},
|
1647 |
+
"notification-url": "https://packagist.org/downloads/",
|
1648 |
+
"license": [
|
1649 |
+
"BSD-3-Clause"
|
1650 |
+
],
|
1651 |
+
"authors": [
|
1652 |
+
{
|
1653 |
+
"name": "Ivan Enderlin",
|
1654 |
+
"email": "ivan.enderlin@hoa-project.net"
|
1655 |
+
},
|
1656 |
+
{
|
1657 |
+
"name": "Hoa community",
|
1658 |
+
"homepage": "https://hoa-project.net/"
|
1659 |
+
}
|
1660 |
+
],
|
1661 |
+
"description": "The Hoa\\File library.",
|
1662 |
+
"homepage": "https://hoa-project.net/",
|
1663 |
+
"keywords": [
|
1664 |
+
"Socket",
|
1665 |
+
"directory",
|
1666 |
+
"file",
|
1667 |
+
"finder",
|
1668 |
+
"library",
|
1669 |
+
"link",
|
1670 |
+
"temporary"
|
1671 |
+
],
|
1672 |
+
"time": "2017-07-11T07:42:15+00:00"
|
1673 |
+
},
|
1674 |
+
{
|
1675 |
+
"name": "hoa/iterator",
|
1676 |
+
"version": "2.17.01.10",
|
1677 |
+
"source": {
|
1678 |
+
"type": "git",
|
1679 |
+
"url": "https://github.com/hoaproject/Iterator.git",
|
1680 |
+
"reference": "d1120ba09cb4ccd049c86d10058ab94af245f0cc"
|
1681 |
+
},
|
1682 |
+
"dist": {
|
1683 |
+
"type": "zip",
|
1684 |
+
"url": "https://api.github.com/repos/hoaproject/Iterator/zipball/d1120ba09cb4ccd049c86d10058ab94af245f0cc",
|
1685 |
+
"reference": "d1120ba09cb4ccd049c86d10058ab94af245f0cc",
|
1686 |
+
"shasum": ""
|
1687 |
+
},
|
1688 |
+
"require": {
|
1689 |
+
"hoa/consistency": "~1.0",
|
1690 |
+
"hoa/exception": "~1.0"
|
1691 |
+
},
|
1692 |
+
"require-dev": {
|
1693 |
+
"hoa/test": "~2.0"
|
1694 |
+
},
|
1695 |
+
"type": "library",
|
1696 |
+
"extra": {
|
1697 |
+
"branch-alias": {
|
1698 |
+
"dev-master": "2.x-dev"
|
1699 |
+
}
|
1700 |
+
},
|
1701 |
+
"autoload": {
|
1702 |
+
"psr-4": {
|
1703 |
+
"Hoa\\Iterator\\": "."
|
1704 |
+
}
|
1705 |
+
},
|
1706 |
+
"notification-url": "https://packagist.org/downloads/",
|
1707 |
+
"license": [
|
1708 |
+
"BSD-3-Clause"
|
1709 |
+
],
|
1710 |
+
"authors": [
|
1711 |
+
{
|
1712 |
+
"name": "Ivan Enderlin",
|
1713 |
+
"email": "ivan.enderlin@hoa-project.net"
|
1714 |
+
},
|
1715 |
+
{
|
1716 |
+
"name": "Hoa community",
|
1717 |
+
"homepage": "https://hoa-project.net/"
|
1718 |
+
}
|
1719 |
+
],
|
1720 |
+
"description": "The Hoa\\Iterator library.",
|
1721 |
+
"homepage": "https://hoa-project.net/",
|
1722 |
+
"keywords": [
|
1723 |
+
"iterator",
|
1724 |
+
"library"
|
1725 |
+
],
|
1726 |
+
"time": "2017-01-10T10:34:47+00:00"
|
1727 |
+
},
|
1728 |
+
{
|
1729 |
+
"name": "hoa/protocol",
|
1730 |
+
"version": "1.17.01.14",
|
1731 |
+
"source": {
|
1732 |
+
"type": "git",
|
1733 |
+
"url": "https://github.com/hoaproject/Protocol.git",
|
1734 |
+
"reference": "5c2cf972151c45f373230da170ea015deecf19e2"
|
1735 |
+
},
|
1736 |
+
"dist": {
|
1737 |
+
"type": "zip",
|
1738 |
+
"url": "https://api.github.com/repos/hoaproject/Protocol/zipball/5c2cf972151c45f373230da170ea015deecf19e2",
|
1739 |
+
"reference": "5c2cf972151c45f373230da170ea015deecf19e2",
|
1740 |
+
"shasum": ""
|
1741 |
+
},
|
1742 |
+
"require": {
|
1743 |
+
"hoa/consistency": "~1.0",
|
1744 |
+
"hoa/exception": "~1.0"
|
1745 |
+
},
|
1746 |
+
"require-dev": {
|
1747 |
+
"hoa/test": "~2.0"
|
1748 |
+
},
|
1749 |
+
"type": "library",
|
1750 |
+
"extra": {
|
1751 |
+
"branch-alias": {
|
1752 |
+
"dev-master": "1.x-dev"
|
1753 |
+
}
|
1754 |
+
},
|
1755 |
+
"autoload": {
|
1756 |
+
"psr-4": {
|
1757 |
+
"Hoa\\Protocol\\": "."
|
1758 |
+
},
|
1759 |
+
"files": [
|
1760 |
+
"Wrapper.php"
|
1761 |
+
]
|
1762 |
+
},
|
1763 |
+
"notification-url": "https://packagist.org/downloads/",
|
1764 |
+
"license": [
|
1765 |
+
"BSD-3-Clause"
|
1766 |
+
],
|
1767 |
+
"authors": [
|
1768 |
+
{
|
1769 |
+
"name": "Ivan Enderlin",
|
1770 |
+
"email": "ivan.enderlin@hoa-project.net"
|
1771 |
+
},
|
1772 |
+
{
|
1773 |
+
"name": "Hoa community",
|
1774 |
+
"homepage": "https://hoa-project.net/"
|
1775 |
+
}
|
1776 |
+
],
|
1777 |
+
"description": "The Hoa\\Protocol library.",
|
1778 |
+
"homepage": "https://hoa-project.net/",
|
1779 |
+
"keywords": [
|
1780 |
+
"library",
|
1781 |
+
"protocol",
|
1782 |
+
"resource",
|
1783 |
+
"stream",
|
1784 |
+
"wrapper"
|
1785 |
+
],
|
1786 |
+
"time": "2017-01-14T12:26:10+00:00"
|
1787 |
+
},
|
1788 |
+
{
|
1789 |
+
"name": "hoa/stream",
|
1790 |
+
"version": "1.17.02.21",
|
1791 |
+
"source": {
|
1792 |
+
"type": "git",
|
1793 |
+
"url": "https://github.com/hoaproject/Stream.git",
|
1794 |
+
"reference": "3293cfffca2de10525df51436adf88a559151d82"
|
1795 |
+
},
|
1796 |
+
"dist": {
|
1797 |
+
"type": "zip",
|
1798 |
+
"url": "https://api.github.com/repos/hoaproject/Stream/zipball/3293cfffca2de10525df51436adf88a559151d82",
|
1799 |
+
"reference": "3293cfffca2de10525df51436adf88a559151d82",
|
1800 |
+
"shasum": ""
|
1801 |
+
},
|
1802 |
+
"require": {
|
1803 |
+
"hoa/consistency": "~1.0",
|
1804 |
+
"hoa/event": "~1.0",
|
1805 |
+
"hoa/exception": "~1.0",
|
1806 |
+
"hoa/protocol": "~1.0"
|
1807 |
+
},
|
1808 |
+
"require-dev": {
|
1809 |
+
"hoa/test": "~2.0"
|
1810 |
+
},
|
1811 |
+
"type": "library",
|
1812 |
+
"extra": {
|
1813 |
+
"branch-alias": {
|
1814 |
+
"dev-master": "1.x-dev"
|
1815 |
+
}
|
1816 |
+
},
|
1817 |
+
"autoload": {
|
1818 |
+
"psr-4": {
|
1819 |
+
"Hoa\\Stream\\": "."
|
1820 |
+
}
|
1821 |
+
},
|
1822 |
+
"notification-url": "https://packagist.org/downloads/",
|
1823 |
+
"license": [
|
1824 |
+
"BSD-3-Clause"
|
1825 |
+
],
|
1826 |
+
"authors": [
|
1827 |
+
{
|
1828 |
+
"name": "Ivan Enderlin",
|
1829 |
+
"email": "ivan.enderlin@hoa-project.net"
|
1830 |
+
},
|
1831 |
+
{
|
1832 |
+
"name": "Hoa community",
|
1833 |
+
"homepage": "https://hoa-project.net/"
|
1834 |
+
}
|
1835 |
+
],
|
1836 |
+
"description": "The Hoa\\Stream library.",
|
1837 |
+
"homepage": "https://hoa-project.net/",
|
1838 |
+
"keywords": [
|
1839 |
+
"Context",
|
1840 |
+
"bucket",
|
1841 |
+
"composite",
|
1842 |
+
"filter",
|
1843 |
+
"in",
|
1844 |
+
"library",
|
1845 |
+
"out",
|
1846 |
+
"protocol",
|
1847 |
+
"stream",
|
1848 |
+
"wrapper"
|
1849 |
+
],
|
1850 |
+
"time": "2017-02-21T16:01:06+00:00"
|
1851 |
+
},
|
1852 |
+
{
|
1853 |
+
"name": "hoa/ustring",
|
1854 |
+
"version": "4.17.01.16",
|
1855 |
+
"source": {
|
1856 |
+
"type": "git",
|
1857 |
+
"url": "https://github.com/hoaproject/Ustring.git",
|
1858 |
+
"reference": "e6326e2739178799b1fe3fdd92029f9517fa17a0"
|
1859 |
+
},
|
1860 |
+
"dist": {
|
1861 |
+
"type": "zip",
|
1862 |
+
"url": "https://api.github.com/repos/hoaproject/Ustring/zipball/e6326e2739178799b1fe3fdd92029f9517fa17a0",
|
1863 |
+
"reference": "e6326e2739178799b1fe3fdd92029f9517fa17a0",
|
1864 |
+
"shasum": ""
|
1865 |
+
},
|
1866 |
+
"require": {
|
1867 |
+
"hoa/consistency": "~1.0",
|
1868 |
+
"hoa/exception": "~1.0"
|
1869 |
+
},
|
1870 |
+
"require-dev": {
|
1871 |
+
"hoa/test": "~2.0"
|
1872 |
+
},
|
1873 |
+
"suggest": {
|
1874 |
+
"ext-iconv": "ext/iconv must be present (or a third implementation) to use Hoa\\Ustring::transcode().",
|
1875 |
+
"ext-intl": "To get a better Hoa\\Ustring::toAscii() and Hoa\\Ustring::compareTo()."
|
1876 |
+
},
|
1877 |
+
"type": "library",
|
1878 |
+
"extra": {
|
1879 |
+
"branch-alias": {
|
1880 |
+
"dev-master": "4.x-dev"
|
1881 |
+
}
|
1882 |
+
},
|
1883 |
+
"autoload": {
|
1884 |
+
"psr-4": {
|
1885 |
+
"Hoa\\Ustring\\": "."
|
1886 |
+
}
|
1887 |
+
},
|
1888 |
+
"notification-url": "https://packagist.org/downloads/",
|
1889 |
+
"license": [
|
1890 |
+
"BSD-3-Clause"
|
1891 |
+
],
|
1892 |
+
"authors": [
|
1893 |
+
{
|
1894 |
+
"name": "Ivan Enderlin",
|
1895 |
+
"email": "ivan.enderlin@hoa-project.net"
|
1896 |
+
},
|
1897 |
+
{
|
1898 |
+
"name": "Hoa community",
|
1899 |
+
"homepage": "https://hoa-project.net/"
|
1900 |
+
}
|
1901 |
+
],
|
1902 |
+
"description": "The Hoa\\Ustring library.",
|
1903 |
+
"homepage": "https://hoa-project.net/",
|
1904 |
+
"keywords": [
|
1905 |
+
"library",
|
1906 |
+
"search",
|
1907 |
+
"string",
|
1908 |
+
"unicode"
|
1909 |
+
],
|
1910 |
+
"time": "2017-01-16T07:08:25+00:00"
|
1911 |
+
},
|
1912 |
+
{
|
1913 |
+
"name": "illuminate/contracts",
|
1914 |
+
"version": "v7.1.1",
|
1915 |
+
"source": {
|
1916 |
+
"type": "git",
|
1917 |
+
"url": "https://github.com/illuminate/contracts.git",
|
1918 |
+
"reference": "10eb9fd5014e80296d254ae38ff1afe52d515a66"
|
1919 |
+
},
|
1920 |
+
"dist": {
|
1921 |
+
"type": "zip",
|
1922 |
+
"url": "https://api.github.com/repos/illuminate/contracts/zipball/10eb9fd5014e80296d254ae38ff1afe52d515a66",
|
1923 |
+
"reference": "10eb9fd5014e80296d254ae38ff1afe52d515a66",
|
1924 |
+
"shasum": ""
|
1925 |
+
},
|
1926 |
+
"require": {
|
1927 |
+
"php": "^7.2.5",
|
1928 |
+
"psr/container": "^1.0",
|
1929 |
+
"psr/simple-cache": "^1.0"
|
1930 |
+
},
|
1931 |
+
"type": "library",
|
1932 |
+
"extra": {
|
1933 |
+
"branch-alias": {
|
1934 |
+
"dev-master": "7.x-dev"
|
1935 |
+
}
|
1936 |
+
},
|
1937 |
+
"autoload": {
|
1938 |
+
"psr-4": {
|
1939 |
+
"Illuminate\\Contracts\\": ""
|
1940 |
+
}
|
1941 |
+
},
|
1942 |
+
"notification-url": "https://packagist.org/downloads/",
|
1943 |
+
"license": [
|
1944 |
+
"MIT"
|
1945 |
+
],
|
1946 |
+
"authors": [
|
1947 |
+
{
|
1948 |
+
"name": "Taylor Otwell",
|
1949 |
+
"email": "taylor@laravel.com"
|
1950 |
+
}
|
1951 |
+
],
|
1952 |
+
"description": "The Illuminate Contracts package.",
|
1953 |
+
"homepage": "https://laravel.com",
|
1954 |
+
"time": "2020-03-09T13:23:43+00:00"
|
1955 |
+
},
|
1956 |
+
{
|
1957 |
+
"name": "illuminate/support",
|
1958 |
+
"version": "v7.1.1",
|
1959 |
+
"source": {
|
1960 |
+
"type": "git",
|
1961 |
+
"url": "https://github.com/illuminate/support.git",
|
1962 |
+
"reference": "ca1af56ffbac9361da042e6ee0ad4ebcbbbae515"
|
1963 |
+
},
|
1964 |
+
"dist": {
|
1965 |
+
"type": "zip",
|
1966 |
+
"url": "https://api.github.com/repos/illuminate/support/zipball/ca1af56ffbac9361da042e6ee0ad4ebcbbbae515",
|
1967 |
+
"reference": "ca1af56ffbac9361da042e6ee0ad4ebcbbbae515",
|
1968 |
+
"shasum": ""
|
1969 |
+
},
|
1970 |
+
"require": {
|
1971 |
+
"doctrine/inflector": "^1.1",
|
1972 |
+
"ext-json": "*",
|
1973 |
+
"ext-mbstring": "*",
|
1974 |
+
"illuminate/contracts": "^7.0",
|
1975 |
+
"nesbot/carbon": "^2.17",
|
1976 |
+
"php": "^7.2.5",
|
1977 |
+
"voku/portable-ascii": "^1.4.8"
|
1978 |
+
},
|
1979 |
+
"conflict": {
|
1980 |
+
"tightenco/collect": "<5.5.33"
|
1981 |
+
},
|
1982 |
+
"suggest": {
|
1983 |
+
"illuminate/filesystem": "Required to use the composer class (^7.0).",
|
1984 |
+
"moontoast/math": "Required to use ordered UUIDs (^1.1).",
|
1985 |
+
"ramsey/uuid": "Required to use Str::uuid() (^3.7).",
|
1986 |
+
"symfony/process": "Required to use the composer class (^5.0).",
|
1987 |
+
"symfony/var-dumper": "Required to use the dd function (^5.0).",
|
1988 |
+
"vlucas/phpdotenv": "Required to use the Env class and env helper (^4.0)."
|
1989 |
+
},
|
1990 |
+
"type": "library",
|
1991 |
+
"extra": {
|
1992 |
+
"branch-alias": {
|
1993 |
+
"dev-master": "7.x-dev"
|
1994 |
+
}
|
1995 |
+
},
|
1996 |
+
"autoload": {
|
1997 |
+
"psr-4": {
|
1998 |
+
"Illuminate\\Support\\": ""
|
1999 |
+
},
|
2000 |
+
"files": [
|
2001 |
+
"helpers.php"
|
2002 |
+
]
|
2003 |
+
},
|
2004 |
+
"notification-url": "https://packagist.org/downloads/",
|
2005 |
+
"license": [
|
2006 |
+
"MIT"
|
2007 |
+
],
|
2008 |
+
"authors": [
|
2009 |
+
{
|
2010 |
+
"name": "Taylor Otwell",
|
2011 |
+
"email": "taylor@laravel.com"
|
2012 |
+
}
|
2013 |
+
],
|
2014 |
+
"description": "The Illuminate Support package.",
|
2015 |
+
"homepage": "https://laravel.com",
|
2016 |
+
"time": "2020-03-12T12:48:26+00:00"
|
2017 |
+
},
|
2018 |
+
{
|
2019 |
+
"name": "justinrainbow/json-schema",
|
2020 |
+
"version": "5.2.9",
|
2021 |
+
"source": {
|
2022 |
+
"type": "git",
|
2023 |
+
"url": "https://github.com/justinrainbow/json-schema.git",
|
2024 |
+
"reference": "44c6787311242a979fa15c704327c20e7221a0e4"
|
2025 |
+
},
|
2026 |
+
"dist": {
|
2027 |
+
"type": "zip",
|
2028 |
+
"url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4",
|
2029 |
+
"reference": "44c6787311242a979fa15c704327c20e7221a0e4",
|
2030 |
+
"shasum": ""
|
2031 |
+
},
|
2032 |
+
"require": {
|
2033 |
+
"php": ">=5.3.3"
|
2034 |
+
},
|
2035 |
+
"require-dev": {
|
2036 |
+
"friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
|
2037 |
+
"json-schema/json-schema-test-suite": "1.2.0",
|
2038 |
+
"phpunit/phpunit": "^4.8.35"
|
2039 |
+
},
|
2040 |
+
"bin": [
|
2041 |
+
"bin/validate-json"
|
2042 |
+
],
|
2043 |
+
"type": "library",
|
2044 |
+
"extra": {
|
2045 |
+
"branch-alias": {
|
2046 |
+
"dev-master": "5.0.x-dev"
|
2047 |
+
}
|
2048 |
+
},
|
2049 |
+
"autoload": {
|
2050 |
+
"psr-4": {
|
2051 |
+
"JsonSchema\\": "src/JsonSchema/"
|
2052 |
+
}
|
2053 |
+
},
|
2054 |
+
"notification-url": "https://packagist.org/downloads/",
|
2055 |
+
"license": [
|
2056 |
+
"MIT"
|
2057 |
+
],
|
2058 |
+
"authors": [
|
2059 |
+
{
|
2060 |
+
"name": "Bruno Prieto Reis",
|
2061 |
+
"email": "bruno.p.reis@gmail.com"
|
2062 |
+
},
|
2063 |
+
{
|
2064 |
+
"name": "Justin Rainbow",
|
2065 |
+
"email": "justin.rainbow@gmail.com"
|
2066 |
+
},
|
2067 |
+
{
|
2068 |
+
"name": "Igor Wiedler",
|
2069 |
+
"email": "igor@wiedler.ch"
|
2070 |
+
},
|
2071 |
+
{
|
2072 |
+
"name": "Robert Schönthal",
|
2073 |
+
"email": "seroscho@googlemail.com"
|
2074 |
+
}
|
2075 |
+
],
|
2076 |
+
"description": "A library to validate a json schema.",
|
2077 |
+
"homepage": "https://github.com/justinrainbow/json-schema",
|
2078 |
+
"keywords": [
|
2079 |
+
"json",
|
2080 |
+
"schema"
|
2081 |
+
],
|
2082 |
+
"time": "2019-09-25T14:49:45+00:00"
|
2083 |
+
},
|
2084 |
+
{
|
2085 |
+
"name": "lucatume/wp-browser",
|
2086 |
+
"version": "2.2.37",
|
2087 |
+
"source": {
|
2088 |
+
"type": "git",
|
2089 |
+
"url": "https://github.com/lucatume/wp-browser.git",
|
2090 |
+
"reference": "8c4b6428f220dd159df0855f06c75957a6c5859b"
|
2091 |
+
},
|
2092 |
+
"dist": {
|
2093 |
+
"type": "zip",
|
2094 |
+
"url": "https://api.github.com/repos/lucatume/wp-browser/zipball/8c4b6428f220dd159df0855f06c75957a6c5859b",
|
2095 |
+
"reference": "8c4b6428f220dd159df0855f06c75957a6c5859b",
|
2096 |
+
"shasum": ""
|
2097 |
+
},
|
2098 |
+
"require": {
|
2099 |
+
"antecedent/patchwork": "^2.0",
|
2100 |
+
"codeception/codeception": "^2.5 || ^3.0",
|
2101 |
+
"dg/mysql-dump": "^1.3",
|
2102 |
+
"ext-fileinfo": "*",
|
2103 |
+
"ext-iconv": "*",
|
2104 |
+
"ext-json": "*",
|
2105 |
+
"ext-pdo": "*",
|
2106 |
+
"gumlet/php-image-resize": "^1.6",
|
2107 |
+
"mikemclin/laravel-wp-password": "~2.0.0",
|
2108 |
+
"php": ">=5.6.0",
|
2109 |
+
"symfony/filesystem": "^3.0",
|
2110 |
+
"symfony/process": ">=2.7 <5.0",
|
2111 |
+
"vlucas/phpdotenv": "^3.0",
|
2112 |
+
"vria/nodiacritic": "^0.1.2",
|
2113 |
+
"wp-cli/wp-cli-bundle": ">=2.0 <3.0.0",
|
2114 |
+
"zordius/lightncandy": "^1.2"
|
2115 |
+
},
|
2116 |
+
"require-dev": {
|
2117 |
+
"erusev/parsedown": "^1.7",
|
2118 |
+
"lucatume/codeception-snapshot-assertions": "^0.2",
|
2119 |
+
"mikey179/vfsstream": "^1.6",
|
2120 |
+
"phpstan/phpstan": "^0.11.15",
|
2121 |
+
"phpstan/phpstan-shim": "^0.11.15",
|
2122 |
+
"squizlabs/php_codesniffer": "^3.4",
|
2123 |
+
"szepeviktor/phpstan-wordpress": "^0.2.0",
|
2124 |
+
"victorjonsson/markdowndocs": "dev-master"
|
2125 |
+
},
|
2126 |
+
"type": "library",
|
2127 |
+
"autoload": {
|
2128 |
+
"psr-4": {
|
2129 |
+
"Codeception\\": "src/Codeception",
|
2130 |
+
"tad\\": "src/tad"
|
2131 |
+
},
|
2132 |
+
"files": [
|
2133 |
+
"src/tad/WPBrowser/functions.php",
|
2134 |
+
"src/tad/WPBrowser/utils.php",
|
2135 |
+
"src/tad/WPBrowser/wp-polyfills.php"
|
2136 |
+
]
|
2137 |
+
},
|
2138 |
+
"notification-url": "https://packagist.org/downloads/",
|
2139 |
+
"license": [
|
2140 |
+
"MIT"
|
2141 |
+
],
|
2142 |
+
"authors": [
|
2143 |
+
{
|
2144 |
+
"name": "theAverageDev (Luca Tumedei)",
|
2145 |
+
"email": "luca@theaveragedev.com",
|
2146 |
+
"homepage": "http://theaveragedev.com",
|
2147 |
+
"role": "Developer"
|
2148 |
+
}
|
2149 |
+
],
|
2150 |
+
"description": "WordPress extension of the PhpBrowser class.",
|
2151 |
+
"homepage": "http://github.com/lucatume/wp-browser",
|
2152 |
+
"keywords": [
|
2153 |
+
"codeception",
|
2154 |
+
"wordpress"
|
2155 |
+
],
|
2156 |
+
"time": "2020-02-21T13:28:14+00:00"
|
2157 |
+
},
|
2158 |
+
{
|
2159 |
+
"name": "mck89/peast",
|
2160 |
+
"version": "v1.10.1",
|
2161 |
+
"source": {
|
2162 |
+
"type": "git",
|
2163 |
+
"url": "https://github.com/mck89/peast.git",
|
2164 |
+
"reference": "461fbe96212ac1b511f527fd11b942e976429398"
|
2165 |
+
},
|
2166 |
+
"dist": {
|
2167 |
+
"type": "zip",
|
2168 |
+
"url": "https://api.github.com/repos/mck89/peast/zipball/461fbe96212ac1b511f527fd11b942e976429398",
|
2169 |
+
"reference": "461fbe96212ac1b511f527fd11b942e976429398",
|
2170 |
+
"shasum": ""
|
2171 |
+
},
|
2172 |
+
"require": {
|
2173 |
+
"php": ">=5.4.0"
|
2174 |
+
},
|
2175 |
+
"require-dev": {
|
2176 |
+
"phpunit/phpunit": "^4.0|^5.0"
|
2177 |
+
},
|
2178 |
+
"type": "library",
|
2179 |
+
"extra": {
|
2180 |
+
"branch-alias": {
|
2181 |
+
"dev-master": "1.10.1-dev"
|
2182 |
+
}
|
2183 |
+
},
|
2184 |
+
"autoload": {
|
2185 |
+
"psr-4": {
|
2186 |
+
"Peast\\": "lib/Peast/",
|
2187 |
+
"Peast\\test\\": "test/Peast/"
|
2188 |
+
}
|
2189 |
+
},
|
2190 |
+
"notification-url": "https://packagist.org/downloads/",
|
2191 |
+
"license": [
|
2192 |
+
"MIT"
|
2193 |
+
],
|
2194 |
+
"authors": [
|
2195 |
+
{
|
2196 |
+
"name": "Marco Marchiò",
|
2197 |
+
"email": "marco.mm89@gmail.com"
|
2198 |
+
}
|
2199 |
+
],
|
2200 |
+
"description": "Peast is PHP library that generates AST for JavaScript code",
|
2201 |
+
"time": "2019-12-22T16:46:42+00:00"
|
2202 |
+
},
|
2203 |
+
{
|
2204 |
+
"name": "mikemclin/laravel-wp-password",
|
2205 |
+
"version": "2.0.1",
|
2206 |
+
"source": {
|
2207 |
+
"type": "git",
|
2208 |
+
"url": "https://github.com/mikemclin/laravel-wp-password.git",
|
2209 |
+
"reference": "84ff1113ff6866cdb0350c176dc3c843383e4819"
|
2210 |
+
},
|
2211 |
+
"dist": {
|
2212 |
+
"type": "zip",
|
2213 |
+
"url": "https://api.github.com/repos/mikemclin/laravel-wp-password/zipball/84ff1113ff6866cdb0350c176dc3c843383e4819",
|
2214 |
+
"reference": "84ff1113ff6866cdb0350c176dc3c843383e4819",
|
2215 |
+
"shasum": ""
|
2216 |
+
},
|
2217 |
+
"require": {
|
2218 |
+
"hautelook/phpass": "0.3.*",
|
2219 |
+
"illuminate/support": ">=4.0.0",
|
2220 |
+
"php": ">=5.3.0"
|
2221 |
+
},
|
2222 |
+
"replace": {
|
2223 |
+
"mikemclin/laravel-wp-password": "self.version"
|
2224 |
+
},
|
2225 |
+
"require-dev": {
|
2226 |
+
"mockery/mockery": "~0.9",
|
2227 |
+
"phpunit/phpunit": "~4.0",
|
2228 |
+
"satooshi/php-coveralls": "dev-master"
|
2229 |
+
},
|
2230 |
+
"type": "laravel-package",
|
2231 |
+
"extra": {
|
2232 |
+
"laravel": {
|
2233 |
+
"providers": [
|
2234 |
+
"MikeMcLin\\WpPassword\\WpPasswordProvider"
|
2235 |
+
],
|
2236 |
+
"aliases": {
|
2237 |
+
"WpPassword": "MikeMcLin\\WpPassword\\Facades\\WpPassword"
|
2238 |
+
}
|
2239 |
+
}
|
2240 |
+
},
|
2241 |
+
"autoload": {
|
2242 |
+
"psr-4": {
|
2243 |
+
"MikeMcLin\\WpPassword\\": "src/"
|
2244 |
+
}
|
2245 |
+
},
|
2246 |
+
"notification-url": "https://packagist.org/downloads/",
|
2247 |
+
"license": [
|
2248 |
+
"MIT"
|
2249 |
+
],
|
2250 |
+
"authors": [
|
2251 |
+
{
|
2252 |
+
"name": "Mike McLin",
|
2253 |
+
"email": "mike@mikemclin.com",
|
2254 |
+
"homepage": "http://mikemclin.net"
|
2255 |
+
}
|
2256 |
+
],
|
2257 |
+
"description": "Laravel package that checks and creates WordPress password hashes",
|
2258 |
+
"homepage": "https://github.com/mikemclin/laravel-wp-password",
|
2259 |
+
"keywords": [
|
2260 |
+
"hashing",
|
2261 |
+
"laravel",
|
2262 |
+
"password",
|
2263 |
+
"wordpress"
|
2264 |
+
],
|
2265 |
+
"time": "2018-01-11T14:12:02+00:00"
|
2266 |
+
},
|
2267 |
+
{
|
2268 |
+
"name": "mustache/mustache",
|
2269 |
+
"version": "v2.13.0",
|
2270 |
+
"source": {
|
2271 |
+
"type": "git",
|
2272 |
+
"url": "https://github.com/bobthecow/mustache.php.git",
|
2273 |
+
"reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4"
|
2274 |
+
},
|
2275 |
+
"dist": {
|
2276 |
+
"type": "zip",
|
2277 |
+
"url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e95c5a008c23d3151d59ea72484d4f72049ab7f4",
|
2278 |
+
"reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4",
|
2279 |
+
"shasum": ""
|
2280 |
+
},
|
2281 |
+
"require": {
|
2282 |
+
"php": ">=5.2.4"
|
2283 |
+
},
|
2284 |
+
"require-dev": {
|
2285 |
+
"friendsofphp/php-cs-fixer": "~1.11",
|
2286 |
+
"phpunit/phpunit": "~3.7|~4.0|~5.0"
|
2287 |
+
},
|
2288 |
+
"type": "library",
|
2289 |
+
"autoload": {
|
2290 |
+
"psr-0": {
|
2291 |
+
"Mustache": "src/"
|
2292 |
+
}
|
2293 |
+
},
|
2294 |
+
"notification-url": "https://packagist.org/downloads/",
|
2295 |
+
"license": [
|
2296 |
+
"MIT"
|
2297 |
+
],
|
2298 |
+
"authors": [
|
2299 |
+
{
|
2300 |
+
"name": "Justin Hileman",
|
2301 |
+
"email": "justin@justinhileman.info",
|
2302 |
+
"homepage": "http://justinhileman.com"
|
2303 |
+
}
|
2304 |
+
],
|
2305 |
+
"description": "A Mustache implementation in PHP.",
|
2306 |
+
"homepage": "https://github.com/bobthecow/mustache.php",
|
2307 |
+
"keywords": [
|
2308 |
+
"mustache",
|
2309 |
+
"templating"
|
2310 |
+
],
|
2311 |
+
"time": "2019-11-23T21:40:31+00:00"
|
2312 |
+
},
|
2313 |
+
{
|
2314 |
+
"name": "myclabs/deep-copy",
|
2315 |
+
"version": "1.9.5",
|
2316 |
+
"source": {
|
2317 |
+
"type": "git",
|
2318 |
+
"url": "https://github.com/myclabs/DeepCopy.git",
|
2319 |
+
"reference": "b2c28789e80a97badd14145fda39b545d83ca3ef"
|
2320 |
+
},
|
2321 |
+
"dist": {
|
2322 |
+
"type": "zip",
|
2323 |
+
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef",
|
2324 |
+
"reference": "b2c28789e80a97badd14145fda39b545d83ca3ef",
|
2325 |
+
"shasum": ""
|
2326 |
+
},
|
2327 |
+
"require": {
|
2328 |
+
"php": "^7.1"
|
2329 |
+
},
|
2330 |
+
"replace": {
|
2331 |
+
"myclabs/deep-copy": "self.version"
|
2332 |
+
},
|
2333 |
+
"require-dev": {
|
2334 |
+
"doctrine/collections": "^1.0",
|
2335 |
+
"doctrine/common": "^2.6",
|
2336 |
+
"phpunit/phpunit": "^7.1"
|
2337 |
+
},
|
2338 |
+
"type": "library",
|
2339 |
+
"autoload": {
|
2340 |
+
"psr-4": {
|
2341 |
+
"DeepCopy\\": "src/DeepCopy/"
|
2342 |
+
},
|
2343 |
+
"files": [
|
2344 |
+
"src/DeepCopy/deep_copy.php"
|
2345 |
+
]
|
2346 |
+
},
|
2347 |
+
"notification-url": "https://packagist.org/downloads/",
|
2348 |
+
"license": [
|
2349 |
+
"MIT"
|
2350 |
+
],
|
2351 |
+
"description": "Create deep copies (clones) of your objects",
|
2352 |
+
"keywords": [
|
2353 |
+
"clone",
|
2354 |
+
"copy",
|
2355 |
+
"duplicate",
|
2356 |
+
"object",
|
2357 |
+
"object graph"
|
2358 |
+
],
|
2359 |
+
"time": "2020-01-17T21:11:47+00:00"
|
2360 |
+
},
|
2361 |
+
{
|
2362 |
+
"name": "nb/oxymel",
|
2363 |
+
"version": "v0.1.0",
|
2364 |
+
"source": {
|
2365 |
+
"type": "git",
|
2366 |
+
"url": "https://github.com/nb/oxymel.git",
|
2367 |
+
"reference": "cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c"
|
2368 |
+
},
|
2369 |
+
"dist": {
|
2370 |
+
"type": "zip",
|
2371 |
+
"url": "https://api.github.com/repos/nb/oxymel/zipball/cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c",
|
2372 |
+
"reference": "cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c",
|
2373 |
+
"shasum": ""
|
2374 |
+
},
|
2375 |
+
"require": {
|
2376 |
+
"php": ">=5.2.4"
|
2377 |
+
},
|
2378 |
+
"type": "library",
|
2379 |
+
"autoload": {
|
2380 |
+
"psr-0": {
|
2381 |
+
"Oxymel": ""
|
2382 |
+
}
|
2383 |
+
},
|
2384 |
+
"notification-url": "https://packagist.org/downloads/",
|
2385 |
+
"license": [
|
2386 |
+
"MIT"
|
2387 |
+
],
|
2388 |
+
"authors": [
|
2389 |
+
{
|
2390 |
+
"name": "Nikolay Bachiyski",
|
2391 |
+
"email": "nb@nikolay.bg",
|
2392 |
+
"homepage": "http://extrapolate.me/"
|
2393 |
+
}
|
2394 |
+
],
|
2395 |
+
"description": "A sweet XML builder",
|
2396 |
+
"homepage": "https://github.com/nb/oxymel",
|
2397 |
+
"keywords": [
|
2398 |
+
"xml"
|
2399 |
+
],
|
2400 |
+
"time": "2013-02-24T15:01:54+00:00"
|
2401 |
+
},
|
2402 |
+
{
|
2403 |
+
"name": "nesbot/carbon",
|
2404 |
+
"version": "2.31.0",
|
2405 |
+
"source": {
|
2406 |
+
"type": "git",
|
2407 |
+
"url": "https://github.com/briannesbitt/Carbon.git",
|
2408 |
+
"reference": "bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d"
|
2409 |
+
},
|
2410 |
+
"dist": {
|
2411 |
+
"type": "zip",
|
2412 |
+
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d",
|
2413 |
+
"reference": "bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d",
|
2414 |
+
"shasum": ""
|
2415 |
+
},
|
2416 |
+
"require": {
|
2417 |
+
"ext-json": "*",
|
2418 |
+
"php": "^7.1.8 || ^8.0",
|
2419 |
+
"symfony/translation": "^3.4 || ^4.0 || ^5.0"
|
2420 |
+
},
|
2421 |
+
"require-dev": {
|
2422 |
+
"friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
|
2423 |
+
"kylekatarnls/multi-tester": "^1.1",
|
2424 |
+
"phpmd/phpmd": "^2.8",
|
2425 |
+
"phpstan/phpstan": "^0.11",
|
2426 |
+
"phpunit/phpunit": "^7.5 || ^8.0",
|
2427 |
+
"squizlabs/php_codesniffer": "^3.4"
|
2428 |
+
},
|
2429 |
+
"bin": [
|
2430 |
+
"bin/carbon"
|
2431 |
+
],
|
2432 |
+
"type": "library",
|
2433 |
+
"extra": {
|
2434 |
+
"branch-alias": {
|
2435 |
+
"dev-master": "2.x-dev"
|
2436 |
+
},
|
2437 |
+
"laravel": {
|
2438 |
+
"providers": [
|
2439 |
+
"Carbon\\Laravel\\ServiceProvider"
|
2440 |
+
]
|
2441 |
+
}
|
2442 |
+
},
|
2443 |
+
"autoload": {
|
2444 |
+
"psr-4": {
|
2445 |
+
"Carbon\\": "src/Carbon/"
|
2446 |
+
}
|
2447 |
+
},
|
2448 |
+
"notification-url": "https://packagist.org/downloads/",
|
2449 |
+
"license": [
|
2450 |
+
"MIT"
|
2451 |
+
],
|
2452 |
+
"authors": [
|
2453 |
+
{
|
2454 |
+
"name": "Brian Nesbitt",
|
2455 |
+
"email": "brian@nesbot.com",
|
2456 |
+
"homepage": "http://nesbot.com"
|
2457 |
+
},
|
2458 |
+
{
|
2459 |
+
"name": "kylekatarnls",
|
2460 |
+
"homepage": "http://github.com/kylekatarnls"
|
2461 |
+
}
|
2462 |
+
],
|
2463 |
+
"description": "An API extension for DateTime that supports 281 different languages.",
|
2464 |
+
"homepage": "http://carbon.nesbot.com",
|
2465 |
+
"keywords": [
|
2466 |
+
"date",
|
2467 |
+
"datetime",
|
2468 |
+
"time"
|
2469 |
+
],
|
2470 |
+
"time": "2020-03-01T11:11:58+00:00"
|
2471 |
+
},
|
2472 |
+
{
|
2473 |
+
"name": "phar-io/manifest",
|
2474 |
+
"version": "1.0.3",
|
2475 |
+
"source": {
|
2476 |
+
"type": "git",
|
2477 |
+
"url": "https://github.com/phar-io/manifest.git",
|
2478 |
+
"reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
|
2479 |
+
},
|
2480 |
+
"dist": {
|
2481 |
+
"type": "zip",
|
2482 |
+
"url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
|
2483 |
+
"reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
|
2484 |
+
"shasum": ""
|
2485 |
+
},
|
2486 |
+
"require": {
|
2487 |
+
"ext-dom": "*",
|
2488 |
+
"ext-phar": "*",
|
2489 |
+
"phar-io/version": "^2.0",
|
2490 |
+
"php": "^5.6 || ^7.0"
|
2491 |
+
},
|
2492 |
+
"type": "library",
|
2493 |
+
"extra": {
|
2494 |
+
"branch-alias": {
|
2495 |
+
"dev-master": "1.0.x-dev"
|
2496 |
+
}
|
2497 |
+
},
|
2498 |
+
"autoload": {
|
2499 |
+
"classmap": [
|
2500 |
+
"src/"
|
2501 |
+
]
|
2502 |
+
},
|
2503 |
+
"notification-url": "https://packagist.org/downloads/",
|
2504 |
+
"license": [
|
2505 |
+
"BSD-3-Clause"
|
2506 |
+
],
|
2507 |
+
"authors": [
|
2508 |
+
{
|
2509 |
+
"name": "Arne Blankerts",
|
2510 |
+
"email": "arne@blankerts.de",
|
2511 |
+
"role": "Developer"
|
2512 |
+
},
|
2513 |
+
{
|
2514 |
+
"name": "Sebastian Heuer",
|
2515 |
+
"email": "sebastian@phpeople.de",
|
2516 |
+
"role": "Developer"
|
2517 |
+
},
|
2518 |
+
{
|
2519 |
+
"name": "Sebastian Bergmann",
|
2520 |
+
"email": "sebastian@phpunit.de",
|
2521 |
+
"role": "Developer"
|
2522 |
+
}
|
2523 |
+
],
|
2524 |
+
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
|
2525 |
+
"time": "2018-07-08T19:23:20+00:00"
|
2526 |
+
},
|
2527 |
+
{
|
2528 |
+
"name": "phar-io/version",
|
2529 |
+
"version": "2.0.1",
|
2530 |
+
"source": {
|
2531 |
+
"type": "git",
|
2532 |
+
"url": "https://github.com/phar-io/version.git",
|
2533 |
+
"reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
|
2534 |
+
},
|
2535 |
+
"dist": {
|
2536 |
+
"type": "zip",
|
2537 |
+
"url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
|
2538 |
+
"reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
|
2539 |
+
"shasum": ""
|
2540 |
+
},
|
2541 |
+
"require": {
|
2542 |
+
"php": "^5.6 || ^7.0"
|
2543 |
+
},
|
2544 |
+
"type": "library",
|
2545 |
+
"autoload": {
|
2546 |
+
"classmap": [
|
2547 |
+
"src/"
|
2548 |
+
]
|
2549 |
+
},
|
2550 |
+
"notification-url": "https://packagist.org/downloads/",
|
2551 |
+
"license": [
|
2552 |
+
"BSD-3-Clause"
|
2553 |
+
],
|
2554 |
+
"authors": [
|
2555 |
+
{
|
2556 |
+
"name": "Arne Blankerts",
|
2557 |
+
"email": "arne@blankerts.de",
|
2558 |
+
"role": "Developer"
|
2559 |
+
},
|
2560 |
+
{
|
2561 |
+
"name": "Sebastian Heuer",
|
2562 |
+
"email": "sebastian@phpeople.de",
|
2563 |
+
"role": "Developer"
|
2564 |
+
},
|
2565 |
+
{
|
2566 |
+
"name": "Sebastian Bergmann",
|
2567 |
+
"email": "sebastian@phpunit.de",
|
2568 |
+
"role": "Developer"
|
2569 |
+
}
|
2570 |
+
],
|
2571 |
+
"description": "Library for handling version information and constraints",
|
2572 |
+
"time": "2018-07-08T19:19:57+00:00"
|
2573 |
+
},
|
2574 |
+
{
|
2575 |
+
"name": "phpdocumentor/reflection-common",
|
2576 |
+
"version": "2.0.0",
|
2577 |
+
"source": {
|
2578 |
+
"type": "git",
|
2579 |
+
"url": "https://github.com/phpDocumentor/ReflectionCommon.git",
|
2580 |
+
"reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a"
|
2581 |
+
},
|
2582 |
+
"dist": {
|
2583 |
+
"type": "zip",
|
2584 |
+
"url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a",
|
2585 |
+
"reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a",
|
2586 |
+
"shasum": ""
|
2587 |
+
},
|
2588 |
+
"require": {
|
2589 |
+
"php": ">=7.1"
|
2590 |
+
},
|
2591 |
+
"require-dev": {
|
2592 |
+
"phpunit/phpunit": "~6"
|
2593 |
+
},
|
2594 |
+
"type": "library",
|
2595 |
+
"extra": {
|
2596 |
+
"branch-alias": {
|
2597 |
+
"dev-master": "2.x-dev"
|
2598 |
+
}
|
2599 |
+
},
|
2600 |
+
"autoload": {
|
2601 |
+
"psr-4": {
|
2602 |
+
"phpDocumentor\\Reflection\\": "src/"
|
2603 |
+
}
|
2604 |
+
},
|
2605 |
+
"notification-url": "https://packagist.org/downloads/",
|
2606 |
+
"license": [
|
2607 |
+
"MIT"
|
2608 |
+
],
|
2609 |
+
"authors": [
|
2610 |
+
{
|
2611 |
+
"name": "Jaap van Otterdijk",
|
2612 |
+
"email": "opensource@ijaap.nl"
|
2613 |
+
}
|
2614 |
+
],
|
2615 |
+
"description": "Common reflection classes used by phpdocumentor to reflect the code structure",
|
2616 |
+
"homepage": "http://www.phpdoc.org",
|
2617 |
+
"keywords": [
|
2618 |
+
"FQSEN",
|
2619 |
+
"phpDocumentor",
|
2620 |
+
"phpdoc",
|
2621 |
+
"reflection",
|
2622 |
+
"static analysis"
|
2623 |
+
],
|
2624 |
+
"time": "2018-08-07T13:53:10+00:00"
|
2625 |
+
},
|
2626 |
+
{
|
2627 |
+
"name": "phpdocumentor/reflection-docblock",
|
2628 |
+
"version": "5.1.0",
|
2629 |
+
"source": {
|
2630 |
+
"type": "git",
|
2631 |
+
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
2632 |
+
"reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e"
|
2633 |
+
},
|
2634 |
+
"dist": {
|
2635 |
+
"type": "zip",
|
2636 |
+
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
|
2637 |
+
"reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
|
2638 |
+
"shasum": ""
|
2639 |
+
},
|
2640 |
+
"require": {
|
2641 |
+
"ext-filter": "^7.1",
|
2642 |
+
"php": "^7.2",
|
2643 |
+
"phpdocumentor/reflection-common": "^2.0",
|
2644 |
+
"phpdocumentor/type-resolver": "^1.0",
|
2645 |
+
"webmozart/assert": "^1"
|
2646 |
+
},
|
2647 |
+
"require-dev": {
|
2648 |
+
"doctrine/instantiator": "^1",
|
2649 |
+
"mockery/mockery": "^1"
|
2650 |
+
},
|
2651 |
+
"type": "library",
|
2652 |
+
"extra": {
|
2653 |
+
"branch-alias": {
|
2654 |
+
"dev-master": "5.x-dev"
|
2655 |
+
}
|
2656 |
+
},
|
2657 |
+
"autoload": {
|
2658 |
+
"psr-4": {
|
2659 |
+
"phpDocumentor\\Reflection\\": "src"
|
2660 |
+
}
|
2661 |
+
},
|
2662 |
+
"notification-url": "https://packagist.org/downloads/",
|
2663 |
+
"license": [
|
2664 |
+
"MIT"
|
2665 |
+
],
|
2666 |
+
"authors": [
|
2667 |
+
{
|
2668 |
+
"name": "Mike van Riel",
|
2669 |
+
"email": "me@mikevanriel.com"
|
2670 |
+
},
|
2671 |
+
{
|
2672 |
+
"name": "Jaap van Otterdijk",
|
2673 |
+
"email": "account@ijaap.nl"
|
2674 |
+
}
|
2675 |
+
],
|
2676 |
+
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
|
2677 |
+
"time": "2020-02-22T12:28:44+00:00"
|
2678 |
+
},
|
2679 |
+
{
|
2680 |
+
"name": "phpdocumentor/type-resolver",
|
2681 |
+
"version": "1.1.0",
|
2682 |
+
"source": {
|
2683 |
+
"type": "git",
|
2684 |
+
"url": "https://github.com/phpDocumentor/TypeResolver.git",
|
2685 |
+
"reference": "7462d5f123dfc080dfdf26897032a6513644fc95"
|
2686 |
+
},
|
2687 |
+
"dist": {
|
2688 |
+
"type": "zip",
|
2689 |
+
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95",
|
2690 |
+
"reference": "7462d5f123dfc080dfdf26897032a6513644fc95",
|
2691 |
+
"shasum": ""
|
2692 |
+
},
|
2693 |
+
"require": {
|
2694 |
+
"php": "^7.2",
|
2695 |
+
"phpdocumentor/reflection-common": "^2.0"
|
2696 |
+
},
|
2697 |
+
"require-dev": {
|
2698 |
+
"ext-tokenizer": "^7.2",
|
2699 |
+
"mockery/mockery": "~1"
|
2700 |
+
},
|
2701 |
+
"type": "library",
|
2702 |
+
"extra": {
|
2703 |
+
"branch-alias": {
|
2704 |
+
"dev-master": "1.x-dev"
|
2705 |
+
}
|
2706 |
+
},
|
2707 |
+
"autoload": {
|
2708 |
+
"psr-4": {
|
2709 |
+
"phpDocumentor\\Reflection\\": "src"
|
2710 |
+
}
|
2711 |
+
},
|
2712 |
+
"notification-url": "https://packagist.org/downloads/",
|
2713 |
+
"license": [
|
2714 |
+
"MIT"
|
2715 |
+
],
|
2716 |
+
"authors": [
|
2717 |
+
{
|
2718 |
+
"name": "Mike van Riel",
|
2719 |
+
"email": "me@mikevanriel.com"
|
2720 |
+
}
|
2721 |
+
],
|
2722 |
+
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
|
2723 |
+
"time": "2020-02-18T18:59:58+00:00"
|
2724 |
+
},
|
2725 |
+
{
|
2726 |
+
"name": "phpoption/phpoption",
|
2727 |
+
"version": "1.7.2",
|
2728 |
+
"source": {
|
2729 |
+
"type": "git",
|
2730 |
+
"url": "https://github.com/schmittjoh/php-option.git",
|
2731 |
+
"reference": "77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959"
|
2732 |
+
},
|
2733 |
+
"dist": {
|
2734 |
+
"type": "zip",
|
2735 |
+
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959",
|
2736 |
+
"reference": "77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959",
|
2737 |
+
"shasum": ""
|
2738 |
+
},
|
2739 |
+
"require": {
|
2740 |
+
"php": "^5.5.9 || ^7.0"
|
2741 |
+
},
|
2742 |
+
"require-dev": {
|
2743 |
+
"bamarni/composer-bin-plugin": "^1.3",
|
2744 |
+
"phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0"
|
2745 |
+
},
|
2746 |
+
"type": "library",
|
2747 |
+
"extra": {
|
2748 |
+
"branch-alias": {
|
2749 |
+
"dev-master": "1.7-dev"
|
2750 |
+
}
|
2751 |
+
},
|
2752 |
+
"autoload": {
|
2753 |
+
"psr-4": {
|
2754 |
+
"PhpOption\\": "src/PhpOption/"
|
2755 |
+
}
|
2756 |
+
},
|
2757 |
+
"notification-url": "https://packagist.org/downloads/",
|
2758 |
+
"license": [
|
2759 |
+
"Apache-2.0"
|
2760 |
+
],
|
2761 |
+
"authors": [
|
2762 |
+
{
|
2763 |
+
"name": "Johannes M. Schmitt",
|
2764 |
+
"email": "schmittjoh@gmail.com"
|
2765 |
+
},
|
2766 |
+
{
|
2767 |
+
"name": "Graham Campbell",
|
2768 |
+
"email": "graham@alt-three.com"
|
2769 |
+
}
|
2770 |
+
],
|
2771 |
+
"description": "Option Type for PHP",
|
2772 |
+
"keywords": [
|
2773 |
+
"language",
|
2774 |
+
"option",
|
2775 |
+
"php",
|
2776 |
+
"type"
|
2777 |
+
],
|
2778 |
+
"time": "2019-12-15T19:35:24+00:00"
|
2779 |
+
},
|
2780 |
+
{
|
2781 |
+
"name": "phpspec/prophecy",
|
2782 |
+
"version": "v1.10.3",
|
2783 |
+
"source": {
|
2784 |
+
"type": "git",
|
2785 |
+
"url": "https://github.com/phpspec/prophecy.git",
|
2786 |
+
"reference": "451c3cd1418cf640de218914901e51b064abb093"
|
2787 |
+
},
|
2788 |
+
"dist": {
|
2789 |
+
"type": "zip",
|
2790 |
+
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
|
2791 |
+
"reference": "451c3cd1418cf640de218914901e51b064abb093",
|
2792 |
+
"shasum": ""
|
2793 |
+
},
|
2794 |
+
"require": {
|
2795 |
+
"doctrine/instantiator": "^1.0.2",
|
2796 |
+
"php": "^5.3|^7.0",
|
2797 |
+
"phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
|
2798 |
+
"sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
|
2799 |
+
"sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
|
2800 |
+
},
|
2801 |
+
"require-dev": {
|
2802 |
+
"phpspec/phpspec": "^2.5 || ^3.2",
|
2803 |
+
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
|
2804 |
+
},
|
2805 |
+
"type": "library",
|
2806 |
+
"extra": {
|
2807 |
+
"branch-alias": {
|
2808 |
+
"dev-master": "1.10.x-dev"
|
2809 |
+
}
|
2810 |
+
},
|
2811 |
+
"autoload": {
|
2812 |
+
"psr-4": {
|
2813 |
+
"Prophecy\\": "src/Prophecy"
|
2814 |
+
}
|
2815 |
+
},
|
2816 |
+
"notification-url": "https://packagist.org/downloads/",
|
2817 |
+
"license": [
|
2818 |
+
"MIT"
|
2819 |
+
],
|
2820 |
+
"authors": [
|
2821 |
+
{
|
2822 |
+
"name": "Konstantin Kudryashov",
|
2823 |
+
"email": "ever.zet@gmail.com",
|
2824 |
+
"homepage": "http://everzet.com"
|
2825 |
+
},
|
2826 |
+
{
|
2827 |
+
"name": "Marcello Duarte",
|
2828 |
+
"email": "marcello.duarte@gmail.com"
|
2829 |
+
}
|
2830 |
+
],
|
2831 |
+
"description": "Highly opinionated mocking framework for PHP 5.3+",
|
2832 |
+
"homepage": "https://github.com/phpspec/prophecy",
|
2833 |
+
"keywords": [
|
2834 |
+
"Double",
|
2835 |
+
"Dummy",
|
2836 |
+
"fake",
|
2837 |
+
"mock",
|
2838 |
+
"spy",
|
2839 |
+
"stub"
|
2840 |
+
],
|
2841 |
+
"time": "2020-03-05T15:02:03+00:00"
|
2842 |
+
},
|
2843 |
+
{
|
2844 |
+
"name": "phpunit/php-code-coverage",
|
2845 |
+
"version": "7.0.10",
|
2846 |
+
"source": {
|
2847 |
+
"type": "git",
|
2848 |
+
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
2849 |
+
"reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf"
|
2850 |
+
},
|
2851 |
+
"dist": {
|
2852 |
+
"type": "zip",
|
2853 |
+
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf",
|
2854 |
+
"reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf",
|
2855 |
+
"shasum": ""
|
2856 |
+
},
|
2857 |
+
"require": {
|
2858 |
+
"ext-dom": "*",
|
2859 |
+
"ext-xmlwriter": "*",
|
2860 |
+
"php": "^7.2",
|
2861 |
+
"phpunit/php-file-iterator": "^2.0.2",
|
2862 |
+
"phpunit/php-text-template": "^1.2.1",
|
2863 |
+
"phpunit/php-token-stream": "^3.1.1",
|
2864 |
+
"sebastian/code-unit-reverse-lookup": "^1.0.1",
|
2865 |
+
"sebastian/environment": "^4.2.2",
|
2866 |
+
"sebastian/version": "^2.0.1",
|
2867 |
+
"theseer/tokenizer": "^1.1.3"
|
2868 |
+
},
|
2869 |
+
"require-dev": {
|
2870 |
+
"phpunit/phpunit": "^8.2.2"
|
2871 |
+
},
|
2872 |
+
"suggest": {
|
2873 |
+
"ext-xdebug": "^2.7.2"
|
2874 |
+
},
|
2875 |
+
"type": "library",
|
2876 |
+
"extra": {
|
2877 |
+
"branch-alias": {
|
2878 |
+
"dev-master": "7.0-dev"
|
2879 |
+
}
|
2880 |
+
},
|
2881 |
+
"autoload": {
|
2882 |
+
"classmap": [
|
2883 |
+
"src/"
|
2884 |
+
]
|
2885 |
+
},
|
2886 |
+
"notification-url": "https://packagist.org/downloads/",
|
2887 |
+
"license": [
|
2888 |
+
"BSD-3-Clause"
|
2889 |
+
],
|
2890 |
+
"authors": [
|
2891 |
+
{
|
2892 |
+
"name": "Sebastian Bergmann",
|
2893 |
+
"email": "sebastian@phpunit.de",
|
2894 |
+
"role": "lead"
|
2895 |
+
}
|
2896 |
+
],
|
2897 |
+
"description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
|
2898 |
+
"homepage": "https://github.com/sebastianbergmann/php-code-coverage",
|
2899 |
+
"keywords": [
|
2900 |
+
"coverage",
|
2901 |
+
"testing",
|
2902 |
+
"xunit"
|
2903 |
+
],
|
2904 |
+
"time": "2019-11-20T13:55:58+00:00"
|
2905 |
+
},
|
2906 |
+
{
|
2907 |
+
"name": "phpunit/php-file-iterator",
|
2908 |
+
"version": "2.0.2",
|
2909 |
+
"source": {
|
2910 |
+
"type": "git",
|
2911 |
+
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
|
2912 |
+
"reference": "050bedf145a257b1ff02746c31894800e5122946"
|
2913 |
+
},
|
2914 |
+
"dist": {
|
2915 |
+
"type": "zip",
|
2916 |
+
"url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946",
|
2917 |
+
"reference": "050bedf145a257b1ff02746c31894800e5122946",
|
2918 |
+
"shasum": ""
|
2919 |
+
},
|
2920 |
+
"require": {
|
2921 |
+
"php": "^7.1"
|
2922 |
+
},
|
2923 |
+
"require-dev": {
|
2924 |
+
"phpunit/phpunit": "^7.1"
|
2925 |
+
},
|
2926 |
+
"type": "library",
|
2927 |
+
"extra": {
|
2928 |
+
"branch-alias": {
|
2929 |
+
"dev-master": "2.0.x-dev"
|
2930 |
+
}
|
2931 |
+
},
|
2932 |
+
"autoload": {
|
2933 |
+
"classmap": [
|
2934 |
+
"src/"
|
2935 |
+
]
|
2936 |
+
},
|
2937 |
+
"notification-url": "https://packagist.org/downloads/",
|
2938 |
+
"license": [
|
2939 |
+
"BSD-3-Clause"
|
2940 |
+
],
|
2941 |
+
"authors": [
|
2942 |
+
{
|
2943 |
+
"name": "Sebastian Bergmann",
|
2944 |
+
"email": "sebastian@phpunit.de",
|
2945 |
+
"role": "lead"
|
2946 |
+
}
|
2947 |
+
],
|
2948 |
+
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
|
2949 |
+
"homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
|
2950 |
+
"keywords": [
|
2951 |
+
"filesystem",
|
2952 |
+
"iterator"
|
2953 |
+
],
|
2954 |
+
"time": "2018-09-13T20:33:42+00:00"
|
2955 |
+
},
|
2956 |
+
{
|
2957 |
+
"name": "phpunit/php-text-template",
|
2958 |
+
"version": "1.2.1",
|
2959 |
+
"source": {
|
2960 |
+
"type": "git",
|
2961 |
+
"url": "https://github.com/sebastianbergmann/php-text-template.git",
|
2962 |
+
"reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
|
2963 |
+
},
|
2964 |
+
"dist": {
|
2965 |
+
"type": "zip",
|
2966 |
+
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
|
2967 |
+
"reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
|
2968 |
+
"shasum": ""
|
2969 |
+
},
|
2970 |
+
"require": {
|
2971 |
+
"php": ">=5.3.3"
|
2972 |
+
},
|
2973 |
+
"type": "library",
|
2974 |
+
"autoload": {
|
2975 |
+
"classmap": [
|
2976 |
+
"src/"
|
2977 |
+
]
|
2978 |
+
},
|
2979 |
+
"notification-url": "https://packagist.org/downloads/",
|
2980 |
+
"license": [
|
2981 |
+
"BSD-3-Clause"
|
2982 |
+
],
|
2983 |
+
"authors": [
|
2984 |
+
{
|
2985 |
+
"name": "Sebastian Bergmann",
|
2986 |
+
"email": "sebastian@phpunit.de",
|
2987 |
+
"role": "lead"
|
2988 |
+
}
|
2989 |
+
],
|
2990 |
+
"description": "Simple template engine.",
|
2991 |
+
"homepage": "https://github.com/sebastianbergmann/php-text-template/",
|
2992 |
+
"keywords": [
|
2993 |
+
"template"
|
2994 |
+
],
|
2995 |
+
"time": "2015-06-21T13:50:34+00:00"
|
2996 |
+
},
|
2997 |
+
{
|
2998 |
+
"name": "phpunit/php-timer",
|
2999 |
+
"version": "2.1.2",
|
3000 |
+
"source": {
|
3001 |
+
"type": "git",
|
3002 |
+
"url": "https://github.com/sebastianbergmann/php-timer.git",
|
3003 |
+
"reference": "1038454804406b0b5f5f520358e78c1c2f71501e"
|
3004 |
+
},
|
3005 |
+
"dist": {
|
3006 |
+
"type": "zip",
|
3007 |
+
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e",
|
3008 |
+
"reference": "1038454804406b0b5f5f520358e78c1c2f71501e",
|
3009 |
+
"shasum": ""
|
3010 |
+
},
|
3011 |
+
"require": {
|
3012 |
+
"php": "^7.1"
|
3013 |
+
},
|
3014 |
+
"require-dev": {
|
3015 |
+
"phpunit/phpunit": "^7.0"
|
3016 |
+
},
|
3017 |
+
"type": "library",
|
3018 |
+
"extra": {
|
3019 |
+
"branch-alias": {
|
3020 |
+
"dev-master": "2.1-dev"
|
3021 |
+
}
|
3022 |
+
},
|
3023 |
+
"autoload": {
|
3024 |
+
"classmap": [
|
3025 |
+
"src/"
|
3026 |
+
]
|
3027 |
+
},
|
3028 |
+
"notification-url": "https://packagist.org/downloads/",
|
3029 |
+
"license": [
|
3030 |
+
"BSD-3-Clause"
|
3031 |
+
],
|
3032 |
+
"authors": [
|
3033 |
+
{
|
3034 |
+
"name": "Sebastian Bergmann",
|
3035 |
+
"email": "sebastian@phpunit.de",
|
3036 |
+
"role": "lead"
|
3037 |
+
}
|
3038 |
+
],
|
3039 |
+
"description": "Utility class for timing",
|
3040 |
+
"homepage": "https://github.com/sebastianbergmann/php-timer/",
|
3041 |
+
"keywords": [
|
3042 |
+
"timer"
|
3043 |
+
],
|
3044 |
+
"time": "2019-06-07T04:22:29+00:00"
|
3045 |
+
},
|
3046 |
+
{
|
3047 |
+
"name": "phpunit/php-token-stream",
|
3048 |
+
"version": "3.1.1",
|
3049 |
+
"source": {
|
3050 |
+
"type": "git",
|
3051 |
+
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
|
3052 |
+
"reference": "995192df77f63a59e47f025390d2d1fdf8f425ff"
|
3053 |
+
},
|
3054 |
+
"dist": {
|
3055 |
+
"type": "zip",
|
3056 |
+
"url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff",
|
3057 |
+
"reference": "995192df77f63a59e47f025390d2d1fdf8f425ff",
|
3058 |
+
"shasum": ""
|
3059 |
+
},
|
3060 |
+
"require": {
|
3061 |
+
"ext-tokenizer": "*",
|
3062 |
+
"php": "^7.1"
|
3063 |
+
},
|
3064 |
+
"require-dev": {
|
3065 |
+
"phpunit/phpunit": "^7.0"
|
3066 |
+
},
|
3067 |
+
"type": "library",
|
3068 |
+
"extra": {
|
3069 |
+
"branch-alias": {
|
3070 |
+
"dev-master": "3.1-dev"
|
3071 |
+
}
|
3072 |
+
},
|
3073 |
+
"autoload": {
|
3074 |
+
"classmap": [
|
3075 |
+
"src/"
|
3076 |
+
]
|
3077 |
+
},
|
3078 |
+
"notification-url": "https://packagist.org/downloads/",
|
3079 |
+
"license": [
|
3080 |
+
"BSD-3-Clause"
|
3081 |
+
],
|
3082 |
+
"authors": [
|
3083 |
+
{
|
3084 |
+
"name": "Sebastian Bergmann",
|
3085 |
+
"email": "sebastian@phpunit.de"
|
3086 |
+
}
|
3087 |
+
],
|
3088 |
+
"description": "Wrapper around PHP's tokenizer extension.",
|
3089 |
+
"homepage": "https://github.com/sebastianbergmann/php-token-stream/",
|
3090 |
+
"keywords": [
|
3091 |
+
"tokenizer"
|
3092 |
+
],
|
3093 |
+
"time": "2019-09-17T06:23:10+00:00"
|
3094 |
+
},
|
3095 |
+
{
|
3096 |
+
"name": "phpunit/phpunit",
|
3097 |
+
"version": "8.5.2",
|
3098 |
+
"source": {
|
3099 |
+
"type": "git",
|
3100 |
+
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
3101 |
+
"reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0"
|
3102 |
+
},
|
3103 |
+
"dist": {
|
3104 |
+
"type": "zip",
|
3105 |
+
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/018b6ac3c8ab20916db85fa91bf6465acb64d1e0",
|
3106 |
+
"reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0",
|
3107 |
+
"shasum": ""
|
3108 |
+
},
|
3109 |
+
"require": {
|
3110 |
+
"doctrine/instantiator": "^1.2.0",
|
3111 |
+
"ext-dom": "*",
|
3112 |
+
"ext-json": "*",
|
3113 |
+
"ext-libxml": "*",
|
3114 |
+
"ext-mbstring": "*",
|
3115 |
+
"ext-xml": "*",
|
3116 |
+
"ext-xmlwriter": "*",
|
3117 |
+
"myclabs/deep-copy": "^1.9.1",
|
3118 |
+
"phar-io/manifest": "^1.0.3",
|
3119 |
+
"phar-io/version": "^2.0.1",
|
3120 |
+
"php": "^7.2",
|
3121 |
+
"phpspec/prophecy": "^1.8.1",
|
3122 |
+
"phpunit/php-code-coverage": "^7.0.7",
|
3123 |
+
"phpunit/php-file-iterator": "^2.0.2",
|
3124 |
+
"phpunit/php-text-template": "^1.2.1",
|
3125 |
+
"phpunit/php-timer": "^2.1.2",
|
3126 |
+
"sebastian/comparator": "^3.0.2",
|
3127 |
+
"sebastian/diff": "^3.0.2",
|
3128 |
+
"sebastian/environment": "^4.2.2",
|
3129 |
+
"sebastian/exporter": "^3.1.1",
|
3130 |
+
"sebastian/global-state": "^3.0.0",
|
3131 |
+
"sebastian/object-enumerator": "^3.0.3",
|
3132 |
+
"sebastian/resource-operations": "^2.0.1",
|
3133 |
+
"sebastian/type": "^1.1.3",
|
3134 |
+
"sebastian/version": "^2.0.1"
|
3135 |
+
},
|
3136 |
+
"require-dev": {
|
3137 |
+
"ext-pdo": "*"
|
3138 |
+
},
|
3139 |
+
"suggest": {
|
3140 |
+
"ext-soap": "*",
|
3141 |
+
"ext-xdebug": "*",
|
3142 |
+
"phpunit/php-invoker": "^2.0.0"
|
3143 |
+
},
|
3144 |
+
"bin": [
|
3145 |
+
"phpunit"
|
3146 |
+
],
|
3147 |
+
"type": "library",
|
3148 |
+
"extra": {
|
3149 |
+
"branch-alias": {
|
3150 |
+
"dev-master": "8.5-dev"
|
3151 |
+
}
|
3152 |
+
},
|
3153 |
+
"autoload": {
|
3154 |
+
"classmap": [
|
3155 |
+
"src/"
|
3156 |
+
]
|
3157 |
+
},
|
3158 |
+
"notification-url": "https://packagist.org/downloads/",
|
3159 |
+
"license": [
|
3160 |
+
"BSD-3-Clause"
|
3161 |
+
],
|
3162 |
+
"authors": [
|
3163 |
+
{
|
3164 |
+
"name": "Sebastian Bergmann",
|
3165 |
+
"email": "sebastian@phpunit.de",
|
3166 |
+
"role": "lead"
|
3167 |
+
}
|
3168 |
+
],
|
3169 |
+
"description": "The PHP Unit Testing framework.",
|
3170 |
+
"homepage": "https://phpunit.de/",
|
3171 |
+
"keywords": [
|
3172 |
+
"phpunit",
|
3173 |
+
"testing",
|
3174 |
+
"xunit"
|
3175 |
+
],
|
3176 |
+
"time": "2020-01-08T08:49:49+00:00"
|
3177 |
+
},
|
3178 |
+
{
|
3179 |
+
"name": "psr/http-message",
|
3180 |
+
"version": "1.0.1",
|
3181 |
+
"source": {
|
3182 |
+
"type": "git",
|
3183 |
+
"url": "https://github.com/php-fig/http-message.git",
|
3184 |
+
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
|
3185 |
+
},
|
3186 |
+
"dist": {
|
3187 |
+
"type": "zip",
|
3188 |
+
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
|
3189 |
+
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
|
3190 |
+
"shasum": ""
|
3191 |
+
},
|
3192 |
+
"require": {
|
3193 |
+
"php": ">=5.3.0"
|
3194 |
+
},
|
3195 |
+
"type": "library",
|
3196 |
+
"extra": {
|
3197 |
+
"branch-alias": {
|
3198 |
+
"dev-master": "1.0.x-dev"
|
3199 |
+
}
|
3200 |
+
},
|
3201 |
+
"autoload": {
|
3202 |
+
"psr-4": {
|
3203 |
+
"Psr\\Http\\Message\\": "src/"
|
3204 |
+
}
|
3205 |
+
},
|
3206 |
+
"notification-url": "https://packagist.org/downloads/",
|
3207 |
+
"license": [
|
3208 |
+
"MIT"
|
3209 |
+
],
|
3210 |
+
"authors": [
|
3211 |
+
{
|
3212 |
+
"name": "PHP-FIG",
|
3213 |
+
"homepage": "http://www.php-fig.org/"
|
3214 |
+
}
|
3215 |
+
],
|
3216 |
+
"description": "Common interface for HTTP messages",
|
3217 |
+
"homepage": "https://github.com/php-fig/http-message",
|
3218 |
+
"keywords": [
|
3219 |
+
"http",
|
3220 |
+
"http-message",
|
3221 |
+
"psr",
|
3222 |
+
"psr-7",
|
3223 |
+
"request",
|
3224 |
+
"response"
|
3225 |
+
],
|
3226 |
+
"time": "2016-08-06T14:39:51+00:00"
|
3227 |
+
},
|
3228 |
+
{
|
3229 |
+
"name": "psr/log",
|
3230 |
+
"version": "1.1.2",
|
3231 |
+
"source": {
|
3232 |
+
"type": "git",
|
3233 |
+
"url": "https://github.com/php-fig/log.git",
|
3234 |
+
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
|
3235 |
+
},
|
3236 |
+
"dist": {
|
3237 |
+
"type": "zip",
|
3238 |
+
"url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
|
3239 |
+
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
|
3240 |
+
"shasum": ""
|
3241 |
+
},
|
3242 |
+
"require": {
|
3243 |
+
"php": ">=5.3.0"
|
3244 |
+
},
|
3245 |
+
"type": "library",
|
3246 |
+
"extra": {
|
3247 |
+
"branch-alias": {
|
3248 |
+
"dev-master": "1.1.x-dev"
|
3249 |
+
}
|
3250 |
+
},
|
3251 |
+
"autoload": {
|
3252 |
+
"psr-4": {
|
3253 |
+
"Psr\\Log\\": "Psr/Log/"
|
3254 |
+
}
|
3255 |
+
},
|
3256 |
+
"notification-url": "https://packagist.org/downloads/",
|
3257 |
+
"license": [
|
3258 |
+
"MIT"
|
3259 |
+
],
|
3260 |
+
"authors": [
|
3261 |
+
{
|
3262 |
+
"name": "PHP-FIG",
|
3263 |
+
"homepage": "http://www.php-fig.org/"
|
3264 |
+
}
|
3265 |
+
],
|
3266 |
+
"description": "Common interface for logging libraries",
|
3267 |
+
"homepage": "https://github.com/php-fig/log",
|
3268 |
+
"keywords": [
|
3269 |
+
"log",
|
3270 |
+
"psr",
|
3271 |
+
"psr-3"
|
3272 |
+
],
|
3273 |
+
"time": "2019-11-01T11:05:21+00:00"
|
3274 |
+
},
|
3275 |
+
{
|
3276 |
+
"name": "psr/simple-cache",
|
3277 |
+
"version": "1.0.1",
|
3278 |
+
"source": {
|
3279 |
+
"type": "git",
|
3280 |
+
"url": "https://github.com/php-fig/simple-cache.git",
|
3281 |
+
"reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
|
3282 |
+
},
|
3283 |
+
"dist": {
|
3284 |
+
"type": "zip",
|
3285 |
+
"url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
|
3286 |
+
"reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
|
3287 |
+
"shasum": ""
|
3288 |
+
},
|
3289 |
+
"require": {
|
3290 |
+
"php": ">=5.3.0"
|
3291 |
+
},
|
3292 |
+
"type": "library",
|
3293 |
+
"extra": {
|
3294 |
+
"branch-alias": {
|
3295 |
+
"dev-master": "1.0.x-dev"
|
3296 |
+
}
|
3297 |
+
},
|
3298 |
+
"autoload": {
|
3299 |
+
"psr-4": {
|
3300 |
+
"Psr\\SimpleCache\\": "src/"
|
3301 |
+
}
|
3302 |
+
},
|
3303 |
+
"notification-url": "https://packagist.org/downloads/",
|
3304 |
+
"license": [
|
3305 |
+
"MIT"
|
3306 |
+
],
|
3307 |
+
"authors": [
|
3308 |
+
{
|
3309 |
+
"name": "PHP-FIG",
|
3310 |
+
"homepage": "http://www.php-fig.org/"
|
3311 |
+
}
|
3312 |
+
],
|
3313 |
+
"description": "Common interfaces for simple caching",
|
3314 |
+
"keywords": [
|
3315 |
+
"cache",
|
3316 |
+
"caching",
|
3317 |
+
"psr",
|
3318 |
+
"psr-16",
|
3319 |
+
"simple-cache"
|
3320 |
+
],
|
3321 |
+
"time": "2017-10-23T01:57:42+00:00"
|
3322 |
+
},
|
3323 |
+
{
|
3324 |
+
"name": "ralouphie/getallheaders",
|
3325 |
+
"version": "3.0.3",
|
3326 |
+
"source": {
|
3327 |
+
"type": "git",
|
3328 |
+
"url": "https://github.com/ralouphie/getallheaders.git",
|
3329 |
+
"reference": "120b605dfeb996808c31b6477290a714d356e822"
|
3330 |
+
},
|
3331 |
+
"dist": {
|
3332 |
+
"type": "zip",
|
3333 |
+
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
|
3334 |
+
"reference": "120b605dfeb996808c31b6477290a714d356e822",
|
3335 |
+
"shasum": ""
|
3336 |
+
},
|
3337 |
+
"require": {
|
3338 |
+
"php": ">=5.6"
|
3339 |
+
},
|
3340 |
+
"require-dev": {
|
3341 |
+
"php-coveralls/php-coveralls": "^2.1",
|
3342 |
+
"phpunit/phpunit": "^5 || ^6.5"
|
3343 |
+
},
|
3344 |
+
"type": "library",
|
3345 |
+
"autoload": {
|
3346 |
+
"files": [
|
3347 |
+
"src/getallheaders.php"
|
3348 |
+
]
|
3349 |
+
},
|
3350 |
+
"notification-url": "https://packagist.org/downloads/",
|
3351 |
+
"license": [
|
3352 |
+
"MIT"
|
3353 |
+
],
|
3354 |
+
"authors": [
|
3355 |
+
{
|
3356 |
+
"name": "Ralph Khattar",
|
3357 |
+
"email": "ralph.khattar@gmail.com"
|
3358 |
+
}
|
3359 |
+
],
|
3360 |
+
"description": "A polyfill for getallheaders.",
|
3361 |
+
"time": "2019-03-08T08:55:37+00:00"
|
3362 |
+
},
|
3363 |
+
{
|
3364 |
+
"name": "rmccue/requests",
|
3365 |
+
"version": "v1.7.0",
|
3366 |
+
"source": {
|
3367 |
+
"type": "git",
|
3368 |
+
"url": "https://github.com/rmccue/Requests.git",
|
3369 |
+
"reference": "87932f52ffad70504d93f04f15690cf16a089546"
|
3370 |
+
},
|
3371 |
+
"dist": {
|
3372 |
+
"type": "zip",
|
3373 |
+
"url": "https://api.github.com/repos/rmccue/Requests/zipball/87932f52ffad70504d93f04f15690cf16a089546",
|
3374 |
+
"reference": "87932f52ffad70504d93f04f15690cf16a089546",
|
3375 |
+
"shasum": ""
|
3376 |
+
},
|
3377 |
+
"require": {
|
3378 |
+
"php": ">=5.2"
|
3379 |
+
},
|
3380 |
+
"require-dev": {
|
3381 |
+
"requests/test-server": "dev-master"
|
3382 |
+
},
|
3383 |
+
"type": "library",
|
3384 |
+
"autoload": {
|
3385 |
+
"psr-0": {
|
3386 |
+
"Requests": "library/"
|
3387 |
+
}
|
3388 |
+
},
|
3389 |
+
"notification-url": "https://packagist.org/downloads/",
|
3390 |
+
"license": [
|
3391 |
+
"ISC"
|
3392 |
+
],
|
3393 |
+
"authors": [
|
3394 |
+
{
|
3395 |
+
"name": "Ryan McCue",
|
3396 |
+
"homepage": "http://ryanmccue.info"
|
3397 |
+
}
|
3398 |
+
],
|
3399 |
+
"description": "A HTTP library written in PHP, for human beings.",
|
3400 |
+
"homepage": "http://github.com/rmccue/Requests",
|
3401 |
+
"keywords": [
|
3402 |
+
"curl",
|
3403 |
+
"fsockopen",
|
3404 |
+
"http",
|
3405 |
+
"idna",
|
3406 |
+
"ipv6",
|
3407 |
+
"iri",
|
3408 |
+
"sockets"
|
3409 |
+
],
|
3410 |
+
"time": "2016-10-13T00:11:37+00:00"
|
3411 |
+
},
|
3412 |
+
{
|
3413 |
+
"name": "sebastian/code-unit-reverse-lookup",
|
3414 |
+
"version": "1.0.1",
|
3415 |
+
"source": {
|
3416 |
+
"type": "git",
|
3417 |
+
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
|
3418 |
+
"reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
|
3419 |
+
},
|
3420 |
+
"dist": {
|
3421 |
+
"type": "zip",
|
3422 |
+
"url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
|
3423 |
+
"reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
|
3424 |
+
"shasum": ""
|
3425 |
+
},
|
3426 |
+
"require": {
|
3427 |
+
"php": "^5.6 || ^7.0"
|
3428 |
+
},
|
3429 |
+
"require-dev": {
|
3430 |
+
"phpunit/phpunit": "^5.7 || ^6.0"
|
3431 |
+
},
|
3432 |
+
"type": "library",
|
3433 |
+
"extra": {
|
3434 |
+
"branch-alias": {
|
3435 |
+
"dev-master": "1.0.x-dev"
|
3436 |
+
}
|
3437 |
+
},
|
3438 |
+
"autoload": {
|
3439 |
+
"classmap": [
|
3440 |
+
"src/"
|
3441 |
+
]
|
3442 |
+
},
|
3443 |
+
"notification-url": "https://packagist.org/downloads/",
|
3444 |
+
"license": [
|
3445 |
+
"BSD-3-Clause"
|
3446 |
+
],
|
3447 |
+
"authors": [
|
3448 |
+
{
|
3449 |
+
"name": "Sebastian Bergmann",
|
3450 |
+
"email": "sebastian@phpunit.de"
|
3451 |
+
}
|
3452 |
+
],
|
3453 |
+
"description": "Looks up which function or method a line of code belongs to",
|
3454 |
+
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
|
3455 |
+
"time": "2017-03-04T06:30:41+00:00"
|
3456 |
+
},
|
3457 |
+
{
|
3458 |
+
"name": "sebastian/comparator",
|
3459 |
+
"version": "3.0.2",
|
3460 |
+
"source": {
|
3461 |
+
"type": "git",
|
3462 |
+
"url": "https://github.com/sebastianbergmann/comparator.git",
|
3463 |
+
"reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da"
|
3464 |
+
},
|
3465 |
+
"dist": {
|
3466 |
+
"type": "zip",
|
3467 |
+
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
|
3468 |
+
"reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
|
3469 |
+
"shasum": ""
|
3470 |
+
},
|
3471 |
+
"require": {
|
3472 |
+
"php": "^7.1",
|
3473 |
+
"sebastian/diff": "^3.0",
|
3474 |
+
"sebastian/exporter": "^3.1"
|
3475 |
+
},
|
3476 |
+
"require-dev": {
|
3477 |
+
"phpunit/phpunit": "^7.1"
|
3478 |
+
},
|
3479 |
+
"type": "library",
|
3480 |
+
"extra": {
|
3481 |
+
"branch-alias": {
|
3482 |
+
"dev-master": "3.0-dev"
|
3483 |
+
}
|
3484 |
+
},
|
3485 |
+
"autoload": {
|
3486 |
+
"classmap": [
|
3487 |
+
"src/"
|
3488 |
+
]
|
3489 |
+
},
|
3490 |
+
"notification-url": "https://packagist.org/downloads/",
|
3491 |
+
"license": [
|
3492 |
+
"BSD-3-Clause"
|
3493 |
+
],
|
3494 |
+
"authors": [
|
3495 |
+
{
|
3496 |
+
"name": "Jeff Welch",
|
3497 |
+
"email": "whatthejeff@gmail.com"
|
3498 |
+
},
|
3499 |
+
{
|
3500 |
+
"name": "Volker Dusch",
|
3501 |
+
"email": "github@wallbash.com"
|
3502 |
+
},
|
3503 |
+
{
|
3504 |
+
"name": "Bernhard Schussek",
|
3505 |
+
"email": "bschussek@2bepublished.at"
|
3506 |
+
},
|
3507 |
+
{
|
3508 |
+
"name": "Sebastian Bergmann",
|
3509 |
+
"email": "sebastian@phpunit.de"
|
3510 |
+
}
|
3511 |
+
],
|
3512 |
+
"description": "Provides the functionality to compare PHP values for equality",
|
3513 |
+
"homepage": "https://github.com/sebastianbergmann/comparator",
|
3514 |
+
"keywords": [
|
3515 |
+
"comparator",
|
3516 |
+
"compare",
|
3517 |
+
"equality"
|
3518 |
+
],
|
3519 |
+
"time": "2018-07-12T15:12:46+00:00"
|
3520 |
+
},
|
3521 |
+
{
|
3522 |
+
"name": "sebastian/diff",
|
3523 |
+
"version": "3.0.2",
|
3524 |
+
"source": {
|
3525 |
+
"type": "git",
|
3526 |
+
"url": "https://github.com/sebastianbergmann/diff.git",
|
3527 |
+
"reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29"
|
3528 |
+
},
|
3529 |
+
"dist": {
|
3530 |
+
"type": "zip",
|
3531 |
+
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
|
3532 |
+
"reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
|
3533 |
+
"shasum": ""
|
3534 |
+
},
|
3535 |
+
"require": {
|
3536 |
+
"php": "^7.1"
|
3537 |
+
},
|
3538 |
+
"require-dev": {
|
3539 |
+
"phpunit/phpunit": "^7.5 || ^8.0",
|
3540 |
+
"symfony/process": "^2 || ^3.3 || ^4"
|
3541 |
+
},
|
3542 |
+
"type": "library",
|
3543 |
+
"extra": {
|
3544 |
+
"branch-alias": {
|
3545 |
+
"dev-master": "3.0-dev"
|
3546 |
+
}
|
3547 |
+
},
|
3548 |
+
"autoload": {
|
3549 |
+
"classmap": [
|
3550 |
+
"src/"
|
3551 |
+
]
|
3552 |
+
},
|
3553 |
+
"notification-url": "https://packagist.org/downloads/",
|
3554 |
+
"license": [
|
3555 |
+
"BSD-3-Clause"
|
3556 |
+
],
|
3557 |
+
"authors": [
|
3558 |
+
{
|
3559 |
+
"name": "Kore Nordmann",
|
3560 |
+
"email": "mail@kore-nordmann.de"
|
3561 |
+
},
|
3562 |
+
{
|
3563 |
+
"name": "Sebastian Bergmann",
|
3564 |
+
"email": "sebastian@phpunit.de"
|
3565 |
+
}
|
3566 |
+
],
|
3567 |
+
"description": "Diff implementation",
|
3568 |
+
"homepage": "https://github.com/sebastianbergmann/diff",
|
3569 |
+
"keywords": [
|
3570 |
+
"diff",
|
3571 |
+
"udiff",
|
3572 |
+
"unidiff",
|
3573 |
+
"unified diff"
|
3574 |
+
],
|
3575 |
+
"time": "2019-02-04T06:01:07+00:00"
|
3576 |
+
},
|
3577 |
+
{
|
3578 |
+
"name": "sebastian/environment",
|
3579 |
+
"version": "4.2.3",
|
3580 |
+
"source": {
|
3581 |
+
"type": "git",
|
3582 |
+
"url": "https://github.com/sebastianbergmann/environment.git",
|
3583 |
+
"reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368"
|
3584 |
+
},
|
3585 |
+
"dist": {
|
3586 |
+
"type": "zip",
|
3587 |
+
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
|
3588 |
+
"reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
|
3589 |
+
"shasum": ""
|
3590 |
+
},
|
3591 |
+
"require": {
|
3592 |
+
"php": "^7.1"
|
3593 |
+
},
|
3594 |
+
"require-dev": {
|
3595 |
+
"phpunit/phpunit": "^7.5"
|
3596 |
+
},
|
3597 |
+
"suggest": {
|
3598 |
+
"ext-posix": "*"
|
3599 |
+
},
|
3600 |
+
"type": "library",
|
3601 |
+
"extra": {
|
3602 |
+
"branch-alias": {
|
3603 |
+
"dev-master": "4.2-dev"
|
3604 |
+
}
|
3605 |
+
},
|
3606 |
+
"autoload": {
|
3607 |
+
"classmap": [
|
3608 |
+
"src/"
|
3609 |
+
]
|
3610 |
+
},
|
3611 |
+
"notification-url": "https://packagist.org/downloads/",
|
3612 |
+
"license": [
|
3613 |
+
"BSD-3-Clause"
|
3614 |
+
],
|
3615 |
+
"authors": [
|
3616 |
+
{
|
3617 |
+
"name": "Sebastian Bergmann",
|
3618 |
+
"email": "sebastian@phpunit.de"
|
3619 |
+
}
|
3620 |
+
],
|
3621 |
+
"description": "Provides functionality to handle HHVM/PHP environments",
|
3622 |
+
"homepage": "http://www.github.com/sebastianbergmann/environment",
|
3623 |
+
"keywords": [
|
3624 |
+
"Xdebug",
|
3625 |
+
"environment",
|
3626 |
+
"hhvm"
|
3627 |
+
],
|
3628 |
+
"time": "2019-11-20T08:46:58+00:00"
|
3629 |
+
},
|
3630 |
+
{
|
3631 |
+
"name": "sebastian/exporter",
|
3632 |
+
"version": "3.1.2",
|
3633 |
+
"source": {
|
3634 |
+
"type": "git",
|
3635 |
+
"url": "https://github.com/sebastianbergmann/exporter.git",
|
3636 |
+
"reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e"
|
3637 |
+
},
|
3638 |
+
"dist": {
|
3639 |
+
"type": "zip",
|
3640 |
+
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e",
|
3641 |
+
"reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e",
|
3642 |
+
"shasum": ""
|
3643 |
+
},
|
3644 |
+
"require": {
|
3645 |
+
"php": "^7.0",
|
3646 |
+
"sebastian/recursion-context": "^3.0"
|
3647 |
+
},
|
3648 |
+
"require-dev": {
|
3649 |
+
"ext-mbstring": "*",
|
3650 |
+
"phpunit/phpunit": "^6.0"
|
3651 |
+
},
|
3652 |
+
"type": "library",
|
3653 |
+
"extra": {
|
3654 |
+
"branch-alias": {
|
3655 |
+
"dev-master": "3.1.x-dev"
|
3656 |
+
}
|
3657 |
+
},
|
3658 |
+
"autoload": {
|
3659 |
+
"classmap": [
|
3660 |
+
"src/"
|
3661 |
+
]
|
3662 |
+
},
|
3663 |
+
"notification-url": "https://packagist.org/downloads/",
|
3664 |
+
"license": [
|
3665 |
+
"BSD-3-Clause"
|
3666 |
+
],
|
3667 |
+
"authors": [
|
3668 |
+
{
|
3669 |
+
"name": "Sebastian Bergmann",
|
3670 |
+
"email": "sebastian@phpunit.de"
|
3671 |
+
},
|
3672 |
+
{
|
3673 |
+
"name": "Jeff Welch",
|
3674 |
+
"email": "whatthejeff@gmail.com"
|
3675 |
+
},
|
3676 |
+
{
|
3677 |
+
"name": "Volker Dusch",
|
3678 |
+
"email": "github@wallbash.com"
|
3679 |
+
},
|
3680 |
+
{
|
3681 |
+
"name": "Adam Harvey",
|
3682 |
+
"email": "aharvey@php.net"
|
3683 |
+
},
|
3684 |
+
{
|
3685 |
+
"name": "Bernhard Schussek",
|
3686 |
+
"email": "bschussek@gmail.com"
|
3687 |
+
}
|
3688 |
+
],
|
3689 |
+
"description": "Provides the functionality to export PHP variables for visualization",
|
3690 |
+
"homepage": "http://www.github.com/sebastianbergmann/exporter",
|
3691 |
+
"keywords": [
|
3692 |
+
"export",
|
3693 |
+
"exporter"
|
3694 |
+
],
|
3695 |
+
"time": "2019-09-14T09:02:43+00:00"
|
3696 |
+
},
|
3697 |
+
{
|
3698 |
+
"name": "sebastian/global-state",
|
3699 |
+
"version": "3.0.0",
|
3700 |
+
"source": {
|
3701 |
+
"type": "git",
|
3702 |
+
"url": "https://github.com/sebastianbergmann/global-state.git",
|
3703 |
+
"reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4"
|
3704 |
+
},
|
3705 |
+
"dist": {
|
3706 |
+
"type": "zip",
|
3707 |
+
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
|
3708 |
+
"reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
|
3709 |
+
"shasum": ""
|
3710 |
+
},
|
3711 |
+
"require": {
|
3712 |
+
"php": "^7.2",
|
3713 |
+
"sebastian/object-reflector": "^1.1.1",
|
3714 |
+
"sebastian/recursion-context": "^3.0"
|
3715 |
+
},
|
3716 |
+
"require-dev": {
|
3717 |
+
"ext-dom": "*",
|
3718 |
+
"phpunit/phpunit": "^8.0"
|
3719 |
+
},
|
3720 |
+
"suggest": {
|
3721 |
+
"ext-uopz": "*"
|
3722 |
+
},
|
3723 |
+
"type": "library",
|
3724 |
+
"extra": {
|
3725 |
+
"branch-alias": {
|
3726 |
+
"dev-master": "3.0-dev"
|
3727 |
+
}
|
3728 |
+
},
|
3729 |
+
"autoload": {
|
3730 |
+
"classmap": [
|
3731 |
+
"src/"
|
3732 |
+
]
|
3733 |
+
},
|
3734 |
+
"notification-url": "https://packagist.org/downloads/",
|
3735 |
+
"license": [
|
3736 |
+
"BSD-3-Clause"
|
3737 |
+
],
|
3738 |
+
"authors": [
|
3739 |
+
{
|
3740 |
+
"name": "Sebastian Bergmann",
|
3741 |
+
"email": "sebastian@phpunit.de"
|
3742 |
+
}
|
3743 |
+
],
|
3744 |
+
"description": "Snapshotting of global state",
|
3745 |
+
"homepage": "http://www.github.com/sebastianbergmann/global-state",
|
3746 |
+
"keywords": [
|
3747 |
+
"global state"
|
3748 |
+
],
|
3749 |
+
"time": "2019-02-01T05:30:01+00:00"
|
3750 |
+
},
|
3751 |
+
{
|
3752 |
+
"name": "sebastian/object-enumerator",
|
3753 |
+
"version": "3.0.3",
|
3754 |
+
"source": {
|
3755 |
+
"type": "git",
|
3756 |
+
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
|
3757 |
+
"reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
|
3758 |
+
},
|
3759 |
+
"dist": {
|
3760 |
+
"type": "zip",
|
3761 |
+
"url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
|
3762 |
+
"reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
|
3763 |
+
"shasum": ""
|
3764 |
+
},
|
3765 |
+
"require": {
|
3766 |
+
"php": "^7.0",
|
3767 |
+
"sebastian/object-reflector": "^1.1.1",
|
3768 |
+
"sebastian/recursion-context": "^3.0"
|
3769 |
+
},
|
3770 |
+
"require-dev": {
|
3771 |
+
"phpunit/phpunit": "^6.0"
|
3772 |
+
},
|
3773 |
+
"type": "library",
|
3774 |
+
"extra": {
|
3775 |
+
"branch-alias": {
|
3776 |
+
"dev-master": "3.0.x-dev"
|
3777 |
+
}
|
3778 |
+
},
|
3779 |
+
"autoload": {
|
3780 |
+
"classmap": [
|
3781 |
+
"src/"
|
3782 |
+
]
|
3783 |
+
},
|
3784 |
+
"notification-url": "https://packagist.org/downloads/",
|
3785 |
+
"license": [
|
3786 |
+
"BSD-3-Clause"
|
3787 |
+
],
|
3788 |
+
"authors": [
|
3789 |
+
{
|
3790 |
+
"name": "Sebastian Bergmann",
|
3791 |
+
"email": "sebastian@phpunit.de"
|
3792 |
+
}
|
3793 |
+
],
|
3794 |
+
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
|
3795 |
+
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
|
3796 |
+
"time": "2017-08-03T12:35:26+00:00"
|
3797 |
+
},
|
3798 |
+
{
|
3799 |
+
"name": "sebastian/object-reflector",
|
3800 |
+
"version": "1.1.1",
|
3801 |
+
"source": {
|
3802 |
+
"type": "git",
|
3803 |
+
"url": "https://github.com/sebastianbergmann/object-reflector.git",
|
3804 |
+
"reference": "773f97c67f28de00d397be301821b06708fca0be"
|
3805 |
+
},
|
3806 |
+
"dist": {
|
3807 |
+
"type": "zip",
|
3808 |
+
"url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
|
3809 |
+
"reference": "773f97c67f28de00d397be301821b06708fca0be",
|
3810 |
+
"shasum": ""
|
3811 |
+
},
|
3812 |
+
"require": {
|
3813 |
+
"php": "^7.0"
|
3814 |
+
},
|
3815 |
+
"require-dev": {
|
3816 |
+
"phpunit/phpunit": "^6.0"
|
3817 |
+
},
|
3818 |
+
"type": "library",
|
3819 |
+
"extra": {
|
3820 |
+
"branch-alias": {
|
3821 |
+
"dev-master": "1.1-dev"
|
3822 |
+
}
|
3823 |
+
},
|
3824 |
+
"autoload": {
|
3825 |
+
"classmap": [
|
3826 |
+
"src/"
|
3827 |
+
]
|
3828 |
+
},
|
3829 |
+
"notification-url": "https://packagist.org/downloads/",
|
3830 |
+
"license": [
|
3831 |
+
"BSD-3-Clause"
|
3832 |
+
],
|
3833 |
+
"authors": [
|
3834 |
+
{
|
3835 |
+
"name": "Sebastian Bergmann",
|
3836 |
+
"email": "sebastian@phpunit.de"
|
3837 |
+
}
|
3838 |
+
],
|
3839 |
+
"description": "Allows reflection of object attributes, including inherited and non-public ones",
|
3840 |
+
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
|
3841 |
+
"time": "2017-03-29T09:07:27+00:00"
|
3842 |
+
},
|
3843 |
+
{
|
3844 |
+
"name": "sebastian/recursion-context",
|
3845 |
+
"version": "3.0.0",
|
3846 |
+
"source": {
|
3847 |
+
"type": "git",
|
3848 |
+
"url": "https://github.com/sebastianbergmann/recursion-context.git",
|
3849 |
+
"reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
|
3850 |
+
},
|
3851 |
+
"dist": {
|
3852 |
+
"type": "zip",
|
3853 |
+
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
|
3854 |
+
"reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
|
3855 |
+
"shasum": ""
|
3856 |
+
},
|
3857 |
+
"require": {
|
3858 |
+
"php": "^7.0"
|
3859 |
+
},
|
3860 |
+
"require-dev": {
|
3861 |
+
"phpunit/phpunit": "^6.0"
|
3862 |
+
},
|
3863 |
+
"type": "library",
|
3864 |
+
"extra": {
|
3865 |
+
"branch-alias": {
|
3866 |
+
"dev-master": "3.0.x-dev"
|
3867 |
+
}
|
3868 |
+
},
|
3869 |
+
"autoload": {
|
3870 |
+
"classmap": [
|
3871 |
+
"src/"
|
3872 |
+
]
|
3873 |
+
},
|
3874 |
+
"notification-url": "https://packagist.org/downloads/",
|
3875 |
+
"license": [
|
3876 |
+
"BSD-3-Clause"
|
3877 |
+
],
|
3878 |
+
"authors": [
|
3879 |
+
{
|
3880 |
+
"name": "Jeff Welch",
|
3881 |
+
"email": "whatthejeff@gmail.com"
|
3882 |
+
},
|
3883 |
+
{
|
3884 |
+
"name": "Sebastian Bergmann",
|
3885 |
+
"email": "sebastian@phpunit.de"
|
3886 |
+
},
|
3887 |
+
{
|
3888 |
+
"name": "Adam Harvey",
|
3889 |
+
"email": "aharvey@php.net"
|
3890 |
+
}
|
3891 |
+
],
|
3892 |
+
"description": "Provides functionality to recursively process PHP variables",
|
3893 |
+
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
|
3894 |
+
"time": "2017-03-03T06:23:57+00:00"
|
3895 |
+
},
|
3896 |
+
{
|
3897 |
+
"name": "sebastian/resource-operations",
|
3898 |
+
"version": "2.0.1",
|
3899 |
+
"source": {
|
3900 |
+
"type": "git",
|
3901 |
+
"url": "https://github.com/sebastianbergmann/resource-operations.git",
|
3902 |
+
"reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9"
|
3903 |
+
},
|
3904 |
+
"dist": {
|
3905 |
+
"type": "zip",
|
3906 |
+
"url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
|
3907 |
+
"reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
|
3908 |
+
"shasum": ""
|
3909 |
+
},
|
3910 |
+
"require": {
|
3911 |
+
"php": "^7.1"
|
3912 |
+
},
|
3913 |
+
"type": "library",
|
3914 |
+
"extra": {
|
3915 |
+
"branch-alias": {
|
3916 |
+
"dev-master": "2.0-dev"
|
3917 |
+
}
|
3918 |
+
},
|
3919 |
+
"autoload": {
|
3920 |
+
"classmap": [
|
3921 |
+
"src/"
|
3922 |
+
]
|
3923 |
+
},
|
3924 |
+
"notification-url": "https://packagist.org/downloads/",
|
3925 |
+
"license": [
|
3926 |
+
"BSD-3-Clause"
|
3927 |
+
],
|
3928 |
+
"authors": [
|
3929 |
+
{
|
3930 |
+
"name": "Sebastian Bergmann",
|
3931 |
+
"email": "sebastian@phpunit.de"
|
3932 |
+
}
|
3933 |
+
],
|
3934 |
+
"description": "Provides a list of PHP built-in functions that operate on resources",
|
3935 |
+
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
|
3936 |
+
"time": "2018-10-04T04:07:39+00:00"
|
3937 |
+
},
|
3938 |
+
{
|
3939 |
+
"name": "sebastian/type",
|
3940 |
+
"version": "1.1.3",
|
3941 |
+
"source": {
|
3942 |
+
"type": "git",
|
3943 |
+
"url": "https://github.com/sebastianbergmann/type.git",
|
3944 |
+
"reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3"
|
3945 |
+
},
|
3946 |
+
"dist": {
|
3947 |
+
"type": "zip",
|
3948 |
+
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3",
|
3949 |
+
"reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3",
|
3950 |
+
"shasum": ""
|
3951 |
+
},
|
3952 |
+
"require": {
|
3953 |
+
"php": "^7.2"
|
3954 |
+
},
|
3955 |
+
"require-dev": {
|
3956 |
+
"phpunit/phpunit": "^8.2"
|
3957 |
+
},
|
3958 |
+
"type": "library",
|
3959 |
+
"extra": {
|
3960 |
+
"branch-alias": {
|
3961 |
+
"dev-master": "1.1-dev"
|
3962 |
+
}
|
3963 |
+
},
|
3964 |
+
"autoload": {
|
3965 |
+
"classmap": [
|
3966 |
+
"src/"
|
3967 |
+
]
|
3968 |
+
},
|
3969 |
+
"notification-url": "https://packagist.org/downloads/",
|
3970 |
+
"license": [
|
3971 |
+
"BSD-3-Clause"
|
3972 |
+
],
|
3973 |
+
"authors": [
|
3974 |
+
{
|
3975 |
+
"name": "Sebastian Bergmann",
|
3976 |
+
"email": "sebastian@phpunit.de",
|
3977 |
+
"role": "lead"
|
3978 |
+
}
|
3979 |
+
],
|
3980 |
+
"description": "Collection of value objects that represent the types of the PHP type system",
|
3981 |
+
"homepage": "https://github.com/sebastianbergmann/type",
|
3982 |
+
"time": "2019-07-02T08:10:15+00:00"
|
3983 |
+
},
|
3984 |
+
{
|
3985 |
+
"name": "sebastian/version",
|
3986 |
+
"version": "2.0.1",
|
3987 |
+
"source": {
|
3988 |
+
"type": "git",
|
3989 |
+
"url": "https://github.com/sebastianbergmann/version.git",
|
3990 |
+
"reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
|
3991 |
+
},
|
3992 |
+
"dist": {
|
3993 |
+
"type": "zip",
|
3994 |
+
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
|
3995 |
+
"reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
|
3996 |
+
"shasum": ""
|
3997 |
+
},
|
3998 |
+
"require": {
|
3999 |
+
"php": ">=5.6"
|
4000 |
+
},
|
4001 |
+
"type": "library",
|
4002 |
+
"extra": {
|
4003 |
+
"branch-alias": {
|
4004 |
+
"dev-master": "2.0.x-dev"
|
4005 |
+
}
|
4006 |
+
},
|
4007 |
+
"autoload": {
|
4008 |
+
"classmap": [
|
4009 |
+
"src/"
|
4010 |
+
]
|
4011 |
+
},
|
4012 |
+
"notification-url": "https://packagist.org/downloads/",
|
4013 |
+
"license": [
|
4014 |
+
"BSD-3-Clause"
|
4015 |
+
],
|
4016 |
+
"authors": [
|
4017 |
+
{
|
4018 |
+
"name": "Sebastian Bergmann",
|
4019 |
+
"email": "sebastian@phpunit.de",
|
4020 |
+
"role": "lead"
|
4021 |
+
}
|
4022 |
+
],
|
4023 |
+
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
|
4024 |
+
"homepage": "https://github.com/sebastianbergmann/version",
|
4025 |
+
"time": "2016-10-03T07:35:21+00:00"
|
4026 |
+
},
|
4027 |
+
{
|
4028 |
+
"name": "seld/jsonlint",
|
4029 |
+
"version": "1.7.2",
|
4030 |
+
"source": {
|
4031 |
+
"type": "git",
|
4032 |
+
"url": "https://github.com/Seldaek/jsonlint.git",
|
4033 |
+
"reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19"
|
4034 |
+
},
|
4035 |
+
"dist": {
|
4036 |
+
"type": "zip",
|
4037 |
+
"url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19",
|
4038 |
+
"reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19",
|
4039 |
+
"shasum": ""
|
4040 |
+
},
|
4041 |
+
"require": {
|
4042 |
+
"php": "^5.3 || ^7.0"
|
4043 |
+
},
|
4044 |
+
"require-dev": {
|
4045 |
+
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
|
4046 |
+
},
|
4047 |
+
"bin": [
|
4048 |
+
"bin/jsonlint"
|
4049 |
+
],
|
4050 |
+
"type": "library",
|
4051 |
+
"autoload": {
|
4052 |
+
"psr-4": {
|
4053 |
+
"Seld\\JsonLint\\": "src/Seld/JsonLint/"
|
4054 |
+
}
|
4055 |
+
},
|
4056 |
+
"notification-url": "https://packagist.org/downloads/",
|
4057 |
+
"license": [
|
4058 |
+
"MIT"
|
4059 |
+
],
|
4060 |
+
"authors": [
|
4061 |
+
{
|
4062 |
+
"name": "Jordi Boggiano",
|
4063 |
+
"email": "j.boggiano@seld.be",
|
4064 |
+
"homepage": "http://seld.be"
|
4065 |
+
}
|
4066 |
+
],
|
4067 |
+
"description": "JSON Linter",
|
4068 |
+
"keywords": [
|
4069 |
+
"json",
|
4070 |
+
"linter",
|
4071 |
+
"parser",
|
4072 |
+
"validator"
|
4073 |
+
],
|
4074 |
+
"time": "2019-10-24T14:27:39+00:00"
|
4075 |
+
},
|
4076 |
+
{
|
4077 |
+
"name": "seld/phar-utils",
|
4078 |
+
"version": "1.1.0",
|
4079 |
+
"source": {
|
4080 |
+
"type": "git",
|
4081 |
+
"url": "https://github.com/Seldaek/phar-utils.git",
|
4082 |
+
"reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0"
|
4083 |
+
},
|
4084 |
+
"dist": {
|
4085 |
+
"type": "zip",
|
4086 |
+
"url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0",
|
4087 |
+
"reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0",
|
4088 |
+
"shasum": ""
|
4089 |
+
},
|
4090 |
+
"require": {
|
4091 |
+
"php": ">=5.3"
|
4092 |
+
},
|
4093 |
+
"type": "library",
|
4094 |
+
"extra": {
|
4095 |
+
"branch-alias": {
|
4096 |
+
"dev-master": "1.x-dev"
|
4097 |
+
}
|
4098 |
+
},
|
4099 |
+
"autoload": {
|
4100 |
+
"psr-4": {
|
4101 |
+
"Seld\\PharUtils\\": "src/"
|
4102 |
+
}
|
4103 |
+
},
|
4104 |
+
"notification-url": "https://packagist.org/downloads/",
|
4105 |
+
"license": [
|
4106 |
+
"MIT"
|
4107 |
+
],
|
4108 |
+
"authors": [
|
4109 |
+
{
|
4110 |
+
"name": "Jordi Boggiano",
|
4111 |
+
"email": "j.boggiano@seld.be"
|
4112 |
+
}
|
4113 |
+
],
|
4114 |
+
"description": "PHAR file format utilities, for when PHP phars you up",
|
4115 |
+
"keywords": [
|
4116 |
+
"phar"
|
4117 |
+
],
|
4118 |
+
"time": "2020-02-14T15:25:33+00:00"
|
4119 |
+
},
|
4120 |
+
{
|
4121 |
+
"name": "symfony/browser-kit",
|
4122 |
+
"version": "v4.4.5",
|
4123 |
+
"source": {
|
4124 |
+
"type": "git",
|
4125 |
+
"url": "https://github.com/symfony/browser-kit.git",
|
4126 |
+
"reference": "090ce406505149d6852a7c03b0346dec3b8cf612"
|
4127 |
+
},
|
4128 |
+
"dist": {
|
4129 |
+
"type": "zip",
|
4130 |
+
"url": "https://api.github.com/repos/symfony/browser-kit/zipball/090ce406505149d6852a7c03b0346dec3b8cf612",
|
4131 |
+
"reference": "090ce406505149d6852a7c03b0346dec3b8cf612",
|
4132 |
+
"shasum": ""
|
4133 |
+
},
|
4134 |
+
"require": {
|
4135 |
+
"php": "^7.1.3",
|
4136 |
+
"symfony/dom-crawler": "^3.4|^4.0|^5.0"
|
4137 |
+
},
|
4138 |
+
"require-dev": {
|
4139 |
+
"symfony/css-selector": "^3.4|^4.0|^5.0",
|
4140 |
+
"symfony/http-client": "^4.3|^5.0",
|
4141 |
+
"symfony/mime": "^4.3|^5.0",
|
4142 |
+
"symfony/process": "^3.4|^4.0|^5.0"
|
4143 |
+
},
|
4144 |
+
"suggest": {
|
4145 |
+
"symfony/process": ""
|
4146 |
+
},
|
4147 |
+
"type": "library",
|
4148 |
+
"extra": {
|
4149 |
+
"branch-alias": {
|
4150 |
+
"dev-master": "4.4-dev"
|
4151 |
+
}
|
4152 |
+
},
|
4153 |
+
"autoload": {
|
4154 |
+
"psr-4": {
|
4155 |
+
"Symfony\\Component\\BrowserKit\\": ""
|
4156 |
+
},
|
4157 |
+
"exclude-from-classmap": [
|
4158 |
+
"/Tests/"
|
4159 |
+
]
|
4160 |
+
},
|
4161 |
+
"notification-url": "https://packagist.org/downloads/",
|
4162 |
+
"license": [
|
4163 |
+
"MIT"
|
4164 |
+
],
|
4165 |
+
"authors": [
|
4166 |
+
{
|
4167 |
+
"name": "Fabien Potencier",
|
4168 |
+
"email": "fabien@symfony.com"
|
4169 |
+
},
|
4170 |
+
{
|
4171 |
+
"name": "Symfony Community",
|
4172 |
+
"homepage": "https://symfony.com/contributors"
|
4173 |
+
}
|
4174 |
+
],
|
4175 |
+
"description": "Symfony BrowserKit Component",
|
4176 |
+
"homepage": "https://symfony.com",
|
4177 |
+
"time": "2020-02-23T10:00:59+00:00"
|
4178 |
+
},
|
4179 |
+
{
|
4180 |
+
"name": "symfony/console",
|
4181 |
+
"version": "v4.4.5",
|
4182 |
+
"source": {
|
4183 |
+
"type": "git",
|
4184 |
+
"url": "https://github.com/symfony/console.git",
|
4185 |
+
"reference": "4fa15ae7be74e53f6ec8c83ed403b97e23b665e9"
|
4186 |
+
},
|
4187 |
+
"dist": {
|
4188 |
+
"type": "zip",
|
4189 |
+
"url": "https://api.github.com/repos/symfony/console/zipball/4fa15ae7be74e53f6ec8c83ed403b97e23b665e9",
|
4190 |
+
"reference": "4fa15ae7be74e53f6ec8c83ed403b97e23b665e9",
|
4191 |
+
"shasum": ""
|
4192 |
+
},
|
4193 |
+
"require": {
|
4194 |
+
"php": "^7.1.3",
|
4195 |
+
"symfony/polyfill-mbstring": "~1.0",
|
4196 |
+
"symfony/polyfill-php73": "^1.8",
|
4197 |
+
"symfony/service-contracts": "^1.1|^2"
|
4198 |
+
},
|
4199 |
+
"conflict": {
|
4200 |
+
"symfony/dependency-injection": "<3.4",
|
4201 |
+
"symfony/event-dispatcher": "<4.3|>=5",
|
4202 |
+
"symfony/lock": "<4.4",
|
4203 |
+
"symfony/process": "<3.3"
|
4204 |
+
},
|
4205 |
+
"provide": {
|
4206 |
+
"psr/log-implementation": "1.0"
|
4207 |
+
},
|
4208 |
+
"require-dev": {
|
4209 |
+
"psr/log": "~1.0",
|
4210 |
+
"symfony/config": "^3.4|^4.0|^5.0",
|
4211 |
+
"symfony/dependency-injection": "^3.4|^4.0|^5.0",
|
4212 |
+
"symfony/event-dispatcher": "^4.3",
|
4213 |
+
"symfony/lock": "^4.4|^5.0",
|
4214 |
+
"symfony/process": "^3.4|^4.0|^5.0",
|
4215 |
+
"symfony/var-dumper": "^4.3|^5.0"
|
4216 |
+
},
|
4217 |
+
"suggest": {
|
4218 |
+
"psr/log": "For using the console logger",
|
4219 |
+
"symfony/event-dispatcher": "",
|
4220 |
+
"symfony/lock": "",
|
4221 |
+
"symfony/process": ""
|
4222 |
+
},
|
4223 |
+
"type": "library",
|
4224 |
+
"extra": {
|
4225 |
+
"branch-alias": {
|
4226 |
+
"dev-master": "4.4-dev"
|
4227 |
+
}
|
4228 |
+
},
|
4229 |
+
"autoload": {
|
4230 |
+
"psr-4": {
|
4231 |
+
"Symfony\\Component\\Console\\": ""
|
4232 |
+
},
|
4233 |
+
"exclude-from-classmap": [
|
4234 |
+
"/Tests/"
|
4235 |
+
]
|
4236 |
+
},
|
4237 |
+
"notification-url": "https://packagist.org/downloads/",
|
4238 |
+
"license": [
|
4239 |
+
"MIT"
|
4240 |
+
],
|
4241 |
+
"authors": [
|
4242 |
+
{
|
4243 |
+
"name": "Fabien Potencier",
|
4244 |
+
"email": "fabien@symfony.com"
|
4245 |
+
},
|
4246 |
+
{
|
4247 |
+
"name": "Symfony Community",
|
4248 |
+
"homepage": "https://symfony.com/contributors"
|
4249 |
+
}
|
4250 |
+
],
|
4251 |
+
"description": "Symfony Console Component",
|
4252 |
+
"homepage": "https://symfony.com",
|
4253 |
+
"time": "2020-02-24T13:10:00+00:00"
|
4254 |
+
},
|
4255 |
+
{
|
4256 |
+
"name": "symfony/css-selector",
|
4257 |
+
"version": "v4.4.5",
|
4258 |
+
"source": {
|
4259 |
+
"type": "git",
|
4260 |
+
"url": "https://github.com/symfony/css-selector.git",
|
4261 |
+
"reference": "d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22"
|
4262 |
+
},
|
4263 |
+
"dist": {
|
4264 |
+
"type": "zip",
|
4265 |
+
"url": "https://api.github.com/repos/symfony/css-selector/zipball/d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22",
|
4266 |
+
"reference": "d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22",
|
4267 |
+
"shasum": ""
|
4268 |
+
},
|
4269 |
+
"require": {
|
4270 |
+
"php": "^7.1.3"
|
4271 |
+
},
|
4272 |
+
"type": "library",
|
4273 |
+
"extra": {
|
4274 |
+
"branch-alias": {
|
4275 |
+
"dev-master": "4.4-dev"
|
4276 |
+
}
|
4277 |
+
},
|
4278 |
+
"autoload": {
|
4279 |
+
"psr-4": {
|
4280 |
+
"Symfony\\Component\\CssSelector\\": ""
|
4281 |
+
},
|
4282 |
+
"exclude-from-classmap": [
|
4283 |
+
"/Tests/"
|
4284 |
+
]
|
4285 |
+
},
|
4286 |
+
"notification-url": "https://packagist.org/downloads/",
|
4287 |
+
"license": [
|
4288 |
+
"MIT"
|
4289 |
+
],
|
4290 |
+
"authors": [
|
4291 |
+
{
|
4292 |
+
"name": "Fabien Potencier",
|
4293 |
+
"email": "fabien@symfony.com"
|
4294 |
+
},
|
4295 |
+
{
|
4296 |
+
"name": "Jean-François Simon",
|
4297 |
+
"email": "jeanfrancois.simon@sensiolabs.com"
|
4298 |
+
},
|
4299 |
+
{
|
4300 |
+
"name": "Symfony Community",
|
4301 |
+
"homepage": "https://symfony.com/contributors"
|
4302 |
+
}
|
4303 |
+
],
|
4304 |
+
"description": "Symfony CssSelector Component",
|
4305 |
+
"homepage": "https://symfony.com",
|
4306 |
+
"time": "2020-02-04T09:01:01+00:00"
|
4307 |
+
},
|
4308 |
+
{
|
4309 |
+
"name": "symfony/dom-crawler",
|
4310 |
+
"version": "v4.4.5",
|
4311 |
+
"source": {
|
4312 |
+
"type": "git",
|
4313 |
+
"url": "https://github.com/symfony/dom-crawler.git",
|
4314 |
+
"reference": "11dcf08f12f29981bf770f097a5d64d65bce5929"
|
4315 |
+
},
|
4316 |
+
"dist": {
|
4317 |
+
"type": "zip",
|
4318 |
+
"url": "https://api.github.com/repos/symfony/dom-crawler/zipball/11dcf08f12f29981bf770f097a5d64d65bce5929",
|
4319 |
+
"reference": "11dcf08f12f29981bf770f097a5d64d65bce5929",
|
4320 |
+
"shasum": ""
|
4321 |
+
},
|
4322 |
+
"require": {
|
4323 |
+
"php": "^7.1.3",
|
4324 |
+
"symfony/polyfill-ctype": "~1.8",
|
4325 |
+
"symfony/polyfill-mbstring": "~1.0"
|
4326 |
+
},
|
4327 |
+
"conflict": {
|
4328 |
+
"masterminds/html5": "<2.6"
|
4329 |
+
},
|
4330 |
+
"require-dev": {
|
4331 |
+
"masterminds/html5": "^2.6",
|
4332 |
+
"symfony/css-selector": "^3.4|^4.0|^5.0"
|
4333 |
+
},
|
4334 |
+
"suggest": {
|
4335 |
+
"symfony/css-selector": ""
|
4336 |
+
},
|
4337 |
+
"type": "library",
|
4338 |
+
"extra": {
|
4339 |
+
"branch-alias": {
|
4340 |
+
"dev-master": "4.4-dev"
|
4341 |
+
}
|
4342 |
+
},
|
4343 |
+
"autoload": {
|
4344 |
+
"psr-4": {
|
4345 |
+
"Symfony\\Component\\DomCrawler\\": ""
|
4346 |
+
},
|
4347 |
+
"exclude-from-classmap": [
|
4348 |
+
"/Tests/"
|
4349 |
+
]
|
4350 |
+
},
|
4351 |
+
"notification-url": "https://packagist.org/downloads/",
|
4352 |
+
"license": [
|
4353 |
+
"MIT"
|
4354 |
+
],
|
4355 |
+
"authors": [
|
4356 |
+
{
|
4357 |
+
"name": "Fabien Potencier",
|
4358 |
+
"email": "fabien@symfony.com"
|
4359 |
+
},
|
4360 |
+
{
|
4361 |
+
"name": "Symfony Community",
|
4362 |
+
"homepage": "https://symfony.com/contributors"
|
4363 |
+
}
|
4364 |
+
],
|
4365 |
+
"description": "Symfony DomCrawler Component",
|
4366 |
+
"homepage": "https://symfony.com",
|
4367 |
+
"time": "2020-02-29T10:05:28+00:00"
|
4368 |
+
},
|
4369 |
+
{
|
4370 |
+
"name": "symfony/event-dispatcher",
|
4371 |
+
"version": "v4.4.5",
|
4372 |
+
"source": {
|
4373 |
+
"type": "git",
|
4374 |
+
"url": "https://github.com/symfony/event-dispatcher.git",
|
4375 |
+
"reference": "4ad8e149799d3128621a3a1f70e92b9897a8930d"
|
4376 |
+
},
|
4377 |
+
"dist": {
|
4378 |
+
"type": "zip",
|
4379 |
+
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4ad8e149799d3128621a3a1f70e92b9897a8930d",
|
4380 |
+
"reference": "4ad8e149799d3128621a3a1f70e92b9897a8930d",
|
4381 |
+
"shasum": ""
|
4382 |
+
},
|
4383 |
+
"require": {
|
4384 |
+
"php": "^7.1.3",
|
4385 |
+
"symfony/event-dispatcher-contracts": "^1.1"
|
4386 |
+
},
|
4387 |
+
"conflict": {
|
4388 |
+
"symfony/dependency-injection": "<3.4"
|
4389 |
+
},
|
4390 |
+
"provide": {
|
4391 |
+
"psr/event-dispatcher-implementation": "1.0",
|
4392 |
+
"symfony/event-dispatcher-implementation": "1.1"
|
4393 |
+
},
|
4394 |
+
"require-dev": {
|
4395 |
+
"psr/log": "~1.0",
|
4396 |
+
"symfony/config": "^3.4|^4.0|^5.0",
|
4397 |
+
"symfony/dependency-injection": "^3.4|^4.0|^5.0",
|
4398 |
+
"symfony/expression-language": "^3.4|^4.0|^5.0",
|
4399 |
+
"symfony/http-foundation": "^3.4|^4.0|^5.0",
|
4400 |
+
"symfony/service-contracts": "^1.1|^2",
|
4401 |
+
"symfony/stopwatch": "^3.4|^4.0|^5.0"
|
4402 |
+
},
|
4403 |
+
"suggest": {
|
4404 |
+
"symfony/dependency-injection": "",
|
4405 |
+
"symfony/http-kernel": ""
|
4406 |
+
},
|
4407 |
+
"type": "library",
|
4408 |
+
"extra": {
|
4409 |
+
"branch-alias": {
|
4410 |
+
"dev-master": "4.4-dev"
|
4411 |
+
}
|
4412 |
+
},
|
4413 |
+
"autoload": {
|
4414 |
+
"psr-4": {
|
4415 |
+
"Symfony\\Component\\EventDispatcher\\": ""
|
4416 |
+
},
|
4417 |
+
"exclude-from-classmap": [
|
4418 |
+
"/Tests/"
|
4419 |
+
]
|
4420 |
+
},
|
4421 |
+
"notification-url": "https://packagist.org/downloads/",
|
4422 |
+
"license": [
|
4423 |
+
"MIT"
|
4424 |
+
],
|
4425 |
+
"authors": [
|
4426 |
+
{
|
4427 |
+
"name": "Fabien Potencier",
|
4428 |
+
"email": "fabien@symfony.com"
|
4429 |
+
},
|
4430 |
+
{
|
4431 |
+
"name": "Symfony Community",
|
4432 |
+
"homepage": "https://symfony.com/contributors"
|
4433 |
+
}
|
4434 |
+
],
|
4435 |
+
"description": "Symfony EventDispatcher Component",
|
4436 |
+
"homepage": "https://symfony.com",
|
4437 |
+
"time": "2020-02-04T09:32:40+00:00"
|
4438 |
+
},
|
4439 |
+
{
|
4440 |
+
"name": "symfony/event-dispatcher-contracts",
|
4441 |
+
"version": "v1.1.7",
|
4442 |
+
"source": {
|
4443 |
+
"type": "git",
|
4444 |
+
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
|
4445 |
+
"reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18"
|
4446 |
+
},
|
4447 |
+
"dist": {
|
4448 |
+
"type": "zip",
|
4449 |
+
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c43ab685673fb6c8d84220c77897b1d6cdbe1d18",
|
4450 |
+
"reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18",
|
4451 |
+
"shasum": ""
|
4452 |
+
},
|
4453 |
+
"require": {
|
4454 |
+
"php": "^7.1.3"
|
4455 |
+
},
|
4456 |
+
"suggest": {
|
4457 |
+
"psr/event-dispatcher": "",
|
4458 |
+
"symfony/event-dispatcher-implementation": ""
|
4459 |
+
},
|
4460 |
+
"type": "library",
|
4461 |
+
"extra": {
|
4462 |
+
"branch-alias": {
|
4463 |
+
"dev-master": "1.1-dev"
|
4464 |
+
}
|
4465 |
+
},
|
4466 |
+
"autoload": {
|
4467 |
+
"psr-4": {
|
4468 |
+
"Symfony\\Contracts\\EventDispatcher\\": ""
|
4469 |
+
}
|
4470 |
+
},
|
4471 |
+
"notification-url": "https://packagist.org/downloads/",
|
4472 |
+
"license": [
|
4473 |
+
"MIT"
|
4474 |
+
],
|
4475 |
+
"authors": [
|
4476 |
+
{
|
4477 |
+
"name": "Nicolas Grekas",
|
4478 |
+
"email": "p@tchwork.com"
|
4479 |
+
},
|
4480 |
+
{
|
4481 |
+
"name": "Symfony Community",
|
4482 |
+
"homepage": "https://symfony.com/contributors"
|
4483 |
+
}
|
4484 |
+
],
|
4485 |
+
"description": "Generic abstractions related to dispatching event",
|
4486 |
+
"homepage": "https://symfony.com",
|
4487 |
+
"keywords": [
|
4488 |
+
"abstractions",
|
4489 |
+
"contracts",
|
4490 |
+
"decoupling",
|
4491 |
+
"interfaces",
|
4492 |
+
"interoperability",
|
4493 |
+
"standards"
|
4494 |
+
],
|
4495 |
+
"time": "2019-09-17T09:54:03+00:00"
|
4496 |
+
},
|
4497 |
+
{
|
4498 |
+
"name": "symfony/filesystem",
|
4499 |
+
"version": "v3.4.38",
|
4500 |
+
"source": {
|
4501 |
+
"type": "git",
|
4502 |
+
"url": "https://github.com/symfony/filesystem.git",
|
4503 |
+
"reference": "0a0d3b4bda11aa3a0464531c40e681e184e75628"
|
4504 |
+
},
|
4505 |
+
"dist": {
|
4506 |
+
"type": "zip",
|
4507 |
+
"url": "https://api.github.com/repos/symfony/filesystem/zipball/0a0d3b4bda11aa3a0464531c40e681e184e75628",
|
4508 |
+
"reference": "0a0d3b4bda11aa3a0464531c40e681e184e75628",
|
4509 |
+
"shasum": ""
|
4510 |
+
},
|
4511 |
+
"require": {
|
4512 |
+
"php": "^5.5.9|>=7.0.8",
|
4513 |
+
"symfony/polyfill-ctype": "~1.8"
|
4514 |
+
},
|
4515 |
+
"type": "library",
|
4516 |
+
"extra": {
|
4517 |
+
"branch-alias": {
|
4518 |
+
"dev-master": "3.4-dev"
|
4519 |
+
}
|
4520 |
+
},
|
4521 |
+
"autoload": {
|
4522 |
+
"psr-4": {
|
4523 |
+
"Symfony\\Component\\Filesystem\\": ""
|
4524 |
+
},
|
4525 |
+
"exclude-from-classmap": [
|
4526 |
+
"/Tests/"
|
4527 |
+
]
|
4528 |
+
},
|
4529 |
+
"notification-url": "https://packagist.org/downloads/",
|
4530 |
+
"license": [
|
4531 |
+
"MIT"
|
4532 |
+
],
|
4533 |
+
"authors": [
|
4534 |
+
{
|
4535 |
+
"name": "Fabien Potencier",
|
4536 |
+
"email": "fabien@symfony.com"
|
4537 |
+
},
|
4538 |
+
{
|
4539 |
+
"name": "Symfony Community",
|
4540 |
+
"homepage": "https://symfony.com/contributors"
|
4541 |
+
}
|
4542 |
+
],
|
4543 |
+
"description": "Symfony Filesystem Component",
|
4544 |
+
"homepage": "https://symfony.com",
|
4545 |
+
"time": "2020-01-17T08:50:08+00:00"
|
4546 |
+
},
|
4547 |
+
{
|
4548 |
+
"name": "symfony/finder",
|
4549 |
+
"version": "v4.4.5",
|
4550 |
+
"source": {
|
4551 |
+
"type": "git",
|
4552 |
+
"url": "https://github.com/symfony/finder.git",
|
4553 |
+
"reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357"
|
4554 |
+
},
|
4555 |
+
"dist": {
|
4556 |
+
"type": "zip",
|
4557 |
+
"url": "https://api.github.com/repos/symfony/finder/zipball/ea69c129aed9fdeca781d4b77eb20b62cf5d5357",
|
4558 |
+
"reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357",
|
4559 |
+
"shasum": ""
|
4560 |
+
},
|
4561 |
+
"require": {
|
4562 |
+
"php": "^7.1.3"
|
4563 |
+
},
|
4564 |
+
"type": "library",
|
4565 |
+
"extra": {
|
4566 |
+
"branch-alias": {
|
4567 |
+
"dev-master": "4.4-dev"
|
4568 |
+
}
|
4569 |
+
},
|
4570 |
+
"autoload": {
|
4571 |
+
"psr-4": {
|
4572 |
+
"Symfony\\Component\\Finder\\": ""
|
4573 |
+
},
|
4574 |
+
"exclude-from-classmap": [
|
4575 |
+
"/Tests/"
|
4576 |
+
]
|
4577 |
+
},
|
4578 |
+
"notification-url": "https://packagist.org/downloads/",
|
4579 |
+
"license": [
|
4580 |
+
"MIT"
|
4581 |
+
],
|
4582 |
+
"authors": [
|
4583 |
+
{
|
4584 |
+
"name": "Fabien Potencier",
|
4585 |
+
"email": "fabien@symfony.com"
|
4586 |
+
},
|
4587 |
+
{
|
4588 |
+
"name": "Symfony Community",
|
4589 |
+
"homepage": "https://symfony.com/contributors"
|
4590 |
+
}
|
4591 |
+
],
|
4592 |
+
"description": "Symfony Finder Component",
|
4593 |
+
"homepage": "https://symfony.com",
|
4594 |
+
"time": "2020-02-14T07:42:58+00:00"
|
4595 |
+
},
|
4596 |
+
{
|
4597 |
+
"name": "symfony/polyfill-ctype",
|
4598 |
+
"version": "v1.14.0",
|
4599 |
+
"source": {
|
4600 |
+
"type": "git",
|
4601 |
+
"url": "https://github.com/symfony/polyfill-ctype.git",
|
4602 |
+
"reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38"
|
4603 |
+
},
|
4604 |
+
"dist": {
|
4605 |
+
"type": "zip",
|
4606 |
+
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/fbdeaec0df06cf3d51c93de80c7eb76e271f5a38",
|
4607 |
+
"reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38",
|
4608 |
+
"shasum": ""
|
4609 |
+
},
|
4610 |
+
"require": {
|
4611 |
+
"php": ">=5.3.3"
|
4612 |
+
},
|
4613 |
+
"suggest": {
|
4614 |
+
"ext-ctype": "For best performance"
|
4615 |
+
},
|
4616 |
+
"type": "library",
|
4617 |
+
"extra": {
|
4618 |
+
"branch-alias": {
|
4619 |
+
"dev-master": "1.14-dev"
|
4620 |
+
}
|
4621 |
+
},
|
4622 |
+
"autoload": {
|
4623 |
+
"psr-4": {
|
4624 |
+
"Symfony\\Polyfill\\Ctype\\": ""
|
4625 |
+
},
|
4626 |
+
"files": [
|
4627 |
+
"bootstrap.php"
|
4628 |
+
]
|
4629 |
+
},
|
4630 |
+
"notification-url": "https://packagist.org/downloads/",
|
4631 |
+
"license": [
|
4632 |
+
"MIT"
|
4633 |
+
],
|
4634 |
+
"authors": [
|
4635 |
+
{
|
4636 |
+
"name": "Gert de Pagter",
|
4637 |
+
"email": "BackEndTea@gmail.com"
|
4638 |
+
},
|
4639 |
+
{
|
4640 |
+
"name": "Symfony Community",
|
4641 |
+
"homepage": "https://symfony.com/contributors"
|
4642 |
+
}
|
4643 |
+
],
|
4644 |
+
"description": "Symfony polyfill for ctype functions",
|
4645 |
+
"homepage": "https://symfony.com",
|
4646 |
+
"keywords": [
|
4647 |
+
"compatibility",
|
4648 |
+
"ctype",
|
4649 |
+
"polyfill",
|
4650 |
+
"portable"
|
4651 |
+
],
|
4652 |
+
"time": "2020-01-13T11:15:53+00:00"
|
4653 |
+
},
|
4654 |
+
{
|
4655 |
+
"name": "symfony/polyfill-mbstring",
|
4656 |
+
"version": "v1.14.0",
|
4657 |
+
"source": {
|
4658 |
+
"type": "git",
|
4659 |
+
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
4660 |
+
"reference": "34094cfa9abe1f0f14f48f490772db7a775559f2"
|
4661 |
+
},
|
4662 |
+
"dist": {
|
4663 |
+
"type": "zip",
|
4664 |
+
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2",
|
4665 |
+
"reference": "34094cfa9abe1f0f14f48f490772db7a775559f2",
|
4666 |
+
"shasum": ""
|
4667 |
+
},
|
4668 |
+
"require": {
|
4669 |
+
"php": ">=5.3.3"
|
4670 |
+
},
|
4671 |
+
"suggest": {
|
4672 |
+
"ext-mbstring": "For best performance"
|
4673 |
+
},
|
4674 |
+
"type": "library",
|
4675 |
+
"extra": {
|
4676 |
+
"branch-alias": {
|
4677 |
+
"dev-master": "1.14-dev"
|
4678 |
+
}
|
4679 |
+
},
|
4680 |
+
"autoload": {
|
4681 |
+
"psr-4": {
|
4682 |
+
"Symfony\\Polyfill\\Mbstring\\": ""
|
4683 |
+
},
|
4684 |
+
"files": [
|
4685 |
+
"bootstrap.php"
|
4686 |
+
]
|
4687 |
+
},
|
4688 |
+
"notification-url": "https://packagist.org/downloads/",
|
4689 |
+
"license": [
|
4690 |
+
"MIT"
|
4691 |
+
],
|
4692 |
+
"authors": [
|
4693 |
+
{
|
4694 |
+
"name": "Nicolas Grekas",
|
4695 |
+
"email": "p@tchwork.com"
|
4696 |
+
},
|
4697 |
+
{
|
4698 |
+
"name": "Symfony Community",
|
4699 |
+
"homepage": "https://symfony.com/contributors"
|
4700 |
+
}
|
4701 |
+
],
|
4702 |
+
"description": "Symfony polyfill for the Mbstring extension",
|
4703 |
+
"homepage": "https://symfony.com",
|
4704 |
+
"keywords": [
|
4705 |
+
"compatibility",
|
4706 |
+
"mbstring",
|
4707 |
+
"polyfill",
|
4708 |
+
"portable",
|
4709 |
+
"shim"
|
4710 |
+
],
|
4711 |
+
"time": "2020-01-13T11:15:53+00:00"
|
4712 |
+
},
|
4713 |
+
{
|
4714 |
+
"name": "symfony/polyfill-php73",
|
4715 |
+
"version": "v1.14.0",
|
4716 |
+
"source": {
|
4717 |
+
"type": "git",
|
4718 |
+
"url": "https://github.com/symfony/polyfill-php73.git",
|
4719 |
+
"reference": "5e66a0fa1070bf46bec4bea7962d285108edd675"
|
4720 |
+
},
|
4721 |
+
"dist": {
|
4722 |
+
"type": "zip",
|
4723 |
+
"url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/5e66a0fa1070bf46bec4bea7962d285108edd675",
|
4724 |
+
"reference": "5e66a0fa1070bf46bec4bea7962d285108edd675",
|
4725 |
+
"shasum": ""
|
4726 |
+
},
|
4727 |
+
"require": {
|
4728 |
+
"php": ">=5.3.3"
|
4729 |
+
},
|
4730 |
+
"type": "library",
|
4731 |
+
"extra": {
|
4732 |
+
"branch-alias": {
|
4733 |
+
"dev-master": "1.14-dev"
|
4734 |
+
}
|
4735 |
+
},
|
4736 |
+
"autoload": {
|
4737 |
+
"psr-4": {
|
4738 |
+
"Symfony\\Polyfill\\Php73\\": ""
|
4739 |
+
},
|
4740 |
+
"files": [
|
4741 |
+
"bootstrap.php"
|
4742 |
+
],
|
4743 |
+
"classmap": [
|
4744 |
+
"Resources/stubs"
|
4745 |
+
]
|
4746 |
+
},
|
4747 |
+
"notification-url": "https://packagist.org/downloads/",
|
4748 |
+
"license": [
|
4749 |
+
"MIT"
|
4750 |
+
],
|
4751 |
+
"authors": [
|
4752 |
+
{
|
4753 |
+
"name": "Nicolas Grekas",
|
4754 |
+
"email": "p@tchwork.com"
|
4755 |
+
},
|
4756 |
+
{
|
4757 |
+
"name": "Symfony Community",
|
4758 |
+
"homepage": "https://symfony.com/contributors"
|
4759 |
+
}
|
4760 |
+
],
|
4761 |
+
"description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
|
4762 |
+
"homepage": "https://symfony.com",
|
4763 |
+
"keywords": [
|
4764 |
+
"compatibility",
|
4765 |
+
"polyfill",
|
4766 |
+
"portable",
|
4767 |
+
"shim"
|
4768 |
+
],
|
4769 |
+
"time": "2020-01-13T11:15:53+00:00"
|
4770 |
+
},
|
4771 |
+
{
|
4772 |
+
"name": "symfony/process",
|
4773 |
+
"version": "v4.4.5",
|
4774 |
+
"source": {
|
4775 |
+
"type": "git",
|
4776 |
+
"url": "https://github.com/symfony/process.git",
|
4777 |
+
"reference": "bf9166bac906c9e69fb7a11d94875e7ced97bcd7"
|
4778 |
+
},
|
4779 |
+
"dist": {
|
4780 |
+
"type": "zip",
|
4781 |
+
"url": "https://api.github.com/repos/symfony/process/zipball/bf9166bac906c9e69fb7a11d94875e7ced97bcd7",
|
4782 |
+
"reference": "bf9166bac906c9e69fb7a11d94875e7ced97bcd7",
|
4783 |
+
"shasum": ""
|
4784 |
+
},
|
4785 |
+
"require": {
|
4786 |
+
"php": "^7.1.3"
|
4787 |
+
},
|
4788 |
+
"type": "library",
|
4789 |
+
"extra": {
|
4790 |
+
"branch-alias": {
|
4791 |
+
"dev-master": "4.4-dev"
|
4792 |
+
}
|
4793 |
+
},
|
4794 |
+
"autoload": {
|
4795 |
+
"psr-4": {
|
4796 |
+
"Symfony\\Component\\Process\\": ""
|
4797 |
+
},
|
4798 |
+
"exclude-from-classmap": [
|
4799 |
+
"/Tests/"
|
4800 |
+
]
|
4801 |
+
},
|
4802 |
+
"notification-url": "https://packagist.org/downloads/",
|
4803 |
+
"license": [
|
4804 |
+
"MIT"
|
4805 |
+
],
|
4806 |
+
"authors": [
|
4807 |
+
{
|
4808 |
+
"name": "Fabien Potencier",
|
4809 |
+
"email": "fabien@symfony.com"
|
4810 |
+
},
|
4811 |
+
{
|
4812 |
+
"name": "Symfony Community",
|
4813 |
+
"homepage": "https://symfony.com/contributors"
|
4814 |
+
}
|
4815 |
+
],
|
4816 |
+
"description": "Symfony Process Component",
|
4817 |
+
"homepage": "https://symfony.com",
|
4818 |
+
"time": "2020-02-07T20:06:44+00:00"
|
4819 |
+
},
|
4820 |
+
{
|
4821 |
+
"name": "symfony/service-contracts",
|
4822 |
+
"version": "v2.0.1",
|
4823 |
+
"source": {
|
4824 |
+
"type": "git",
|
4825 |
+
"url": "https://github.com/symfony/service-contracts.git",
|
4826 |
+
"reference": "144c5e51266b281231e947b51223ba14acf1a749"
|
4827 |
+
},
|
4828 |
+
"dist": {
|
4829 |
+
"type": "zip",
|
4830 |
+
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/144c5e51266b281231e947b51223ba14acf1a749",
|
4831 |
+
"reference": "144c5e51266b281231e947b51223ba14acf1a749",
|
4832 |
+
"shasum": ""
|
4833 |
+
},
|
4834 |
+
"require": {
|
4835 |
+
"php": "^7.2.5",
|
4836 |
+
"psr/container": "^1.0"
|
4837 |
+
},
|
4838 |
+
"suggest": {
|
4839 |
+
"symfony/service-implementation": ""
|
4840 |
+
},
|
4841 |
+
"type": "library",
|
4842 |
+
"extra": {
|
4843 |
+
"branch-alias": {
|
4844 |
+
"dev-master": "2.0-dev"
|
4845 |
+
}
|
4846 |
+
},
|
4847 |
+
"autoload": {
|
4848 |
+
"psr-4": {
|
4849 |
+
"Symfony\\Contracts\\Service\\": ""
|
4850 |
+
}
|
4851 |
+
},
|
4852 |
+
"notification-url": "https://packagist.org/downloads/",
|
4853 |
+
"license": [
|
4854 |
+
"MIT"
|
4855 |
+
],
|
4856 |
+
"authors": [
|
4857 |
+
{
|
4858 |
+
"name": "Nicolas Grekas",
|
4859 |
+
"email": "p@tchwork.com"
|
4860 |
+
},
|
4861 |
+
{
|
4862 |
+
"name": "Symfony Community",
|
4863 |
+
"homepage": "https://symfony.com/contributors"
|
4864 |
+
}
|
4865 |
+
],
|
4866 |
+
"description": "Generic abstractions related to writing services",
|
4867 |
+
"homepage": "https://symfony.com",
|
4868 |
+
"keywords": [
|
4869 |
+
"abstractions",
|
4870 |
+
"contracts",
|
4871 |
+
"decoupling",
|
4872 |
+
"interfaces",
|
4873 |
+
"interoperability",
|
4874 |
+
"standards"
|
4875 |
+
],
|
4876 |
+
"time": "2019-11-18T17:27:11+00:00"
|
4877 |
+
},
|
4878 |
+
{
|
4879 |
+
"name": "symfony/translation",
|
4880 |
+
"version": "v5.0.5",
|
4881 |
+
"source": {
|
4882 |
+
"type": "git",
|
4883 |
+
"url": "https://github.com/symfony/translation.git",
|
4884 |
+
"reference": "e9b93f42a1fd6aec6a0872d59ee5c8219a7d584b"
|
4885 |
+
},
|
4886 |
+
"dist": {
|
4887 |
+
"type": "zip",
|
4888 |
+
"url": "https://api.github.com/repos/symfony/translation/zipball/e9b93f42a1fd6aec6a0872d59ee5c8219a7d584b",
|
4889 |
+
"reference": "e9b93f42a1fd6aec6a0872d59ee5c8219a7d584b",
|
4890 |
+
"shasum": ""
|
4891 |
+
},
|
4892 |
+
"require": {
|
4893 |
+
"php": "^7.2.5",
|
4894 |
+
"symfony/polyfill-mbstring": "~1.0",
|
4895 |
+
"symfony/translation-contracts": "^2"
|
4896 |
+
},
|
4897 |
+
"conflict": {
|
4898 |
+
"symfony/config": "<4.4",
|
4899 |
+
"symfony/dependency-injection": "<5.0",
|
4900 |
+
"symfony/http-kernel": "<5.0",
|
4901 |
+
"symfony/twig-bundle": "<5.0",
|
4902 |
+
"symfony/yaml": "<4.4"
|
4903 |
+
},
|
4904 |
+
"provide": {
|
4905 |
+
"symfony/translation-implementation": "2.0"
|
4906 |
+
},
|
4907 |
+
"require-dev": {
|
4908 |
+
"psr/log": "~1.0",
|
4909 |
+
"symfony/config": "^4.4|^5.0",
|
4910 |
+
"symfony/console": "^4.4|^5.0",
|
4911 |
+
"symfony/dependency-injection": "^5.0",
|
4912 |
+
"symfony/finder": "^4.4|^5.0",
|
4913 |
+
"symfony/http-kernel": "^5.0",
|
4914 |
+
"symfony/intl": "^4.4|^5.0",
|
4915 |
+
"symfony/service-contracts": "^1.1.2|^2",
|
4916 |
+
"symfony/yaml": "^4.4|^5.0"
|
4917 |
+
},
|
4918 |
+
"suggest": {
|
4919 |
+
"psr/log-implementation": "To use logging capability in translator",
|
4920 |
+
"symfony/config": "",
|
4921 |
+
"symfony/yaml": ""
|
4922 |
+
},
|
4923 |
+
"type": "library",
|
4924 |
+
"extra": {
|
4925 |
+
"branch-alias": {
|
4926 |
+
"dev-master": "5.0-dev"
|
4927 |
+
}
|
4928 |
+
},
|
4929 |
+
"autoload": {
|
4930 |
+
"psr-4": {
|
4931 |
+
"Symfony\\Component\\Translation\\": ""
|
4932 |
+
},
|
4933 |
+
"exclude-from-classmap": [
|
4934 |
+
"/Tests/"
|
4935 |
+
]
|
4936 |
+
},
|
4937 |
+
"notification-url": "https://packagist.org/downloads/",
|
4938 |
+
"license": [
|
4939 |
+
"MIT"
|
4940 |
+
],
|
4941 |
+
"authors": [
|
4942 |
+
{
|
4943 |
+
"name": "Fabien Potencier",
|
4944 |
+
"email": "fabien@symfony.com"
|
4945 |
+
},
|
4946 |
+
{
|
4947 |
+
"name": "Symfony Community",
|
4948 |
+
"homepage": "https://symfony.com/contributors"
|
4949 |
+
}
|
4950 |
+
],
|
4951 |
+
"description": "Symfony Translation Component",
|
4952 |
+
"homepage": "https://symfony.com",
|
4953 |
+
"time": "2020-02-04T07:41:34+00:00"
|
4954 |
+
},
|
4955 |
+
{
|
4956 |
+
"name": "symfony/translation-contracts",
|
4957 |
+
"version": "v2.0.1",
|
4958 |
+
"source": {
|
4959 |
+
"type": "git",
|
4960 |
+
"url": "https://github.com/symfony/translation-contracts.git",
|
4961 |
+
"reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed"
|
4962 |
+
},
|
4963 |
+
"dist": {
|
4964 |
+
"type": "zip",
|
4965 |
+
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/8cc682ac458d75557203b2f2f14b0b92e1c744ed",
|
4966 |
+
"reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed",
|
4967 |
+
"shasum": ""
|
4968 |
+
},
|
4969 |
+
"require": {
|
4970 |
+
"php": "^7.2.5"
|
4971 |
+
},
|
4972 |
+
"suggest": {
|
4973 |
+
"symfony/translation-implementation": ""
|
4974 |
+
},
|
4975 |
+
"type": "library",
|
4976 |
+
"extra": {
|
4977 |
+
"branch-alias": {
|
4978 |
+
"dev-master": "2.0-dev"
|
4979 |
+
}
|
4980 |
+
},
|
4981 |
+
"autoload": {
|
4982 |
+
"psr-4": {
|
4983 |
+
"Symfony\\Contracts\\Translation\\": ""
|
4984 |
+
}
|
4985 |
+
},
|
4986 |
+
"notification-url": "https://packagist.org/downloads/",
|
4987 |
+
"license": [
|
4988 |
+
"MIT"
|
4989 |
+
],
|
4990 |
+
"authors": [
|
4991 |
+
{
|
4992 |
+
"name": "Nicolas Grekas",
|
4993 |
+
"email": "p@tchwork.com"
|
4994 |
+
},
|
4995 |
+
{
|
4996 |
+
"name": "Symfony Community",
|
4997 |
+
"homepage": "https://symfony.com/contributors"
|
4998 |
+
}
|
4999 |
+
],
|
5000 |
+
"description": "Generic abstractions related to translation",
|
5001 |
+
"homepage": "https://symfony.com",
|
5002 |
+
"keywords": [
|
5003 |
+
"abstractions",
|
5004 |
+
"contracts",
|
5005 |
+
"decoupling",
|
5006 |
+
"interfaces",
|
5007 |
+
"interoperability",
|
5008 |
+
"standards"
|
5009 |
+
],
|
5010 |
+
"time": "2019-11-18T17:27:11+00:00"
|
5011 |
+
},
|
5012 |
+
{
|
5013 |
+
"name": "symfony/yaml",
|
5014 |
+
"version": "v4.4.5",
|
5015 |
+
"source": {
|
5016 |
+
"type": "git",
|
5017 |
+
"url": "https://github.com/symfony/yaml.git",
|
5018 |
+
"reference": "94d005c176db2080e98825d98e01e8b311a97a88"
|
5019 |
+
},
|
5020 |
+
"dist": {
|
5021 |
+
"type": "zip",
|
5022 |
+
"url": "https://api.github.com/repos/symfony/yaml/zipball/94d005c176db2080e98825d98e01e8b311a97a88",
|
5023 |
+
"reference": "94d005c176db2080e98825d98e01e8b311a97a88",
|
5024 |
+
"shasum": ""
|
5025 |
+
},
|
5026 |
+
"require": {
|
5027 |
+
"php": "^7.1.3",
|
5028 |
+
"symfony/polyfill-ctype": "~1.8"
|
5029 |
+
},
|
5030 |
+
"conflict": {
|
5031 |
+
"symfony/console": "<3.4"
|
5032 |
+
},
|
5033 |
+
"require-dev": {
|
5034 |
+
"symfony/console": "^3.4|^4.0|^5.0"
|
5035 |
+
},
|
5036 |
+
"suggest": {
|
5037 |
+
"symfony/console": "For validating YAML files using the lint command"
|
5038 |
+
},
|
5039 |
+
"type": "library",
|
5040 |
+
"extra": {
|
5041 |
+
"branch-alias": {
|
5042 |
+
"dev-master": "4.4-dev"
|
5043 |
+
}
|
5044 |
+
},
|
5045 |
+
"autoload": {
|
5046 |
+
"psr-4": {
|
5047 |
+
"Symfony\\Component\\Yaml\\": ""
|
5048 |
+
},
|
5049 |
+
"exclude-from-classmap": [
|
5050 |
+
"/Tests/"
|
5051 |
+
]
|
5052 |
+
},
|
5053 |
+
"notification-url": "https://packagist.org/downloads/",
|
5054 |
+
"license": [
|
5055 |
+
"MIT"
|
5056 |
+
],
|
5057 |
+
"authors": [
|
5058 |
+
{
|
5059 |
+
"name": "Fabien Potencier",
|
5060 |
+
"email": "fabien@symfony.com"
|
5061 |
+
},
|
5062 |
+
{
|
5063 |
+
"name": "Symfony Community",
|
5064 |
+
"homepage": "https://symfony.com/contributors"
|
5065 |
+
}
|
5066 |
+
],
|
5067 |
+
"description": "Symfony Yaml Component",
|
5068 |
+
"homepage": "https://symfony.com",
|
5069 |
+
"time": "2020-02-03T10:46:43+00:00"
|
5070 |
+
},
|
5071 |
+
{
|
5072 |
+
"name": "theseer/tokenizer",
|
5073 |
+
"version": "1.1.3",
|
5074 |
+
"source": {
|
5075 |
+
"type": "git",
|
5076 |
+
"url": "https://github.com/theseer/tokenizer.git",
|
5077 |
+
"reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9"
|
5078 |
+
},
|
5079 |
+
"dist": {
|
5080 |
+
"type": "zip",
|
5081 |
+
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
|
5082 |
+
"reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
|
5083 |
+
"shasum": ""
|
5084 |
+
},
|
5085 |
+
"require": {
|
5086 |
+
"ext-dom": "*",
|
5087 |
+
"ext-tokenizer": "*",
|
5088 |
+
"ext-xmlwriter": "*",
|
5089 |
+
"php": "^7.0"
|
5090 |
+
},
|
5091 |
+
"type": "library",
|
5092 |
+
"autoload": {
|
5093 |
+
"classmap": [
|
5094 |
+
"src/"
|
5095 |
+
]
|
5096 |
+
},
|
5097 |
+
"notification-url": "https://packagist.org/downloads/",
|
5098 |
+
"license": [
|
5099 |
+
"BSD-3-Clause"
|
5100 |
+
],
|
5101 |
+
"authors": [
|
5102 |
+
{
|
5103 |
+
"name": "Arne Blankerts",
|
5104 |
+
"email": "arne@blankerts.de",
|
5105 |
+
"role": "Developer"
|
5106 |
+
}
|
5107 |
+
],
|
5108 |
+
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
|
5109 |
+
"time": "2019-06-13T22:48:21+00:00"
|
5110 |
+
},
|
5111 |
+
{
|
5112 |
+
"name": "vlucas/phpdotenv",
|
5113 |
+
"version": "v3.6.1",
|
5114 |
+
"source": {
|
5115 |
+
"type": "git",
|
5116 |
+
"url": "https://github.com/vlucas/phpdotenv.git",
|
5117 |
+
"reference": "8f7961f7b9deb3b432452c18093cf16f88205902"
|
5118 |
+
},
|
5119 |
+
"dist": {
|
5120 |
+
"type": "zip",
|
5121 |
+
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/8f7961f7b9deb3b432452c18093cf16f88205902",
|
5122 |
+
"reference": "8f7961f7b9deb3b432452c18093cf16f88205902",
|
5123 |
+
"shasum": ""
|
5124 |
+
},
|
5125 |
+
"require": {
|
5126 |
+
"php": "^5.4 || ^7.0",
|
5127 |
+
"phpoption/phpoption": "^1.5",
|
5128 |
+
"symfony/polyfill-ctype": "^1.9"
|
5129 |
+
},
|
5130 |
+
"require-dev": {
|
5131 |
+
"ext-filter": "*",
|
5132 |
+
"phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0"
|
5133 |
+
},
|
5134 |
+
"suggest": {
|
5135 |
+
"ext-filter": "Required to use the boolean validator."
|
5136 |
+
},
|
5137 |
+
"type": "library",
|
5138 |
+
"extra": {
|
5139 |
+
"branch-alias": {
|
5140 |
+
"dev-master": "3.6-dev"
|
5141 |
+
}
|
5142 |
+
},
|
5143 |
+
"autoload": {
|
5144 |
+
"psr-4": {
|
5145 |
+
"Dotenv\\": "src/"
|
5146 |
+
}
|
5147 |
+
},
|
5148 |
+
"notification-url": "https://packagist.org/downloads/",
|
5149 |
+
"license": [
|
5150 |
+
"BSD-3-Clause"
|
5151 |
+
],
|
5152 |
+
"authors": [
|
5153 |
+
{
|
5154 |
+
"name": "Graham Campbell",
|
5155 |
+
"email": "graham@alt-three.com",
|
5156 |
+
"homepage": "https://gjcampbell.co.uk/"
|
5157 |
+
},
|
5158 |
+
{
|
5159 |
+
"name": "Vance Lucas",
|
5160 |
+
"email": "vance@vancelucas.com",
|
5161 |
+
"homepage": "https://vancelucas.com/"
|
5162 |
+
}
|
5163 |
+
],
|
5164 |
+
"description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
|
5165 |
+
"keywords": [
|
5166 |
+
"dotenv",
|
5167 |
+
"env",
|
5168 |
+
"environment"
|
5169 |
+
],
|
5170 |
+
"time": "2020-03-12T13:44:00+00:00"
|
5171 |
+
},
|
5172 |
+
{
|
5173 |
+
"name": "voku/portable-ascii",
|
5174 |
+
"version": "1.4.9",
|
5175 |
+
"source": {
|
5176 |
+
"type": "git",
|
5177 |
+
"url": "https://github.com/voku/portable-ascii.git",
|
5178 |
+
"reference": "9fd2b224c71448b5f84aef9d499a1428d79776a2"
|
5179 |
+
},
|
5180 |
+
"dist": {
|
5181 |
+
"type": "zip",
|
5182 |
+
"url": "https://api.github.com/repos/voku/portable-ascii/zipball/9fd2b224c71448b5f84aef9d499a1428d79776a2",
|
5183 |
+
"reference": "9fd2b224c71448b5f84aef9d499a1428d79776a2",
|
5184 |
+
"shasum": ""
|
5185 |
+
},
|
5186 |
+
"require": {
|
5187 |
+
"php": ">=7.0.0"
|
5188 |
+
},
|
5189 |
+
"require-dev": {
|
5190 |
+
"phpunit/phpunit": "~6.0 || ~7.0"
|
5191 |
+
},
|
5192 |
+
"suggest": {
|
5193 |
+
"ext-intl": "Use Intl for transliterator_transliterate() support"
|
5194 |
+
},
|
5195 |
+
"type": "library",
|
5196 |
+
"autoload": {
|
5197 |
+
"psr-4": {
|
5198 |
+
"voku\\": "src/voku/",
|
5199 |
+
"voku\\tests\\": "tests/"
|
5200 |
+
}
|
5201 |
+
},
|
5202 |
+
"notification-url": "https://packagist.org/downloads/",
|
5203 |
+
"license": [
|
5204 |
+
"MIT"
|
5205 |
+
],
|
5206 |
+
"authors": [
|
5207 |
+
{
|
5208 |
+
"name": "Lars Moelleken",
|
5209 |
+
"homepage": "http://www.moelleken.org/"
|
5210 |
+
}
|
5211 |
+
],
|
5212 |
+
"description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
|
5213 |
+
"homepage": "https://github.com/voku/portable-ascii",
|
5214 |
+
"keywords": [
|
5215 |
+
"ascii",
|
5216 |
+
"clean",
|
5217 |
+
"php"
|
5218 |
+
],
|
5219 |
+
"time": "2020-03-06T02:47:42+00:00"
|
5220 |
+
},
|
5221 |
+
{
|
5222 |
+
"name": "vria/nodiacritic",
|
5223 |
+
"version": "0.1.2",
|
5224 |
+
"source": {
|
5225 |
+
"type": "git",
|
5226 |
+
"url": "https://github.com/vria/nodiacritic.git",
|
5227 |
+
"reference": "3efeb60fb2586fe3ce8ff0f3c122d380717b8b07"
|
5228 |
+
},
|
5229 |
+
"dist": {
|
5230 |
+
"type": "zip",
|
5231 |
+
"url": "https://api.github.com/repos/vria/nodiacritic/zipball/3efeb60fb2586fe3ce8ff0f3c122d380717b8b07",
|
5232 |
+
"reference": "3efeb60fb2586fe3ce8ff0f3c122d380717b8b07",
|
5233 |
+
"shasum": ""
|
5234 |
+
},
|
5235 |
+
"require": {
|
5236 |
+
"php": ">=5.3.3"
|
5237 |
+
},
|
5238 |
+
"require-dev": {
|
5239 |
+
"phpunit/phpunit": "4.8.*"
|
5240 |
+
},
|
5241 |
+
"type": "library",
|
5242 |
+
"autoload": {
|
5243 |
+
"psr-4": {
|
5244 |
+
"VRia\\Utils\\": "src/"
|
5245 |
+
}
|
5246 |
+
},
|
5247 |
+
"notification-url": "https://packagist.org/downloads/",
|
5248 |
+
"license": [
|
5249 |
+
"GPL-2.0"
|
5250 |
+
],
|
5251 |
+
"authors": [
|
5252 |
+
{
|
5253 |
+
"name": "Riabchenko Vlad",
|
5254 |
+
"email": "contact@vria.eu",
|
5255 |
+
"homepage": "http://vria.eu"
|
5256 |
+
}
|
5257 |
+
],
|
5258 |
+
"description": "Tiny helper function that removes all diacritical signs from characters",
|
5259 |
+
"homepage": "https://github.com/vria/nodiacritic",
|
5260 |
+
"keywords": [
|
5261 |
+
"accent",
|
5262 |
+
"diacritic",
|
5263 |
+
"filter",
|
5264 |
+
"string",
|
5265 |
+
"text"
|
5266 |
+
],
|
5267 |
+
"time": "2016-09-17T22:03:11+00:00"
|
5268 |
+
},
|
5269 |
+
{
|
5270 |
+
"name": "webmozart/assert",
|
5271 |
+
"version": "1.7.0",
|
5272 |
+
"source": {
|
5273 |
+
"type": "git",
|
5274 |
+
"url": "https://github.com/webmozart/assert.git",
|
5275 |
+
"reference": "aed98a490f9a8f78468232db345ab9cf606cf598"
|
5276 |
+
},
|
5277 |
+
"dist": {
|
5278 |
+
"type": "zip",
|
5279 |
+
"url": "https://api.github.com/repos/webmozart/assert/zipball/aed98a490f9a8f78468232db345ab9cf606cf598",
|
5280 |
+
"reference": "aed98a490f9a8f78468232db345ab9cf606cf598",
|
5281 |
+
"shasum": ""
|
5282 |
+
},
|
5283 |
+
"require": {
|
5284 |
+
"php": "^5.3.3 || ^7.0",
|
5285 |
+
"symfony/polyfill-ctype": "^1.8"
|
5286 |
+
},
|
5287 |
+
"conflict": {
|
5288 |
+
"vimeo/psalm": "<3.6.0"
|
5289 |
+
},
|
5290 |
+
"require-dev": {
|
5291 |
+
"phpunit/phpunit": "^4.8.36 || ^7.5.13"
|
5292 |
+
},
|
5293 |
+
"type": "library",
|
5294 |
+
"autoload": {
|
5295 |
+
"psr-4": {
|
5296 |
+
"Webmozart\\Assert\\": "src/"
|
5297 |
+
}
|
5298 |
+
},
|
5299 |
+
"notification-url": "https://packagist.org/downloads/",
|
5300 |
+
"license": [
|
5301 |
+
"MIT"
|
5302 |
+
],
|
5303 |
+
"authors": [
|
5304 |
+
{
|
5305 |
+
"name": "Bernhard Schussek",
|
5306 |
+
"email": "bschussek@gmail.com"
|
5307 |
+
}
|
5308 |
+
],
|
5309 |
+
"description": "Assertions to validate method input/output with nice error messages.",
|
5310 |
+
"keywords": [
|
5311 |
+
"assert",
|
5312 |
+
"check",
|
5313 |
+
"validate"
|
5314 |
+
],
|
5315 |
+
"time": "2020-02-14T12:15:55+00:00"
|
5316 |
+
},
|
5317 |
+
{
|
5318 |
+
"name": "wp-cli/cache-command",
|
5319 |
+
"version": "v2.0.3",
|
5320 |
+
"source": {
|
5321 |
+
"type": "git",
|
5322 |
+
"url": "https://github.com/wp-cli/cache-command.git",
|
5323 |
+
"reference": "d3264aecf0e981b61adc020f5f6664f6538b7434"
|
5324 |
+
},
|
5325 |
+
"dist": {
|
5326 |
+
"type": "zip",
|
5327 |
+
"url": "https://api.github.com/repos/wp-cli/cache-command/zipball/d3264aecf0e981b61adc020f5f6664f6538b7434",
|
5328 |
+
"reference": "d3264aecf0e981b61adc020f5f6664f6538b7434",
|
5329 |
+
"shasum": ""
|
5330 |
+
},
|
5331 |
+
"require": {
|
5332 |
+
"wp-cli/wp-cli": "^2"
|
5333 |
+
},
|
5334 |
+
"require-dev": {
|
5335 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
5336 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
5337 |
+
},
|
5338 |
+
"type": "wp-cli-package",
|
5339 |
+
"extra": {
|
5340 |
+
"branch-alias": {
|
5341 |
+
"dev-master": "2.x-dev"
|
5342 |
+
},
|
5343 |
+
"bundled": true,
|
5344 |
+
"commands": [
|
5345 |
+
"cache",
|
5346 |
+
"cache add",
|
5347 |
+
"cache decr",
|
5348 |
+
"cache delete",
|
5349 |
+
"cache flush",
|
5350 |
+
"cache get",
|
5351 |
+
"cache incr",
|
5352 |
+
"cache replace",
|
5353 |
+
"cache set",
|
5354 |
+
"cache type",
|
5355 |
+
"transient",
|
5356 |
+
"transient delete",
|
5357 |
+
"transient get",
|
5358 |
+
"transient set",
|
5359 |
+
"transient type",
|
5360 |
+
"transient list"
|
5361 |
+
]
|
5362 |
+
},
|
5363 |
+
"autoload": {
|
5364 |
+
"psr-4": {
|
5365 |
+
"": "src/"
|
5366 |
+
},
|
5367 |
+
"files": [
|
5368 |
+
"cache-command.php"
|
5369 |
+
]
|
5370 |
+
},
|
5371 |
+
"notification-url": "https://packagist.org/downloads/",
|
5372 |
+
"license": [
|
5373 |
+
"MIT"
|
5374 |
+
],
|
5375 |
+
"authors": [
|
5376 |
+
{
|
5377 |
+
"name": "Daniel Bachhuber",
|
5378 |
+
"email": "daniel@runcommand.io",
|
5379 |
+
"homepage": "https://runcommand.io"
|
5380 |
+
}
|
5381 |
+
],
|
5382 |
+
"description": "Manages object and transient caches.",
|
5383 |
+
"homepage": "https://github.com/wp-cli/cache-command",
|
5384 |
+
"time": "2019-11-12T01:43:12+00:00"
|
5385 |
+
},
|
5386 |
+
{
|
5387 |
+
"name": "wp-cli/checksum-command",
|
5388 |
+
"version": "v2.0.3",
|
5389 |
+
"source": {
|
5390 |
+
"type": "git",
|
5391 |
+
"url": "https://github.com/wp-cli/checksum-command.git",
|
5392 |
+
"reference": "7db66668ec116c5ccef7bc27b4354fa81b85018a"
|
5393 |
+
},
|
5394 |
+
"dist": {
|
5395 |
+
"type": "zip",
|
5396 |
+
"url": "https://api.github.com/repos/wp-cli/checksum-command/zipball/7db66668ec116c5ccef7bc27b4354fa81b85018a",
|
5397 |
+
"reference": "7db66668ec116c5ccef7bc27b4354fa81b85018a",
|
5398 |
+
"shasum": ""
|
5399 |
+
},
|
5400 |
+
"require": {
|
5401 |
+
"wp-cli/wp-cli": "^2"
|
5402 |
+
},
|
5403 |
+
"require-dev": {
|
5404 |
+
"wp-cli/extension-command": "^1.2 || ^2",
|
5405 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
5406 |
+
},
|
5407 |
+
"type": "wp-cli-package",
|
5408 |
+
"extra": {
|
5409 |
+
"branch-alias": {
|
5410 |
+
"dev-master": "2.x-dev"
|
5411 |
+
},
|
5412 |
+
"bundled": true,
|
5413 |
+
"commands": [
|
5414 |
+
"core verify-checksums",
|
5415 |
+
"plugin verify-checksums"
|
5416 |
+
]
|
5417 |
+
},
|
5418 |
+
"autoload": {
|
5419 |
+
"psr-4": {
|
5420 |
+
"": "src/"
|
5421 |
+
},
|
5422 |
+
"files": [
|
5423 |
+
"checksum-command.php"
|
5424 |
+
]
|
5425 |
+
},
|
5426 |
+
"notification-url": "https://packagist.org/downloads/",
|
5427 |
+
"license": [
|
5428 |
+
"MIT"
|
5429 |
+
],
|
5430 |
+
"authors": [
|
5431 |
+
{
|
5432 |
+
"name": "Daniel Bachhuber",
|
5433 |
+
"email": "daniel@runcommand.io",
|
5434 |
+
"homepage": "https://runcommand.io"
|
5435 |
+
}
|
5436 |
+
],
|
5437 |
+
"description": "Verifies file integrity by comparing to published checksums.",
|
5438 |
+
"homepage": "https://github.com/wp-cli/checksum-command",
|
5439 |
+
"time": "2019-04-25T00:28:02+00:00"
|
5440 |
+
},
|
5441 |
+
{
|
5442 |
+
"name": "wp-cli/config-command",
|
5443 |
+
"version": "v2.0.5",
|
5444 |
+
"source": {
|
5445 |
+
"type": "git",
|
5446 |
+
"url": "https://github.com/wp-cli/config-command.git",
|
5447 |
+
"reference": "9530dc42eebcae1fde10ad9e4aad312e06267eb9"
|
5448 |
+
},
|
5449 |
+
"dist": {
|
5450 |
+
"type": "zip",
|
5451 |
+
"url": "https://api.github.com/repos/wp-cli/config-command/zipball/9530dc42eebcae1fde10ad9e4aad312e06267eb9",
|
5452 |
+
"reference": "9530dc42eebcae1fde10ad9e4aad312e06267eb9",
|
5453 |
+
"shasum": ""
|
5454 |
+
},
|
5455 |
+
"require": {
|
5456 |
+
"wp-cli/wp-cli": "^2",
|
5457 |
+
"wp-cli/wp-config-transformer": "^1.2.1"
|
5458 |
+
},
|
5459 |
+
"require-dev": {
|
5460 |
+
"wp-cli/db-command": "^1.3 || ^2",
|
5461 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
5462 |
+
},
|
5463 |
+
"type": "wp-cli-package",
|
5464 |
+
"extra": {
|
5465 |
+
"branch-alias": {
|
5466 |
+
"dev-master": "2.x-dev"
|
5467 |
+
},
|
5468 |
+
"bundled": true,
|
5469 |
+
"commands": [
|
5470 |
+
"config",
|
5471 |
+
"config edit",
|
5472 |
+
"config delete",
|
5473 |
+
"config create",
|
5474 |
+
"config get",
|
5475 |
+
"config has",
|
5476 |
+
"config list",
|
5477 |
+
"config path",
|
5478 |
+
"config set",
|
5479 |
+
"config shuffle-salts"
|
5480 |
+
]
|
5481 |
+
},
|
5482 |
+
"autoload": {
|
5483 |
+
"psr-4": {
|
5484 |
+
"": "src/"
|
5485 |
+
},
|
5486 |
+
"files": [
|
5487 |
+
"config-command.php"
|
5488 |
+
]
|
5489 |
+
},
|
5490 |
+
"notification-url": "https://packagist.org/downloads/",
|
5491 |
+
"license": [
|
5492 |
+
"MIT"
|
5493 |
+
],
|
5494 |
+
"authors": [
|
5495 |
+
{
|
5496 |
+
"name": "Daniel Bachhuber",
|
5497 |
+
"email": "daniel@runcommand.io",
|
5498 |
+
"homepage": "https://runcommand.io"
|
5499 |
+
},
|
5500 |
+
{
|
5501 |
+
"name": "Alain Schlesser",
|
5502 |
+
"email": "alain.schlesser@gmail.com",
|
5503 |
+
"homepage": "https://www.alainschlesser.com"
|
5504 |
+
}
|
5505 |
+
],
|
5506 |
+
"description": "Generates and reads the wp-config.php file.",
|
5507 |
+
"homepage": "https://github.com/wp-cli/config-command",
|
5508 |
+
"time": "2019-11-12T01:43:26+00:00"
|
5509 |
+
},
|
5510 |
+
{
|
5511 |
+
"name": "wp-cli/core-command",
|
5512 |
+
"version": "v2.0.8",
|
5513 |
+
"source": {
|
5514 |
+
"type": "git",
|
5515 |
+
"url": "https://github.com/wp-cli/core-command.git",
|
5516 |
+
"reference": "be62a9364c77a99698364a888362a8c8b9414f2f"
|
5517 |
+
},
|
5518 |
+
"dist": {
|
5519 |
+
"type": "zip",
|
5520 |
+
"url": "https://api.github.com/repos/wp-cli/core-command/zipball/be62a9364c77a99698364a888362a8c8b9414f2f",
|
5521 |
+
"reference": "be62a9364c77a99698364a888362a8c8b9414f2f",
|
5522 |
+
"shasum": ""
|
5523 |
+
},
|
5524 |
+
"require": {
|
5525 |
+
"composer/semver": "^1.4",
|
5526 |
+
"wp-cli/wp-cli": "^2.4"
|
5527 |
+
},
|
5528 |
+
"require-dev": {
|
5529 |
+
"wp-cli/checksum-command": "^1 || ^2",
|
5530 |
+
"wp-cli/db-command": "^1.3 || ^2",
|
5531 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
5532 |
+
"wp-cli/extension-command": "^1.2 || ^2",
|
5533 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
5534 |
+
},
|
5535 |
+
"type": "wp-cli-package",
|
5536 |
+
"extra": {
|
5537 |
+
"branch-alias": {
|
5538 |
+
"dev-master": "2.x-dev"
|
5539 |
+
},
|
5540 |
+
"bundled": true,
|
5541 |
+
"commands": [
|
5542 |
+
"core",
|
5543 |
+
"core check-update",
|
5544 |
+
"core download",
|
5545 |
+
"core install",
|
5546 |
+
"core is-installed",
|
5547 |
+
"core multisite-convert",
|
5548 |
+
"core multisite-install",
|
5549 |
+
"core update",
|
5550 |
+
"core update-db",
|
5551 |
+
"core version"
|
5552 |
+
]
|
5553 |
+
},
|
5554 |
+
"autoload": {
|
5555 |
+
"psr-4": {
|
5556 |
+
"": "src/"
|
5557 |
+
},
|
5558 |
+
"files": [
|
5559 |
+
"core-command.php"
|
5560 |
+
]
|
5561 |
+
},
|
5562 |
+
"notification-url": "https://packagist.org/downloads/",
|
5563 |
+
"license": [
|
5564 |
+
"MIT"
|
5565 |
+
],
|
5566 |
+
"authors": [
|
5567 |
+
{
|
5568 |
+
"name": "Daniel Bachhuber",
|
5569 |
+
"email": "daniel@runcommand.io",
|
5570 |
+
"homepage": "https://runcommand.io"
|
5571 |
+
}
|
5572 |
+
],
|
5573 |
+
"description": "Downloads, installs, updates, and manages a WordPress installation.",
|
5574 |
+
"homepage": "https://github.com/wp-cli/core-command",
|
5575 |
+
"time": "2019-11-12T15:31:38+00:00"
|
5576 |
+
},
|
5577 |
+
{
|
5578 |
+
"name": "wp-cli/cron-command",
|
5579 |
+
"version": "v2.0.4",
|
5580 |
+
"source": {
|
5581 |
+
"type": "git",
|
5582 |
+
"url": "https://github.com/wp-cli/cron-command.git",
|
5583 |
+
"reference": "184ce82dfd6e7284a73f039ae39cf51a5f73174e"
|
5584 |
+
},
|
5585 |
+
"dist": {
|
5586 |
+
"type": "zip",
|
5587 |
+
"url": "https://api.github.com/repos/wp-cli/cron-command/zipball/184ce82dfd6e7284a73f039ae39cf51a5f73174e",
|
5588 |
+
"reference": "184ce82dfd6e7284a73f039ae39cf51a5f73174e",
|
5589 |
+
"shasum": ""
|
5590 |
+
},
|
5591 |
+
"require": {
|
5592 |
+
"wp-cli/wp-cli": "^2"
|
5593 |
+
},
|
5594 |
+
"require-dev": {
|
5595 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
5596 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
5597 |
+
},
|
5598 |
+
"type": "wp-cli-package",
|
5599 |
+
"extra": {
|
5600 |
+
"branch-alias": {
|
5601 |
+
"dev-master": "2.x-dev"
|
5602 |
+
},
|
5603 |
+
"bundled": true,
|
5604 |
+
"commands": [
|
5605 |
+
"cron",
|
5606 |
+
"cron test",
|
5607 |
+
"cron event",
|
5608 |
+
"cron event delete",
|
5609 |
+
"cron event list",
|
5610 |
+
"cron event run",
|
5611 |
+
"cron event schedule",
|
5612 |
+
"cron schedule",
|
5613 |
+
"cron schedule list",
|
5614 |
+
"cron event unschedule"
|
5615 |
+
]
|
5616 |
+
},
|
5617 |
+
"autoload": {
|
5618 |
+
"psr-4": {
|
5619 |
+
"": "src/"
|
5620 |
+
},
|
5621 |
+
"files": [
|
5622 |
+
"cron-command.php"
|
5623 |
+
]
|
5624 |
+
},
|
5625 |
+
"notification-url": "https://packagist.org/downloads/",
|
5626 |
+
"license": [
|
5627 |
+
"MIT"
|
5628 |
+
],
|
5629 |
+
"authors": [
|
5630 |
+
{
|
5631 |
+
"name": "Daniel Bachhuber",
|
5632 |
+
"email": "daniel@runcommand.io",
|
5633 |
+
"homepage": "https://runcommand.io"
|
5634 |
+
}
|
5635 |
+
],
|
5636 |
+
"description": "Tests, runs, and deletes WP-Cron events; manages WP-Cron schedules.",
|
5637 |
+
"homepage": "https://github.com/wp-cli/cron-command",
|
5638 |
+
"time": "2019-12-17T17:53:36+00:00"
|
5639 |
+
},
|
5640 |
+
{
|
5641 |
+
"name": "wp-cli/db-command",
|
5642 |
+
"version": "v2.0.6",
|
5643 |
+
"source": {
|
5644 |
+
"type": "git",
|
5645 |
+
"url": "https://github.com/wp-cli/db-command.git",
|
5646 |
+
"reference": "8e3cd46987241ed97ddb7f682b3505dff8d6dce4"
|
5647 |
+
},
|
5648 |
+
"dist": {
|
5649 |
+
"type": "zip",
|
5650 |
+
"url": "https://api.github.com/repos/wp-cli/db-command/zipball/8e3cd46987241ed97ddb7f682b3505dff8d6dce4",
|
5651 |
+
"reference": "8e3cd46987241ed97ddb7f682b3505dff8d6dce4",
|
5652 |
+
"shasum": ""
|
5653 |
+
},
|
5654 |
+
"require": {
|
5655 |
+
"wp-cli/wp-cli": "^2"
|
5656 |
+
},
|
5657 |
+
"require-dev": {
|
5658 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
5659 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
5660 |
+
},
|
5661 |
+
"type": "wp-cli-package",
|
5662 |
+
"extra": {
|
5663 |
+
"branch-alias": {
|
5664 |
+
"dev-master": "2.x-dev"
|
5665 |
+
},
|
5666 |
+
"bundled": true,
|
5667 |
+
"commands": [
|
5668 |
+
"db",
|
5669 |
+
"db clean",
|
5670 |
+
"db create",
|
5671 |
+
"db drop",
|
5672 |
+
"db reset",
|
5673 |
+
"db check",
|
5674 |
+
"db optimize",
|
5675 |
+
"db prefix",
|
5676 |
+
"db repair",
|
5677 |
+
"db cli",
|
5678 |
+
"db query",
|
5679 |
+
"db export",
|
5680 |
+
"db import",
|
5681 |
+
"db search",
|
5682 |
+
"db tables",
|
5683 |
+
"db size",
|
5684 |
+
"db columns"
|
5685 |
+
]
|
5686 |
+
},
|
5687 |
+
"autoload": {
|
5688 |
+
"psr-4": {
|
5689 |
+
"": "src/"
|
5690 |
+
},
|
5691 |
+
"files": [
|
5692 |
+
"db-command.php"
|
5693 |
+
]
|
5694 |
+
},
|
5695 |
+
"notification-url": "https://packagist.org/downloads/",
|
5696 |
+
"license": [
|
5697 |
+
"MIT"
|
5698 |
+
],
|
5699 |
+
"authors": [
|
5700 |
+
{
|
5701 |
+
"name": "Daniel Bachhuber",
|
5702 |
+
"email": "daniel@runcommand.io",
|
5703 |
+
"homepage": "https://runcommand.io"
|
5704 |
+
}
|
5705 |
+
],
|
5706 |
+
"description": "Performs basic database operations using credentials stored in wp-config.php.",
|
5707 |
+
"homepage": "https://github.com/wp-cli/db-command",
|
5708 |
+
"time": "2020-01-28T16:39:32+00:00"
|
5709 |
+
},
|
5710 |
+
{
|
5711 |
+
"name": "wp-cli/embed-command",
|
5712 |
+
"version": "v2.0.4",
|
5713 |
+
"source": {
|
5714 |
+
"type": "git",
|
5715 |
+
"url": "https://github.com/wp-cli/embed-command.git",
|
5716 |
+
"reference": "f67fd41a056c6cb847e8601e058fa836b9e5d325"
|
5717 |
+
},
|
5718 |
+
"dist": {
|
5719 |
+
"type": "zip",
|
5720 |
+
"url": "https://api.github.com/repos/wp-cli/embed-command/zipball/f67fd41a056c6cb847e8601e058fa836b9e5d325",
|
5721 |
+
"reference": "f67fd41a056c6cb847e8601e058fa836b9e5d325",
|
5722 |
+
"shasum": ""
|
5723 |
+
},
|
5724 |
+
"require": {
|
5725 |
+
"wp-cli/wp-cli": "^2"
|
5726 |
+
},
|
5727 |
+
"require-dev": {
|
5728 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
5729 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
5730 |
+
},
|
5731 |
+
"type": "wp-cli-package",
|
5732 |
+
"extra": {
|
5733 |
+
"branch-alias": {
|
5734 |
+
"dev-master": "2.x-dev"
|
5735 |
+
},
|
5736 |
+
"bundled": true,
|
5737 |
+
"commands": [
|
5738 |
+
"embed",
|
5739 |
+
"embed fetch",
|
5740 |
+
"embed provider",
|
5741 |
+
"embed provider list",
|
5742 |
+
"embed provider match",
|
5743 |
+
"embed handler",
|
5744 |
+
"embed handler list",
|
5745 |
+
"embed cache",
|
5746 |
+
"embed cache clear",
|
5747 |
+
"embed cache find",
|
5748 |
+
"embed cache trigger"
|
5749 |
+
]
|
5750 |
+
},
|
5751 |
+
"autoload": {
|
5752 |
+
"psr-4": {
|
5753 |
+
"WP_CLI\\Embeds\\": "src/"
|
5754 |
+
},
|
5755 |
+
"files": [
|
5756 |
+
"embed-command.php"
|
5757 |
+
]
|
5758 |
+
},
|
5759 |
+
"notification-url": "https://packagist.org/downloads/",
|
5760 |
+
"license": [
|
5761 |
+
"MIT"
|
5762 |
+
],
|
5763 |
+
"authors": [
|
5764 |
+
{
|
5765 |
+
"name": "Pascal Birchler",
|
5766 |
+
"homepage": "https://pascalbirchler.com/"
|
5767 |
+
}
|
5768 |
+
],
|
5769 |
+
"description": "Inspects oEmbed providers, clears embed cache, and more.",
|
5770 |
+
"homepage": "https://github.com/wp-cli/embed-command",
|
5771 |
+
"time": "2019-11-12T01:43:50+00:00"
|
5772 |
+
},
|
5773 |
+
{
|
5774 |
+
"name": "wp-cli/entity-command",
|
5775 |
+
"version": "v2.0.7",
|
5776 |
+
"source": {
|
5777 |
+
"type": "git",
|
5778 |
+
"url": "https://github.com/wp-cli/entity-command.git",
|
5779 |
+
"reference": "0df89e4fba48177acf768bff9c00cda95a3fe5b9"
|
5780 |
+
},
|
5781 |
+
"dist": {
|
5782 |
+
"type": "zip",
|
5783 |
+
"url": "https://api.github.com/repos/wp-cli/entity-command/zipball/0df89e4fba48177acf768bff9c00cda95a3fe5b9",
|
5784 |
+
"reference": "0df89e4fba48177acf768bff9c00cda95a3fe5b9",
|
5785 |
+
"shasum": ""
|
5786 |
+
},
|
5787 |
+
"require": {
|
5788 |
+
"wp-cli/wp-cli": "^2"
|
5789 |
+
},
|
5790 |
+
"require-dev": {
|
5791 |
+
"wp-cli/cache-command": "^1 || ^2",
|
5792 |
+
"wp-cli/db-command": "^1.3 || ^2",
|
5793 |
+
"wp-cli/extension-command": "^1.2 || ^2",
|
5794 |
+
"wp-cli/media-command": "^1.1 || ^2",
|
5795 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
5796 |
+
},
|
5797 |
+
"type": "wp-cli-package",
|
5798 |
+
"extra": {
|
5799 |
+
"branch-alias": {
|
5800 |
+
"dev-master": "2.x-dev"
|
5801 |
+
},
|
5802 |
+
"bundled": true,
|
5803 |
+
"commands": [
|
5804 |
+
"comment",
|
5805 |
+
"comment approve",
|
5806 |
+
"comment count",
|
5807 |
+
"comment create",
|
5808 |
+
"comment delete",
|
5809 |
+
"comment exists",
|
5810 |
+
"comment generate",
|
5811 |
+
"comment get",
|
5812 |
+
"comment list",
|
5813 |
+
"comment meta",
|
5814 |
+
"comment meta add",
|
5815 |
+
"comment meta delete",
|
5816 |
+
"comment meta get",
|
5817 |
+
"comment meta list",
|
5818 |
+
"comment meta patch",
|
5819 |
+
"comment meta pluck",
|
5820 |
+
"comment meta update",
|
5821 |
+
"comment recount",
|
5822 |
+
"comment spam",
|
5823 |
+
"comment status",
|
5824 |
+
"comment trash",
|
5825 |
+
"comment unapprove",
|
5826 |
+
"comment unspam",
|
5827 |
+
"comment untrash",
|
5828 |
+
"comment update",
|
5829 |
+
"menu",
|
5830 |
+
"menu create",
|
5831 |
+
"menu delete",
|
5832 |
+
"menu item",
|
5833 |
+
"menu item add-custom",
|
5834 |
+
"menu item add-post",
|
5835 |
+
"menu item add-term",
|
5836 |
+
"menu item delete",
|
5837 |
+
"menu item list",
|
5838 |
+
"menu item update",
|
5839 |
+
"menu list",
|
5840 |
+
"menu location",
|
5841 |
+
"menu location assign",
|
5842 |
+
"menu location list",
|
5843 |
+
"menu location remove",
|
5844 |
+
"network meta",
|
5845 |
+
"network meta add",
|
5846 |
+
"network meta delete",
|
5847 |
+
"network meta get",
|
5848 |
+
"network meta list",
|
5849 |
+
"network meta patch",
|
5850 |
+
"network meta pluck",
|
5851 |
+
"network meta update",
|
5852 |
+
"option",
|
5853 |
+
"option add",
|
5854 |
+
"option delete",
|
5855 |
+
"option get",
|
5856 |
+
"option list",
|
5857 |
+
"option patch",
|
5858 |
+
"option pluck",
|
5859 |
+
"option update",
|
5860 |
+
"post",
|
5861 |
+
"post create",
|
5862 |
+
"post delete",
|
5863 |
+
"post edit",
|
5864 |
+
"post exists",
|
5865 |
+
"post generate",
|
5866 |
+
"post get",
|
5867 |
+
"post list",
|
5868 |
+
"post meta",
|
5869 |
+
"post meta add",
|
5870 |
+
"post meta delete",
|
5871 |
+
"post meta get",
|
5872 |
+
"post meta list",
|
5873 |
+
"post meta patch",
|
5874 |
+
"post meta pluck",
|
5875 |
+
"post meta update",
|
5876 |
+
"post term",
|
5877 |
+
"post term add",
|
5878 |
+
"post term list",
|
5879 |
+
"post term remove",
|
5880 |
+
"post term set",
|
5881 |
+
"post update",
|
5882 |
+
"post-type",
|
5883 |
+
"post-type get",
|
5884 |
+
"post-type list",
|
5885 |
+
"site",
|
5886 |
+
"site activate",
|
5887 |
+
"site archive",
|
5888 |
+
"site create",
|
5889 |
+
"site deactivate",
|
5890 |
+
"site delete",
|
5891 |
+
"site empty",
|
5892 |
+
"site list",
|
5893 |
+
"site mature",
|
5894 |
+
"site option",
|
5895 |
+
"site private",
|
5896 |
+
"site public",
|
5897 |
+
"site spam",
|
5898 |
+
"site unarchive",
|
5899 |
+
"site unmature",
|
5900 |
+
"site unspam",
|
5901 |
+
"taxonomy",
|
5902 |
+
"taxonomy get",
|
5903 |
+
"taxonomy list",
|
5904 |
+
"term",
|
5905 |
+
"term create",
|
5906 |
+
"term delete",
|
5907 |
+
"term generate",
|
5908 |
+
"term get",
|
5909 |
+
"term list",
|
5910 |
+
"term meta",
|
5911 |
+
"term meta add",
|
5912 |
+
"term meta delete",
|
5913 |
+
"term meta get",
|
5914 |
+
"term meta list",
|
5915 |
+
"term meta patch",
|
5916 |
+
"term meta pluck",
|
5917 |
+
"term meta update",
|
5918 |
+
"term recount",
|
5919 |
+
"term update",
|
5920 |
+
"user",
|
5921 |
+
"user add-cap",
|
5922 |
+
"user add-role",
|
5923 |
+
"user create",
|
5924 |
+
"user delete",
|
5925 |
+
"user generate",
|
5926 |
+
"user get",
|
5927 |
+
"user import-csv",
|
5928 |
+
"user list",
|
5929 |
+
"user list-caps",
|
5930 |
+
"user meta",
|
5931 |
+
"user meta add",
|
5932 |
+
"user meta delete",
|
5933 |
+
"user meta get",
|
5934 |
+
"user meta list",
|
5935 |
+
"user meta patch",
|
5936 |
+
"user meta pluck",
|
5937 |
+
"user meta update",
|
5938 |
+
"user remove-cap",
|
5939 |
+
"user remove-role",
|
5940 |
+
"user reset-password",
|
5941 |
+
"user session",
|
5942 |
+
"user session destroy",
|
5943 |
+
"user session list",
|
5944 |
+
"user set-role",
|
5945 |
+
"user spam",
|
5946 |
+
"user term",
|
5947 |
+
"user term add",
|
5948 |
+
"user term list",
|
5949 |
+
"user term remove",
|
5950 |
+
"user term set",
|
5951 |
+
"user unspam",
|
5952 |
+
"user update"
|
5953 |
+
]
|
5954 |
+
},
|
5955 |
+
"autoload": {
|
5956 |
+
"psr-4": {
|
5957 |
+
"": "src/",
|
5958 |
+
"WP_CLI\\": "src/WP_CLI"
|
5959 |
+
},
|
5960 |
+
"files": [
|
5961 |
+
"entity-command.php"
|
5962 |
+
]
|
5963 |
+
},
|
5964 |
+
"notification-url": "https://packagist.org/downloads/",
|
5965 |
+
"license": [
|
5966 |
+
"MIT"
|
5967 |
+
],
|
5968 |
+
"authors": [
|
5969 |
+
{
|
5970 |
+
"name": "Daniel Bachhuber",
|
5971 |
+
"email": "daniel@runcommand.io",
|
5972 |
+
"homepage": "https://runcommand.io"
|
5973 |
+
}
|
5974 |
+
],
|
5975 |
+
"description": "Manage WordPress comments, menus, options, posts, sites, terms, and users.",
|
5976 |
+
"homepage": "https://github.com/wp-cli/entity-command",
|
5977 |
+
"time": "2019-11-12T11:32:14+00:00"
|
5978 |
+
},
|
5979 |
+
{
|
5980 |
+
"name": "wp-cli/eval-command",
|
5981 |
+
"version": "v2.0.6",
|
5982 |
+
"source": {
|
5983 |
+
"type": "git",
|
5984 |
+
"url": "https://github.com/wp-cli/eval-command.git",
|
5985 |
+
"reference": "d379732f9899387a6a631ccea5116b3da6f16300"
|
5986 |
+
},
|
5987 |
+
"dist": {
|
5988 |
+
"type": "zip",
|
5989 |
+
"url": "https://api.github.com/repos/wp-cli/eval-command/zipball/d379732f9899387a6a631ccea5116b3da6f16300",
|
5990 |
+
"reference": "d379732f9899387a6a631ccea5116b3da6f16300",
|
5991 |
+
"shasum": ""
|
5992 |
+
},
|
5993 |
+
"require": {
|
5994 |
+
"wp-cli/wp-cli": "^2"
|
5995 |
+
},
|
5996 |
+
"require-dev": {
|
5997 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
5998 |
+
},
|
5999 |
+
"type": "wp-cli-package",
|
6000 |
+
"extra": {
|
6001 |
+
"branch-alias": {
|
6002 |
+
"dev-master": "2.x-dev"
|
6003 |
+
},
|
6004 |
+
"bundled": true,
|
6005 |
+
"commands": [
|
6006 |
+
"eval",
|
6007 |
+
"eval-file"
|
6008 |
+
]
|
6009 |
+
},
|
6010 |
+
"autoload": {
|
6011 |
+
"psr-4": {
|
6012 |
+
"": "src/"
|
6013 |
+
},
|
6014 |
+
"files": [
|
6015 |
+
"eval-command.php"
|
6016 |
+
]
|
6017 |
+
},
|
6018 |
+
"notification-url": "https://packagist.org/downloads/",
|
6019 |
+
"license": [
|
6020 |
+
"MIT"
|
6021 |
+
],
|
6022 |
+
"authors": [
|
6023 |
+
{
|
6024 |
+
"name": "Daniel Bachhuber",
|
6025 |
+
"email": "daniel@runcommand.io",
|
6026 |
+
"homepage": "https://runcommand.io"
|
6027 |
+
}
|
6028 |
+
],
|
6029 |
+
"description": "Executes arbitrary PHP code or files.",
|
6030 |
+
"homepage": "https://github.com/wp-cli/eval-command",
|
6031 |
+
"time": "2020-02-06T11:24:47+00:00"
|
6032 |
+
},
|
6033 |
+
{
|
6034 |
+
"name": "wp-cli/export-command",
|
6035 |
+
"version": "v2.0.3",
|
6036 |
+
"source": {
|
6037 |
+
"type": "git",
|
6038 |
+
"url": "https://github.com/wp-cli/export-command.git",
|
6039 |
+
"reference": "a31b1777a199a8437127ad3db1b6b92e9cb5cd9b"
|
6040 |
+
},
|
6041 |
+
"dist": {
|
6042 |
+
"type": "zip",
|
6043 |
+
"url": "https://api.github.com/repos/wp-cli/export-command/zipball/a31b1777a199a8437127ad3db1b6b92e9cb5cd9b",
|
6044 |
+
"reference": "a31b1777a199a8437127ad3db1b6b92e9cb5cd9b",
|
6045 |
+
"shasum": ""
|
6046 |
+
},
|
6047 |
+
"require": {
|
6048 |
+
"nb/oxymel": "~0.1.0",
|
6049 |
+
"wp-cli/wp-cli": "^2"
|
6050 |
+
},
|
6051 |
+
"require-dev": {
|
6052 |
+
"wp-cli/db-command": "^1.3 || ^2",
|
6053 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
6054 |
+
"wp-cli/extension-command": "^1.2 || ^2",
|
6055 |
+
"wp-cli/import-command": "^1 || ^2",
|
6056 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6057 |
+
},
|
6058 |
+
"type": "wp-cli-package",
|
6059 |
+
"extra": {
|
6060 |
+
"branch-alias": {
|
6061 |
+
"dev-master": "2.x-dev"
|
6062 |
+
},
|
6063 |
+
"bundled": true,
|
6064 |
+
"commands": [
|
6065 |
+
"export"
|
6066 |
+
]
|
6067 |
+
},
|
6068 |
+
"autoload": {
|
6069 |
+
"psr-4": {
|
6070 |
+
"": "src/"
|
6071 |
+
},
|
6072 |
+
"files": [
|
6073 |
+
"export-command.php"
|
6074 |
+
]
|
6075 |
+
},
|
6076 |
+
"notification-url": "https://packagist.org/downloads/",
|
6077 |
+
"license": [
|
6078 |
+
"MIT"
|
6079 |
+
],
|
6080 |
+
"authors": [
|
6081 |
+
{
|
6082 |
+
"name": "Daniel Bachhuber",
|
6083 |
+
"email": "daniel@runcommand.io",
|
6084 |
+
"homepage": "https://runcommand.io"
|
6085 |
+
}
|
6086 |
+
],
|
6087 |
+
"description": "Exports WordPress content to a WXR file.",
|
6088 |
+
"homepage": "https://github.com/wp-cli/export-command",
|
6089 |
+
"time": "2019-07-16T16:39:17+00:00"
|
6090 |
+
},
|
6091 |
+
{
|
6092 |
+
"name": "wp-cli/extension-command",
|
6093 |
+
"version": "v2.0.8",
|
6094 |
+
"source": {
|
6095 |
+
"type": "git",
|
6096 |
+
"url": "https://github.com/wp-cli/extension-command.git",
|
6097 |
+
"reference": "3f55805356ccc502f38a24f224b8943f181d4813"
|
6098 |
+
},
|
6099 |
+
"dist": {
|
6100 |
+
"type": "zip",
|
6101 |
+
"url": "https://api.github.com/repos/wp-cli/extension-command/zipball/3f55805356ccc502f38a24f224b8943f181d4813",
|
6102 |
+
"reference": "3f55805356ccc502f38a24f224b8943f181d4813",
|
6103 |
+
"shasum": ""
|
6104 |
+
},
|
6105 |
+
"require": {
|
6106 |
+
"composer/semver": "^1.4",
|
6107 |
+
"wp-cli/wp-cli": "^2"
|
6108 |
+
},
|
6109 |
+
"require-dev": {
|
6110 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
6111 |
+
"wp-cli/scaffold-command": "^1.2 || ^2",
|
6112 |
+
"wp-cli/wp-cli-tests": "^2.1.6"
|
6113 |
+
},
|
6114 |
+
"type": "wp-cli-package",
|
6115 |
+
"extra": {
|
6116 |
+
"branch-alias": {
|
6117 |
+
"dev-master": "2.x-dev"
|
6118 |
+
},
|
6119 |
+
"bundled": true,
|
6120 |
+
"commands": [
|
6121 |
+
"plugin",
|
6122 |
+
"plugin activate",
|
6123 |
+
"plugin deactivate",
|
6124 |
+
"plugin delete",
|
6125 |
+
"plugin get",
|
6126 |
+
"plugin install",
|
6127 |
+
"plugin is-installed",
|
6128 |
+
"plugin list",
|
6129 |
+
"plugin path",
|
6130 |
+
"plugin search",
|
6131 |
+
"plugin status",
|
6132 |
+
"plugin toggle",
|
6133 |
+
"plugin uninstall",
|
6134 |
+
"plugin update",
|
6135 |
+
"theme",
|
6136 |
+
"theme activate",
|
6137 |
+
"theme delete",
|
6138 |
+
"theme disable",
|
6139 |
+
"theme enable",
|
6140 |
+
"theme get",
|
6141 |
+
"theme install",
|
6142 |
+
"theme is-installed",
|
6143 |
+
"theme list",
|
6144 |
+
"theme mod",
|
6145 |
+
"theme mod get",
|
6146 |
+
"theme mod set",
|
6147 |
+
"theme mod remove",
|
6148 |
+
"theme path",
|
6149 |
+
"theme search",
|
6150 |
+
"theme status",
|
6151 |
+
"theme update",
|
6152 |
+
"theme mod list"
|
6153 |
+
]
|
6154 |
+
},
|
6155 |
+
"autoload": {
|
6156 |
+
"psr-4": {
|
6157 |
+
"": "src/"
|
6158 |
+
},
|
6159 |
+
"files": [
|
6160 |
+
"extension-command.php"
|
6161 |
+
]
|
6162 |
+
},
|
6163 |
+
"notification-url": "https://packagist.org/downloads/",
|
6164 |
+
"license": [
|
6165 |
+
"MIT"
|
6166 |
+
],
|
6167 |
+
"authors": [
|
6168 |
+
{
|
6169 |
+
"name": "Daniel Bachhuber",
|
6170 |
+
"email": "daniel@runcommand.io",
|
6171 |
+
"homepage": "https://runcommand.io"
|
6172 |
+
}
|
6173 |
+
],
|
6174 |
+
"description": "Manages plugins and themes, including installs, activations, and updates.",
|
6175 |
+
"homepage": "https://github.com/wp-cli/extension-command",
|
6176 |
+
"time": "2020-02-24T02:53:35+00:00"
|
6177 |
+
},
|
6178 |
+
{
|
6179 |
+
"name": "wp-cli/i18n-command",
|
6180 |
+
"version": "v2.2.2",
|
6181 |
+
"source": {
|
6182 |
+
"type": "git",
|
6183 |
+
"url": "https://github.com/wp-cli/i18n-command.git",
|
6184 |
+
"reference": "2804c5246d9338da59951737b03c54d257be8e47"
|
6185 |
+
},
|
6186 |
+
"dist": {
|
6187 |
+
"type": "zip",
|
6188 |
+
"url": "https://api.github.com/repos/wp-cli/i18n-command/zipball/2804c5246d9338da59951737b03c54d257be8e47",
|
6189 |
+
"reference": "2804c5246d9338da59951737b03c54d257be8e47",
|
6190 |
+
"shasum": ""
|
6191 |
+
},
|
6192 |
+
"require": {
|
6193 |
+
"gettext/gettext": "^4.8",
|
6194 |
+
"mck89/peast": "^1.8",
|
6195 |
+
"wp-cli/wp-cli": "^2"
|
6196 |
+
},
|
6197 |
+
"require-dev": {
|
6198 |
+
"wp-cli/scaffold-command": "^1.2 || ^2",
|
6199 |
+
"wp-cli/wp-cli-tests": "^2.1.3"
|
6200 |
+
},
|
6201 |
+
"type": "wp-cli-package",
|
6202 |
+
"extra": {
|
6203 |
+
"branch-alias": {
|
6204 |
+
"dev-master": "2.x-dev"
|
6205 |
+
},
|
6206 |
+
"bundled": true,
|
6207 |
+
"commands": [
|
6208 |
+
"i18n",
|
6209 |
+
"i18n make-pot",
|
6210 |
+
"i18n make-json"
|
6211 |
+
]
|
6212 |
+
},
|
6213 |
+
"autoload": {
|
6214 |
+
"psr-4": {
|
6215 |
+
"WP_CLI\\I18n\\": "src/"
|
6216 |
+
},
|
6217 |
+
"files": [
|
6218 |
+
"i18n-command.php"
|
6219 |
+
]
|
6220 |
+
},
|
6221 |
+
"notification-url": "https://packagist.org/downloads/",
|
6222 |
+
"license": [
|
6223 |
+
"MIT"
|
6224 |
+
],
|
6225 |
+
"authors": [
|
6226 |
+
{
|
6227 |
+
"name": "Pascal Birchler",
|
6228 |
+
"homepage": "https://pascalbirchler.com/"
|
6229 |
+
}
|
6230 |
+
],
|
6231 |
+
"description": "Provides internationalization tools for WordPress projects.",
|
6232 |
+
"homepage": "https://github.com/wp-cli/i18n-command",
|
6233 |
+
"time": "2019-12-13T09:00:43+00:00"
|
6234 |
+
},
|
6235 |
+
{
|
6236 |
+
"name": "wp-cli/import-command",
|
6237 |
+
"version": "v2.0.2",
|
6238 |
+
"source": {
|
6239 |
+
"type": "git",
|
6240 |
+
"url": "https://github.com/wp-cli/import-command.git",
|
6241 |
+
"reference": "e28a7f55138ceb53f2ff5926874d8e5582c87db8"
|
6242 |
+
},
|
6243 |
+
"dist": {
|
6244 |
+
"type": "zip",
|
6245 |
+
"url": "https://api.github.com/repos/wp-cli/import-command/zipball/e28a7f55138ceb53f2ff5926874d8e5582c87db8",
|
6246 |
+
"reference": "e28a7f55138ceb53f2ff5926874d8e5582c87db8",
|
6247 |
+
"shasum": ""
|
6248 |
+
},
|
6249 |
+
"require": {
|
6250 |
+
"wp-cli/wp-cli": "^2"
|
6251 |
+
},
|
6252 |
+
"require-dev": {
|
6253 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
6254 |
+
"wp-cli/export-command": "^1 || ^2",
|
6255 |
+
"wp-cli/extension-command": "^1.2 || ^2",
|
6256 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6257 |
+
},
|
6258 |
+
"type": "wp-cli-package",
|
6259 |
+
"extra": {
|
6260 |
+
"branch-alias": {
|
6261 |
+
"dev-master": "2.x-dev"
|
6262 |
+
},
|
6263 |
+
"bundled": true,
|
6264 |
+
"commands": [
|
6265 |
+
"import"
|
6266 |
+
]
|
6267 |
+
},
|
6268 |
+
"autoload": {
|
6269 |
+
"psr-4": {
|
6270 |
+
"": "src/"
|
6271 |
+
},
|
6272 |
+
"files": [
|
6273 |
+
"import-command.php"
|
6274 |
+
]
|
6275 |
+
},
|
6276 |
+
"notification-url": "https://packagist.org/downloads/",
|
6277 |
+
"license": [
|
6278 |
+
"MIT"
|
6279 |
+
],
|
6280 |
+
"authors": [
|
6281 |
+
{
|
6282 |
+
"name": "Daniel Bachhuber",
|
6283 |
+
"email": "daniel@runcommand.io",
|
6284 |
+
"homepage": "https://runcommand.io"
|
6285 |
+
}
|
6286 |
+
],
|
6287 |
+
"description": "Imports content from a given WXR file.",
|
6288 |
+
"homepage": "https://github.com/wp-cli/import-command",
|
6289 |
+
"time": "2019-04-19T14:32:57+00:00"
|
6290 |
+
},
|
6291 |
+
{
|
6292 |
+
"name": "wp-cli/language-command",
|
6293 |
+
"version": "v2.0.5",
|
6294 |
+
"source": {
|
6295 |
+
"type": "git",
|
6296 |
+
"url": "https://github.com/wp-cli/language-command.git",
|
6297 |
+
"reference": "a14a385efffba2060f947afa85f7ffd7e7cda5d7"
|
6298 |
+
},
|
6299 |
+
"dist": {
|
6300 |
+
"type": "zip",
|
6301 |
+
"url": "https://api.github.com/repos/wp-cli/language-command/zipball/a14a385efffba2060f947afa85f7ffd7e7cda5d7",
|
6302 |
+
"reference": "a14a385efffba2060f947afa85f7ffd7e7cda5d7",
|
6303 |
+
"shasum": ""
|
6304 |
+
},
|
6305 |
+
"require": {
|
6306 |
+
"wp-cli/wp-cli": "^2"
|
6307 |
+
},
|
6308 |
+
"require-dev": {
|
6309 |
+
"wp-cli/db-command": "^1.3 || ^2",
|
6310 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
6311 |
+
"wp-cli/extension-command": "^1.2 || ^2",
|
6312 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6313 |
+
},
|
6314 |
+
"type": "wp-cli-package",
|
6315 |
+
"extra": {
|
6316 |
+
"branch-alias": {
|
6317 |
+
"dev-master": "2.x-dev"
|
6318 |
+
},
|
6319 |
+
"bundled": true,
|
6320 |
+
"commands": [
|
6321 |
+
"language",
|
6322 |
+
"language core",
|
6323 |
+
"language core activate",
|
6324 |
+
"language core is-installed",
|
6325 |
+
"language core install",
|
6326 |
+
"language core list",
|
6327 |
+
"language core uninstall",
|
6328 |
+
"language core update",
|
6329 |
+
"language plugin",
|
6330 |
+
"language plugin is-installed",
|
6331 |
+
"language plugin install",
|
6332 |
+
"language plugin list",
|
6333 |
+
"language plugin uninstall",
|
6334 |
+
"language plugin update",
|
6335 |
+
"language theme",
|
6336 |
+
"language theme is-installed",
|
6337 |
+
"language theme install",
|
6338 |
+
"language theme list",
|
6339 |
+
"language theme uninstall",
|
6340 |
+
"language theme update"
|
6341 |
+
]
|
6342 |
+
},
|
6343 |
+
"autoload": {
|
6344 |
+
"psr-4": {
|
6345 |
+
"": "src/"
|
6346 |
+
},
|
6347 |
+
"files": [
|
6348 |
+
"language-command.php"
|
6349 |
+
]
|
6350 |
+
},
|
6351 |
+
"notification-url": "https://packagist.org/downloads/",
|
6352 |
+
"license": [
|
6353 |
+
"MIT"
|
6354 |
+
],
|
6355 |
+
"authors": [
|
6356 |
+
{
|
6357 |
+
"name": "Daniel Bachhuber",
|
6358 |
+
"email": "daniel@runcommand.io",
|
6359 |
+
"homepage": "https://runcommand.io"
|
6360 |
+
}
|
6361 |
+
],
|
6362 |
+
"description": "Installs, activates, and manages language packs.",
|
6363 |
+
"homepage": "https://github.com/wp-cli/language-command",
|
6364 |
+
"time": "2019-11-12T01:33:31+00:00"
|
6365 |
+
},
|
6366 |
+
{
|
6367 |
+
"name": "wp-cli/maintenance-mode-command",
|
6368 |
+
"version": "v2.0.2",
|
6369 |
+
"source": {
|
6370 |
+
"type": "git",
|
6371 |
+
"url": "https://github.com/wp-cli/maintenance-mode-command.git",
|
6372 |
+
"reference": "3c80e731e1032607a2e9589ae6b6398e95c05b91"
|
6373 |
+
},
|
6374 |
+
"dist": {
|
6375 |
+
"type": "zip",
|
6376 |
+
"url": "https://api.github.com/repos/wp-cli/maintenance-mode-command/zipball/3c80e731e1032607a2e9589ae6b6398e95c05b91",
|
6377 |
+
"reference": "3c80e731e1032607a2e9589ae6b6398e95c05b91",
|
6378 |
+
"shasum": ""
|
6379 |
+
},
|
6380 |
+
"require": {
|
6381 |
+
"wp-cli/wp-cli": "^2"
|
6382 |
+
},
|
6383 |
+
"require-dev": {
|
6384 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6385 |
+
},
|
6386 |
+
"type": "wp-cli-package",
|
6387 |
+
"extra": {
|
6388 |
+
"branch-alias": {
|
6389 |
+
"dev-master": "2.x-dev"
|
6390 |
+
},
|
6391 |
+
"bundled": true,
|
6392 |
+
"commands": [
|
6393 |
+
"maintenance-mode",
|
6394 |
+
"maintenance-mode activate",
|
6395 |
+
"maintenance-mode deactivate",
|
6396 |
+
"maintenance-mode status",
|
6397 |
+
"maintenance-mode is-active"
|
6398 |
+
]
|
6399 |
+
},
|
6400 |
+
"autoload": {
|
6401 |
+
"psr-4": {
|
6402 |
+
"WP_CLI\\MaintenanceMode\\": "src/"
|
6403 |
+
},
|
6404 |
+
"files": [
|
6405 |
+
"maintenance-mode-command.php"
|
6406 |
+
]
|
6407 |
+
},
|
6408 |
+
"notification-url": "https://packagist.org/downloads/",
|
6409 |
+
"license": [
|
6410 |
+
"MIT"
|
6411 |
+
],
|
6412 |
+
"authors": [
|
6413 |
+
{
|
6414 |
+
"name": "Thrijith Thankachan",
|
6415 |
+
"email": "thrijith13@gmail.com",
|
6416 |
+
"homepage": "https://thrijith.com"
|
6417 |
+
}
|
6418 |
+
],
|
6419 |
+
"description": "Activates, deactivates or checks the status of the maintenance mode of a site.",
|
6420 |
+
"homepage": "https://github.com/wp-cli/maintenance-mode-command",
|
6421 |
+
"time": "2019-11-12T01:32:41+00:00"
|
6422 |
+
},
|
6423 |
+
{
|
6424 |
+
"name": "wp-cli/media-command",
|
6425 |
+
"version": "v2.0.7",
|
6426 |
+
"source": {
|
6427 |
+
"type": "git",
|
6428 |
+
"url": "https://github.com/wp-cli/media-command.git",
|
6429 |
+
"reference": "0b7fbee4c4aa9335b83fd5c65183808949ba1c8e"
|
6430 |
+
},
|
6431 |
+
"dist": {
|
6432 |
+
"type": "zip",
|
6433 |
+
"url": "https://api.github.com/repos/wp-cli/media-command/zipball/0b7fbee4c4aa9335b83fd5c65183808949ba1c8e",
|
6434 |
+
"reference": "0b7fbee4c4aa9335b83fd5c65183808949ba1c8e",
|
6435 |
+
"shasum": ""
|
6436 |
+
},
|
6437 |
+
"require": {
|
6438 |
+
"wp-cli/wp-cli": "^2"
|
6439 |
+
},
|
6440 |
+
"require-dev": {
|
6441 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
6442 |
+
"wp-cli/extension-command": "^2.0",
|
6443 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6444 |
+
},
|
6445 |
+
"type": "wp-cli-package",
|
6446 |
+
"extra": {
|
6447 |
+
"branch-alias": {
|
6448 |
+
"dev-master": "2.x-dev"
|
6449 |
+
},
|
6450 |
+
"bundled": true,
|
6451 |
+
"commands": [
|
6452 |
+
"media",
|
6453 |
+
"media import",
|
6454 |
+
"media regenerate",
|
6455 |
+
"media image-size"
|
6456 |
+
]
|
6457 |
+
},
|
6458 |
+
"autoload": {
|
6459 |
+
"psr-4": {
|
6460 |
+
"": "src/"
|
6461 |
+
},
|
6462 |
+
"files": [
|
6463 |
+
"media-command.php"
|
6464 |
+
]
|
6465 |
+
},
|
6466 |
+
"notification-url": "https://packagist.org/downloads/",
|
6467 |
+
"license": [
|
6468 |
+
"MIT"
|
6469 |
+
],
|
6470 |
+
"authors": [
|
6471 |
+
{
|
6472 |
+
"name": "Daniel Bachhuber",
|
6473 |
+
"email": "daniel@runcommand.io",
|
6474 |
+
"homepage": "https://runcommand.io"
|
6475 |
+
}
|
6476 |
+
],
|
6477 |
+
"description": "Imports files as attachments, regenerates thumbnails, or lists registered image sizes.",
|
6478 |
+
"homepage": "https://github.com/wp-cli/media-command",
|
6479 |
+
"time": "2019-11-12T11:32:15+00:00"
|
6480 |
+
},
|
6481 |
+
{
|
6482 |
+
"name": "wp-cli/mustangostang-spyc",
|
6483 |
+
"version": "0.6.3",
|
6484 |
+
"source": {
|
6485 |
+
"type": "git",
|
6486 |
+
"url": "https://github.com/wp-cli/spyc.git",
|
6487 |
+
"reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7"
|
6488 |
+
},
|
6489 |
+
"dist": {
|
6490 |
+
"type": "zip",
|
6491 |
+
"url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7",
|
6492 |
+
"reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7",
|
6493 |
+
"shasum": ""
|
6494 |
+
},
|
6495 |
+
"require": {
|
6496 |
+
"php": ">=5.3.1"
|
6497 |
+
},
|
6498 |
+
"require-dev": {
|
6499 |
+
"phpunit/phpunit": "4.3.*@dev"
|
6500 |
+
},
|
6501 |
+
"type": "library",
|
6502 |
+
"extra": {
|
6503 |
+
"branch-alias": {
|
6504 |
+
"dev-master": "0.5.x-dev"
|
6505 |
+
}
|
6506 |
+
},
|
6507 |
+
"autoload": {
|
6508 |
+
"psr-4": {
|
6509 |
+
"Mustangostang\\": "src/"
|
6510 |
+
},
|
6511 |
+
"files": [
|
6512 |
+
"includes/functions.php"
|
6513 |
+
]
|
6514 |
+
},
|
6515 |
+
"notification-url": "https://packagist.org/downloads/",
|
6516 |
+
"license": [
|
6517 |
+
"MIT"
|
6518 |
+
],
|
6519 |
+
"authors": [
|
6520 |
+
{
|
6521 |
+
"name": "mustangostang",
|
6522 |
+
"email": "vlad.andersen@gmail.com"
|
6523 |
+
}
|
6524 |
+
],
|
6525 |
+
"description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)",
|
6526 |
+
"homepage": "https://github.com/mustangostang/spyc/",
|
6527 |
+
"time": "2017-04-25T11:26:20+00:00"
|
6528 |
+
},
|
6529 |
+
{
|
6530 |
+
"name": "wp-cli/package-command",
|
6531 |
+
"version": "v2.0.6",
|
6532 |
+
"source": {
|
6533 |
+
"type": "git",
|
6534 |
+
"url": "https://github.com/wp-cli/package-command.git",
|
6535 |
+
"reference": "92a0d7f2f4b54ad2aeff2292baaa96ba8f93f37a"
|
6536 |
+
},
|
6537 |
+
"dist": {
|
6538 |
+
"type": "zip",
|
6539 |
+
"url": "https://api.github.com/repos/wp-cli/package-command/zipball/92a0d7f2f4b54ad2aeff2292baaa96ba8f93f37a",
|
6540 |
+
"reference": "92a0d7f2f4b54ad2aeff2292baaa96ba8f93f37a",
|
6541 |
+
"shasum": ""
|
6542 |
+
},
|
6543 |
+
"require": {
|
6544 |
+
"composer/composer": ">=1.2.0 <1.7.0 || ^1.7.1",
|
6545 |
+
"ext-json": "*",
|
6546 |
+
"wp-cli/wp-cli": "^2.1"
|
6547 |
+
},
|
6548 |
+
"require-dev": {
|
6549 |
+
"wp-cli/scaffold-command": "^1 || ^2",
|
6550 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6551 |
+
},
|
6552 |
+
"type": "wp-cli-package",
|
6553 |
+
"extra": {
|
6554 |
+
"branch-alias": {
|
6555 |
+
"dev-master": "2.x-dev"
|
6556 |
+
},
|
6557 |
+
"bundled": true,
|
6558 |
+
"commands": [
|
6559 |
+
"package",
|
6560 |
+
"package browse",
|
6561 |
+
"package install",
|
6562 |
+
"package list",
|
6563 |
+
"package update",
|
6564 |
+
"package uninstall"
|
6565 |
+
]
|
6566 |
+
},
|
6567 |
+
"autoload": {
|
6568 |
+
"psr-4": {
|
6569 |
+
"": "src/"
|
6570 |
+
},
|
6571 |
+
"files": [
|
6572 |
+
"package-command.php"
|
6573 |
+
]
|
6574 |
+
},
|
6575 |
+
"notification-url": "https://packagist.org/downloads/",
|
6576 |
+
"license": [
|
6577 |
+
"MIT"
|
6578 |
+
],
|
6579 |
+
"authors": [
|
6580 |
+
{
|
6581 |
+
"name": "Daniel Bachhuber",
|
6582 |
+
"email": "daniel@runcommand.io",
|
6583 |
+
"homepage": "https://runcommand.io"
|
6584 |
+
}
|
6585 |
+
],
|
6586 |
+
"description": "Lists, installs, and removes WP-CLI packages.",
|
6587 |
+
"homepage": "https://github.com/wp-cli/package-command",
|
6588 |
+
"time": "2020-01-28T12:55:09+00:00"
|
6589 |
+
},
|
6590 |
+
{
|
6591 |
+
"name": "wp-cli/php-cli-tools",
|
6592 |
+
"version": "v0.11.11",
|
6593 |
+
"source": {
|
6594 |
+
"type": "git",
|
6595 |
+
"url": "https://github.com/wp-cli/php-cli-tools.git",
|
6596 |
+
"reference": "fe9c7c44a9e1bf2196ec51dc38da0593dbf2993f"
|
6597 |
+
},
|
6598 |
+
"dist": {
|
6599 |
+
"type": "zip",
|
6600 |
+
"url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/fe9c7c44a9e1bf2196ec51dc38da0593dbf2993f",
|
6601 |
+
"reference": "fe9c7c44a9e1bf2196ec51dc38da0593dbf2993f",
|
6602 |
+
"shasum": ""
|
6603 |
+
},
|
6604 |
+
"require": {
|
6605 |
+
"php": ">= 5.3.0"
|
6606 |
+
},
|
6607 |
+
"type": "library",
|
6608 |
+
"autoload": {
|
6609 |
+
"psr-0": {
|
6610 |
+
"cli": "lib/"
|
6611 |
+
},
|
6612 |
+
"files": [
|
6613 |
+
"lib/cli/cli.php"
|
6614 |
+
]
|
6615 |
+
},
|
6616 |
+
"notification-url": "https://packagist.org/downloads/",
|
6617 |
+
"license": [
|
6618 |
+
"MIT"
|
6619 |
+
],
|
6620 |
+
"authors": [
|
6621 |
+
{
|
6622 |
+
"name": "James Logsdon",
|
6623 |
+
"email": "jlogsdon@php.net",
|
6624 |
+
"role": "Developer"
|
6625 |
+
},
|
6626 |
+
{
|
6627 |
+
"name": "Daniel Bachhuber",
|
6628 |
+
"email": "daniel@handbuilt.co",
|
6629 |
+
"role": "Maintainer"
|
6630 |
+
}
|
6631 |
+
],
|
6632 |
+
"description": "Console utilities for PHP",
|
6633 |
+
"homepage": "http://github.com/wp-cli/php-cli-tools",
|
6634 |
+
"keywords": [
|
6635 |
+
"cli",
|
6636 |
+
"console"
|
6637 |
+
],
|
6638 |
+
"time": "2018-09-04T13:28:00+00:00"
|
6639 |
+
},
|
6640 |
+
{
|
6641 |
+
"name": "wp-cli/rewrite-command",
|
6642 |
+
"version": "v2.0.4",
|
6643 |
+
"source": {
|
6644 |
+
"type": "git",
|
6645 |
+
"url": "https://github.com/wp-cli/rewrite-command.git",
|
6646 |
+
"reference": "3879bcbf7e695f68097cedb8415ed04915a25465"
|
6647 |
+
},
|
6648 |
+
"dist": {
|
6649 |
+
"type": "zip",
|
6650 |
+
"url": "https://api.github.com/repos/wp-cli/rewrite-command/zipball/3879bcbf7e695f68097cedb8415ed04915a25465",
|
6651 |
+
"reference": "3879bcbf7e695f68097cedb8415ed04915a25465",
|
6652 |
+
"shasum": ""
|
6653 |
+
},
|
6654 |
+
"require": {
|
6655 |
+
"wp-cli/wp-cli": "^2"
|
6656 |
+
},
|
6657 |
+
"require-dev": {
|
6658 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
6659 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6660 |
+
},
|
6661 |
+
"type": "wp-cli-package",
|
6662 |
+
"extra": {
|
6663 |
+
"branch-alias": {
|
6664 |
+
"dev-master": "2.x-dev"
|
6665 |
+
},
|
6666 |
+
"bundled": true,
|
6667 |
+
"commands": [
|
6668 |
+
"rewrite",
|
6669 |
+
"rewrite flush",
|
6670 |
+
"rewrite list",
|
6671 |
+
"rewrite structure"
|
6672 |
+
]
|
6673 |
+
},
|
6674 |
+
"autoload": {
|
6675 |
+
"psr-4": {
|
6676 |
+
"": "src/"
|
6677 |
+
},
|
6678 |
+
"files": [
|
6679 |
+
"rewrite-command.php"
|
6680 |
+
]
|
6681 |
+
},
|
6682 |
+
"notification-url": "https://packagist.org/downloads/",
|
6683 |
+
"license": [
|
6684 |
+
"MIT"
|
6685 |
+
],
|
6686 |
+
"authors": [
|
6687 |
+
{
|
6688 |
+
"name": "Daniel Bachhuber",
|
6689 |
+
"email": "daniel@runcommand.io",
|
6690 |
+
"homepage": "https://runcommand.io"
|
6691 |
+
}
|
6692 |
+
],
|
6693 |
+
"description": "Lists or flushes the site's rewrite rules, updates the permalink structure.",
|
6694 |
+
"homepage": "https://github.com/wp-cli/rewrite-command",
|
6695 |
+
"time": "2019-11-12T01:31:23+00:00"
|
6696 |
+
},
|
6697 |
+
{
|
6698 |
+
"name": "wp-cli/role-command",
|
6699 |
+
"version": "v2.0.3",
|
6700 |
+
"source": {
|
6701 |
+
"type": "git",
|
6702 |
+
"url": "https://github.com/wp-cli/role-command.git",
|
6703 |
+
"reference": "bad54a1b02331ee6460cc6a6f967e37dd91e07a3"
|
6704 |
+
},
|
6705 |
+
"dist": {
|
6706 |
+
"type": "zip",
|
6707 |
+
"url": "https://api.github.com/repos/wp-cli/role-command/zipball/bad54a1b02331ee6460cc6a6f967e37dd91e07a3",
|
6708 |
+
"reference": "bad54a1b02331ee6460cc6a6f967e37dd91e07a3",
|
6709 |
+
"shasum": ""
|
6710 |
+
},
|
6711 |
+
"require": {
|
6712 |
+
"wp-cli/wp-cli": "^2"
|
6713 |
+
},
|
6714 |
+
"require-dev": {
|
6715 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6716 |
+
},
|
6717 |
+
"type": "wp-cli-package",
|
6718 |
+
"extra": {
|
6719 |
+
"branch-alias": {
|
6720 |
+
"dev-master": "2.x-dev"
|
6721 |
+
},
|
6722 |
+
"bundled": true,
|
6723 |
+
"commands": [
|
6724 |
+
"role",
|
6725 |
+
"role create",
|
6726 |
+
"role delete",
|
6727 |
+
"role exists",
|
6728 |
+
"role list",
|
6729 |
+
"role reset",
|
6730 |
+
"cap",
|
6731 |
+
"cap add",
|
6732 |
+
"cap list",
|
6733 |
+
"cap remove"
|
6734 |
+
]
|
6735 |
+
},
|
6736 |
+
"autoload": {
|
6737 |
+
"psr-4": {
|
6738 |
+
"": "src/"
|
6739 |
+
},
|
6740 |
+
"files": [
|
6741 |
+
"role-command.php"
|
6742 |
+
]
|
6743 |
+
},
|
6744 |
+
"notification-url": "https://packagist.org/downloads/",
|
6745 |
+
"license": [
|
6746 |
+
"MIT"
|
6747 |
+
],
|
6748 |
+
"authors": [
|
6749 |
+
{
|
6750 |
+
"name": "Daniel Bachhuber",
|
6751 |
+
"email": "daniel@runcommand.io",
|
6752 |
+
"homepage": "https://runcommand.io"
|
6753 |
+
}
|
6754 |
+
],
|
6755 |
+
"description": "Adds, removes, lists, and resets roles and capabilities.",
|
6756 |
+
"homepage": "https://github.com/wp-cli/role-command",
|
6757 |
+
"time": "2019-11-12T01:30:59+00:00"
|
6758 |
+
},
|
6759 |
+
{
|
6760 |
+
"name": "wp-cli/scaffold-command",
|
6761 |
+
"version": "v2.0.8",
|
6762 |
+
"source": {
|
6763 |
+
"type": "git",
|
6764 |
+
"url": "https://github.com/wp-cli/scaffold-command.git",
|
6765 |
+
"reference": "4814acbdf3d7af499530cc1ae1e82f3ed9f12674"
|
6766 |
+
},
|
6767 |
+
"dist": {
|
6768 |
+
"type": "zip",
|
6769 |
+
"url": "https://api.github.com/repos/wp-cli/scaffold-command/zipball/4814acbdf3d7af499530cc1ae1e82f3ed9f12674",
|
6770 |
+
"reference": "4814acbdf3d7af499530cc1ae1e82f3ed9f12674",
|
6771 |
+
"shasum": ""
|
6772 |
+
},
|
6773 |
+
"require": {
|
6774 |
+
"php": "^5.4 || ^7.0",
|
6775 |
+
"wp-cli/wp-cli": "^2"
|
6776 |
+
},
|
6777 |
+
"require-dev": {
|
6778 |
+
"wp-cli/extension-command": "^1.2 || ^2",
|
6779 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6780 |
+
},
|
6781 |
+
"type": "wp-cli-package",
|
6782 |
+
"extra": {
|
6783 |
+
"branch-alias": {
|
6784 |
+
"dev-master": "2.x-dev"
|
6785 |
+
},
|
6786 |
+
"bundled": true,
|
6787 |
+
"commands": [
|
6788 |
+
"scaffold",
|
6789 |
+
"scaffold underscores",
|
6790 |
+
"scaffold block",
|
6791 |
+
"scaffold child-theme",
|
6792 |
+
"scaffold plugin",
|
6793 |
+
"scaffold plugin-tests",
|
6794 |
+
"scaffold post-type",
|
6795 |
+
"scaffold taxonomy",
|
6796 |
+
"scaffold theme-tests"
|
6797 |
+
]
|
6798 |
+
},
|
6799 |
+
"autoload": {
|
6800 |
+
"psr-4": {
|
6801 |
+
"": "src/"
|
6802 |
+
},
|
6803 |
+
"files": [
|
6804 |
+
"scaffold-command.php"
|
6805 |
+
]
|
6806 |
+
},
|
6807 |
+
"notification-url": "https://packagist.org/downloads/",
|
6808 |
+
"license": [
|
6809 |
+
"MIT"
|
6810 |
+
],
|
6811 |
+
"authors": [
|
6812 |
+
{
|
6813 |
+
"name": "Daniel Bachhuber",
|
6814 |
+
"email": "daniel@runcommand.io",
|
6815 |
+
"homepage": "https://runcommand.io"
|
6816 |
+
}
|
6817 |
+
],
|
6818 |
+
"description": "Generates code for post types, taxonomies, blocks, plugins, child themes, etc.",
|
6819 |
+
"homepage": "https://github.com/wp-cli/scaffold-command",
|
6820 |
+
"time": "2019-11-25T13:26:31+00:00"
|
6821 |
+
},
|
6822 |
+
{
|
6823 |
+
"name": "wp-cli/search-replace-command",
|
6824 |
+
"version": "v2.0.6",
|
6825 |
+
"source": {
|
6826 |
+
"type": "git",
|
6827 |
+
"url": "https://github.com/wp-cli/search-replace-command.git",
|
6828 |
+
"reference": "f446ca1f90144b496dbacb373868118ba40df028"
|
6829 |
+
},
|
6830 |
+
"dist": {
|
6831 |
+
"type": "zip",
|
6832 |
+
"url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/f446ca1f90144b496dbacb373868118ba40df028",
|
6833 |
+
"reference": "f446ca1f90144b496dbacb373868118ba40df028",
|
6834 |
+
"shasum": ""
|
6835 |
+
},
|
6836 |
+
"require": {
|
6837 |
+
"wp-cli/wp-cli": "^2"
|
6838 |
+
},
|
6839 |
+
"require-dev": {
|
6840 |
+
"wp-cli/db-command": "^1.3 || ^2",
|
6841 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
6842 |
+
"wp-cli/extension-command": "^1.2 || ^2",
|
6843 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6844 |
+
},
|
6845 |
+
"type": "wp-cli-package",
|
6846 |
+
"extra": {
|
6847 |
+
"branch-alias": {
|
6848 |
+
"dev-master": "2.x-dev"
|
6849 |
+
},
|
6850 |
+
"bundled": true,
|
6851 |
+
"commands": [
|
6852 |
+
"search-replace"
|
6853 |
+
]
|
6854 |
+
},
|
6855 |
+
"autoload": {
|
6856 |
+
"psr-4": {
|
6857 |
+
"": "src/"
|
6858 |
+
},
|
6859 |
+
"files": [
|
6860 |
+
"search-replace-command.php"
|
6861 |
+
]
|
6862 |
+
},
|
6863 |
+
"notification-url": "https://packagist.org/downloads/",
|
6864 |
+
"license": [
|
6865 |
+
"MIT"
|
6866 |
+
],
|
6867 |
+
"authors": [
|
6868 |
+
{
|
6869 |
+
"name": "Daniel Bachhuber",
|
6870 |
+
"email": "daniel@runcommand.io",
|
6871 |
+
"homepage": "https://runcommand.io"
|
6872 |
+
}
|
6873 |
+
],
|
6874 |
+
"description": "Searches/replaces strings in the database.",
|
6875 |
+
"homepage": "https://github.com/wp-cli/search-replace-command",
|
6876 |
+
"time": "2019-12-13T09:13:20+00:00"
|
6877 |
+
},
|
6878 |
+
{
|
6879 |
+
"name": "wp-cli/server-command",
|
6880 |
+
"version": "v2.0.4",
|
6881 |
+
"source": {
|
6882 |
+
"type": "git",
|
6883 |
+
"url": "https://github.com/wp-cli/server-command.git",
|
6884 |
+
"reference": "b0c8db803aea2133973a9a35b0d94fb62487b456"
|
6885 |
+
},
|
6886 |
+
"dist": {
|
6887 |
+
"type": "zip",
|
6888 |
+
"url": "https://api.github.com/repos/wp-cli/server-command/zipball/b0c8db803aea2133973a9a35b0d94fb62487b456",
|
6889 |
+
"reference": "b0c8db803aea2133973a9a35b0d94fb62487b456",
|
6890 |
+
"shasum": ""
|
6891 |
+
},
|
6892 |
+
"require": {
|
6893 |
+
"wp-cli/wp-cli": "^2"
|
6894 |
+
},
|
6895 |
+
"require-dev": {
|
6896 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6897 |
+
},
|
6898 |
+
"type": "wp-cli-package",
|
6899 |
+
"extra": {
|
6900 |
+
"branch-alias": {
|
6901 |
+
"dev-master": "2.x-dev"
|
6902 |
+
},
|
6903 |
+
"bundled": true,
|
6904 |
+
"commands": [
|
6905 |
+
"server"
|
6906 |
+
]
|
6907 |
+
},
|
6908 |
+
"autoload": {
|
6909 |
+
"psr-4": {
|
6910 |
+
"": "src/"
|
6911 |
+
},
|
6912 |
+
"files": [
|
6913 |
+
"server-command.php"
|
6914 |
+
]
|
6915 |
+
},
|
6916 |
+
"notification-url": "https://packagist.org/downloads/",
|
6917 |
+
"license": [
|
6918 |
+
"MIT"
|
6919 |
+
],
|
6920 |
+
"authors": [
|
6921 |
+
{
|
6922 |
+
"name": "Daniel Bachhuber",
|
6923 |
+
"email": "daniel@runcommand.io",
|
6924 |
+
"homepage": "https://runcommand.io"
|
6925 |
+
}
|
6926 |
+
],
|
6927 |
+
"description": "Launches PHP's built-in web server for a specific WordPress installation.",
|
6928 |
+
"homepage": "https://github.com/wp-cli/server-command",
|
6929 |
+
"time": "2019-11-12T11:32:15+00:00"
|
6930 |
+
},
|
6931 |
+
{
|
6932 |
+
"name": "wp-cli/shell-command",
|
6933 |
+
"version": "v2.0.4",
|
6934 |
+
"source": {
|
6935 |
+
"type": "git",
|
6936 |
+
"url": "https://github.com/wp-cli/shell-command.git",
|
6937 |
+
"reference": "293cc82fe6e99c0168bf834787ac5d0e17825723"
|
6938 |
+
},
|
6939 |
+
"dist": {
|
6940 |
+
"type": "zip",
|
6941 |
+
"url": "https://api.github.com/repos/wp-cli/shell-command/zipball/293cc82fe6e99c0168bf834787ac5d0e17825723",
|
6942 |
+
"reference": "293cc82fe6e99c0168bf834787ac5d0e17825723",
|
6943 |
+
"shasum": ""
|
6944 |
+
},
|
6945 |
+
"require": {
|
6946 |
+
"wp-cli/wp-cli": "^2"
|
6947 |
+
},
|
6948 |
+
"require-dev": {
|
6949 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
6950 |
+
},
|
6951 |
+
"type": "wp-cli-package",
|
6952 |
+
"extra": {
|
6953 |
+
"branch-alias": {
|
6954 |
+
"dev-master": "2.x-dev"
|
6955 |
+
},
|
6956 |
+
"bundled": true,
|
6957 |
+
"commands": [
|
6958 |
+
"shell"
|
6959 |
+
]
|
6960 |
+
},
|
6961 |
+
"autoload": {
|
6962 |
+
"psr-4": {
|
6963 |
+
"": "src/",
|
6964 |
+
"WP_CLI\\": "src/WP_CLI"
|
6965 |
+
},
|
6966 |
+
"files": [
|
6967 |
+
"shell-command.php"
|
6968 |
+
]
|
6969 |
+
},
|
6970 |
+
"notification-url": "https://packagist.org/downloads/",
|
6971 |
+
"license": [
|
6972 |
+
"MIT"
|
6973 |
+
],
|
6974 |
+
"authors": [
|
6975 |
+
{
|
6976 |
+
"name": "Daniel Bachhuber",
|
6977 |
+
"email": "daniel@runcommand.io",
|
6978 |
+
"homepage": "https://runcommand.io"
|
6979 |
+
}
|
6980 |
+
],
|
6981 |
+
"description": "Opens an interactive PHP console for running and testing PHP code.",
|
6982 |
+
"homepage": "https://github.com/wp-cli/shell-command",
|
6983 |
+
"time": "2019-11-12T01:29:25+00:00"
|
6984 |
+
},
|
6985 |
+
{
|
6986 |
+
"name": "wp-cli/super-admin-command",
|
6987 |
+
"version": "v2.0.3",
|
6988 |
+
"source": {
|
6989 |
+
"type": "git",
|
6990 |
+
"url": "https://github.com/wp-cli/super-admin-command.git",
|
6991 |
+
"reference": "b3f3078d25c17ee586a5f31cb5ce3553613e85b4"
|
6992 |
+
},
|
6993 |
+
"dist": {
|
6994 |
+
"type": "zip",
|
6995 |
+
"url": "https://api.github.com/repos/wp-cli/super-admin-command/zipball/b3f3078d25c17ee586a5f31cb5ce3553613e85b4",
|
6996 |
+
"reference": "b3f3078d25c17ee586a5f31cb5ce3553613e85b4",
|
6997 |
+
"shasum": ""
|
6998 |
+
},
|
6999 |
+
"require": {
|
7000 |
+
"wp-cli/wp-cli": "^2"
|
7001 |
+
},
|
7002 |
+
"require-dev": {
|
7003 |
+
"wp-cli/entity-command": "^1.3 || ^2",
|
7004 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
7005 |
+
},
|
7006 |
+
"type": "wp-cli-package",
|
7007 |
+
"extra": {
|
7008 |
+
"branch-alias": {
|
7009 |
+
"dev-master": "2.x-dev"
|
7010 |
+
},
|
7011 |
+
"bundled": true,
|
7012 |
+
"commands": [
|
7013 |
+
"super-admin",
|
7014 |
+
"super-admin add",
|
7015 |
+
"super-admin list",
|
7016 |
+
"super-admin remove"
|
7017 |
+
]
|
7018 |
+
},
|
7019 |
+
"autoload": {
|
7020 |
+
"psr-4": {
|
7021 |
+
"": "src/"
|
7022 |
+
},
|
7023 |
+
"files": [
|
7024 |
+
"super-admin-command.php"
|
7025 |
+
]
|
7026 |
+
},
|
7027 |
+
"notification-url": "https://packagist.org/downloads/",
|
7028 |
+
"license": [
|
7029 |
+
"MIT"
|
7030 |
+
],
|
7031 |
+
"authors": [
|
7032 |
+
{
|
7033 |
+
"name": "Daniel Bachhuber",
|
7034 |
+
"email": "daniel@runcommand.io",
|
7035 |
+
"homepage": "https://runcommand.io"
|
7036 |
+
}
|
7037 |
+
],
|
7038 |
+
"description": "Lists, adds, or removes super admin users on a multisite installation.",
|
7039 |
+
"homepage": "https://github.com/wp-cli/super-admin-command",
|
7040 |
+
"time": "2019-11-12T01:28:59+00:00"
|
7041 |
+
},
|
7042 |
+
{
|
7043 |
+
"name": "wp-cli/widget-command",
|
7044 |
+
"version": "v2.1.0",
|
7045 |
+
"source": {
|
7046 |
+
"type": "git",
|
7047 |
+
"url": "https://github.com/wp-cli/widget-command.git",
|
7048 |
+
"reference": "ddbc2c3e9966fae8de05a3200b04e0faf42fe06f"
|
7049 |
+
},
|
7050 |
+
"dist": {
|
7051 |
+
"type": "zip",
|
7052 |
+
"url": "https://api.github.com/repos/wp-cli/widget-command/zipball/ddbc2c3e9966fae8de05a3200b04e0faf42fe06f",
|
7053 |
+
"reference": "ddbc2c3e9966fae8de05a3200b04e0faf42fe06f",
|
7054 |
+
"shasum": ""
|
7055 |
+
},
|
7056 |
+
"require": {
|
7057 |
+
"wp-cli/wp-cli": "^2.4"
|
7058 |
+
},
|
7059 |
+
"require-dev": {
|
7060 |
+
"wp-cli/extension-command": "^1.2 || ^2",
|
7061 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
7062 |
+
},
|
7063 |
+
"type": "wp-cli-package",
|
7064 |
+
"extra": {
|
7065 |
+
"branch-alias": {
|
7066 |
+
"dev-master": "2.x-dev"
|
7067 |
+
},
|
7068 |
+
"bundled": true,
|
7069 |
+
"commands": [
|
7070 |
+
"widget",
|
7071 |
+
"widget add",
|
7072 |
+
"widget deactivate",
|
7073 |
+
"widget delete",
|
7074 |
+
"widget list",
|
7075 |
+
"widget move",
|
7076 |
+
"widget reset",
|
7077 |
+
"widget update",
|
7078 |
+
"sidebar",
|
7079 |
+
"sidebar list"
|
7080 |
+
]
|
7081 |
+
},
|
7082 |
+
"autoload": {
|
7083 |
+
"psr-4": {
|
7084 |
+
"": "src/"
|
7085 |
+
},
|
7086 |
+
"files": [
|
7087 |
+
"widget-command.php"
|
7088 |
+
]
|
7089 |
+
},
|
7090 |
+
"notification-url": "https://packagist.org/downloads/",
|
7091 |
+
"license": [
|
7092 |
+
"MIT"
|
7093 |
+
],
|
7094 |
+
"authors": [
|
7095 |
+
{
|
7096 |
+
"name": "Daniel Bachhuber",
|
7097 |
+
"email": "daniel@runcommand.io",
|
7098 |
+
"homepage": "https://runcommand.io"
|
7099 |
+
}
|
7100 |
+
],
|
7101 |
+
"description": "Adds, moves, and removes widgets; lists sidebars.",
|
7102 |
+
"homepage": "https://github.com/wp-cli/widget-command",
|
7103 |
+
"time": "2020-01-18T02:17:30+00:00"
|
7104 |
+
},
|
7105 |
+
{
|
7106 |
+
"name": "wp-cli/wp-cli",
|
7107 |
+
"version": "v2.4.1",
|
7108 |
+
"source": {
|
7109 |
+
"type": "git",
|
7110 |
+
"url": "https://github.com/wp-cli/wp-cli.git",
|
7111 |
+
"reference": "ceb18598e79befa9b2a37a51efbb34910628988b"
|
7112 |
+
},
|
7113 |
+
"dist": {
|
7114 |
+
"type": "zip",
|
7115 |
+
"url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/ceb18598e79befa9b2a37a51efbb34910628988b",
|
7116 |
+
"reference": "ceb18598e79befa9b2a37a51efbb34910628988b",
|
7117 |
+
"shasum": ""
|
7118 |
+
},
|
7119 |
+
"require": {
|
7120 |
+
"ext-curl": "*",
|
7121 |
+
"mustache/mustache": "~2.13",
|
7122 |
+
"php": "^5.4 || ^7.0",
|
7123 |
+
"rmccue/requests": "~1.6",
|
7124 |
+
"symfony/finder": ">2.7",
|
7125 |
+
"wp-cli/mustangostang-spyc": "^0.6.3",
|
7126 |
+
"wp-cli/php-cli-tools": "~0.11.2"
|
7127 |
+
},
|
7128 |
+
"require-dev": {
|
7129 |
+
"roave/security-advisories": "dev-master",
|
7130 |
+
"wp-cli/db-command": "^1.3 || ^2",
|
7131 |
+
"wp-cli/entity-command": "^1.2 || ^2",
|
7132 |
+
"wp-cli/extension-command": "^1.1 || ^2",
|
7133 |
+
"wp-cli/package-command": "^1 || ^2",
|
7134 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
7135 |
+
},
|
7136 |
+
"suggest": {
|
7137 |
+
"ext-readline": "Include for a better --prompt implementation",
|
7138 |
+
"ext-zip": "Needed to support extraction of ZIP archives when doing downloads or updates"
|
7139 |
+
},
|
7140 |
+
"bin": [
|
7141 |
+
"bin/wp",
|
7142 |
+
"bin/wp.bat"
|
7143 |
+
],
|
7144 |
+
"type": "library",
|
7145 |
+
"extra": {
|
7146 |
+
"branch-alias": {
|
7147 |
+
"dev-master": "2.4.x-dev"
|
7148 |
+
}
|
7149 |
+
},
|
7150 |
+
"autoload": {
|
7151 |
+
"psr-0": {
|
7152 |
+
"WP_CLI": "php"
|
7153 |
+
}
|
7154 |
+
},
|
7155 |
+
"notification-url": "https://packagist.org/downloads/",
|
7156 |
+
"license": [
|
7157 |
+
"MIT"
|
7158 |
+
],
|
7159 |
+
"description": "WP-CLI framework",
|
7160 |
+
"homepage": "https://wp-cli.org",
|
7161 |
+
"keywords": [
|
7162 |
+
"cli",
|
7163 |
+
"wordpress"
|
7164 |
+
],
|
7165 |
+
"time": "2020-02-18T08:15:37+00:00"
|
7166 |
+
},
|
7167 |
+
{
|
7168 |
+
"name": "wp-cli/wp-cli-bundle",
|
7169 |
+
"version": "v2.4.0",
|
7170 |
+
"source": {
|
7171 |
+
"type": "git",
|
7172 |
+
"url": "https://github.com/wp-cli/wp-cli-bundle.git",
|
7173 |
+
"reference": "713bc75b2f88550920dedc4f2ad3e1daf9f76326"
|
7174 |
+
},
|
7175 |
+
"dist": {
|
7176 |
+
"type": "zip",
|
7177 |
+
"url": "https://api.github.com/repos/wp-cli/wp-cli-bundle/zipball/713bc75b2f88550920dedc4f2ad3e1daf9f76326",
|
7178 |
+
"reference": "713bc75b2f88550920dedc4f2ad3e1daf9f76326",
|
7179 |
+
"shasum": ""
|
7180 |
+
},
|
7181 |
+
"require": {
|
7182 |
+
"cweagans/composer-patches": "^1.6",
|
7183 |
+
"php": ">=5.4",
|
7184 |
+
"wp-cli/cache-command": "^2",
|
7185 |
+
"wp-cli/checksum-command": "^2",
|
7186 |
+
"wp-cli/config-command": "^2",
|
7187 |
+
"wp-cli/core-command": "^2",
|
7188 |
+
"wp-cli/cron-command": "^2",
|
7189 |
+
"wp-cli/db-command": "^2",
|
7190 |
+
"wp-cli/embed-command": "^2",
|
7191 |
+
"wp-cli/entity-command": "^2",
|
7192 |
+
"wp-cli/eval-command": "^2",
|
7193 |
+
"wp-cli/export-command": "^2",
|
7194 |
+
"wp-cli/extension-command": "^2",
|
7195 |
+
"wp-cli/i18n-command": "^2",
|
7196 |
+
"wp-cli/import-command": "^2",
|
7197 |
+
"wp-cli/language-command": "^2",
|
7198 |
+
"wp-cli/maintenance-mode-command": "^2",
|
7199 |
+
"wp-cli/media-command": "^2",
|
7200 |
+
"wp-cli/package-command": "^2",
|
7201 |
+
"wp-cli/rewrite-command": "^2",
|
7202 |
+
"wp-cli/role-command": "^2",
|
7203 |
+
"wp-cli/scaffold-command": "^2",
|
7204 |
+
"wp-cli/search-replace-command": "^2",
|
7205 |
+
"wp-cli/server-command": "^2",
|
7206 |
+
"wp-cli/shell-command": "^2",
|
7207 |
+
"wp-cli/super-admin-command": "^2",
|
7208 |
+
"wp-cli/widget-command": "^2",
|
7209 |
+
"wp-cli/wp-cli": "^2.4"
|
7210 |
+
},
|
7211 |
+
"require-dev": {
|
7212 |
+
"roave/security-advisories": "dev-master",
|
7213 |
+
"wp-cli/wp-cli-tests": "^2.1"
|
7214 |
+
},
|
7215 |
+
"suggest": {
|
7216 |
+
"psy/psysh": "Enhanced `wp shell` functionality"
|
7217 |
+
},
|
7218 |
+
"type": "library",
|
7219 |
+
"extra": {
|
7220 |
+
"branch-alias": {
|
7221 |
+
"dev-master": "2.1.x-dev"
|
7222 |
+
},
|
7223 |
+
"enable-patching": true
|
7224 |
+
},
|
7225 |
+
"notification-url": "https://packagist.org/downloads/",
|
7226 |
+
"license": [
|
7227 |
+
"MIT"
|
7228 |
+
],
|
7229 |
+
"description": "WP-CLI bundle package with default commands.",
|
7230 |
+
"homepage": "https://wp-cli.org",
|
7231 |
+
"keywords": [
|
7232 |
+
"cli",
|
7233 |
+
"wordpress"
|
7234 |
+
],
|
7235 |
+
"time": "2019-11-12T17:43:58+00:00"
|
7236 |
+
},
|
7237 |
+
{
|
7238 |
+
"name": "wp-cli/wp-config-transformer",
|
7239 |
+
"version": "v1.2.6",
|
7240 |
+
"source": {
|
7241 |
+
"type": "git",
|
7242 |
+
"url": "https://github.com/wp-cli/wp-config-transformer.git",
|
7243 |
+
"reference": "1ca98343443a8e4585865db5f50e8e6121fee70b"
|
7244 |
+
},
|
7245 |
+
"dist": {
|
7246 |
+
"type": "zip",
|
7247 |
+
"url": "https://api.github.com/repos/wp-cli/wp-config-transformer/zipball/1ca98343443a8e4585865db5f50e8e6121fee70b",
|
7248 |
+
"reference": "1ca98343443a8e4585865db5f50e8e6121fee70b",
|
7249 |
+
"shasum": ""
|
7250 |
+
},
|
7251 |
+
"require": {
|
7252 |
+
"php": ">=5.3.29"
|
7253 |
+
},
|
7254 |
+
"require-dev": {
|
7255 |
+
"composer/composer": "^1.5.6",
|
7256 |
+
"phpunit/phpunit": "^6.5.5",
|
7257 |
+
"wp-coding-standards/wpcs": "^0.14.0 || ^1.0.0 || ^2.0.0"
|
7258 |
+
},
|
7259 |
+
"type": "library",
|
7260 |
+
"autoload": {
|
7261 |
+
"files": [
|
7262 |
+
"src/WPConfigTransformer.php"
|
7263 |
+
]
|
7264 |
+
},
|
7265 |
+
"notification-url": "https://packagist.org/downloads/",
|
7266 |
+
"license": [
|
7267 |
+
"MIT"
|
7268 |
+
],
|
7269 |
+
"authors": [
|
7270 |
+
{
|
7271 |
+
"name": "Frankie Jarrett",
|
7272 |
+
"email": "fjarrett@gmail.com"
|
7273 |
+
}
|
7274 |
+
],
|
7275 |
+
"description": "Programmatically edit a wp-config.php file.",
|
7276 |
+
"time": "2019-07-23T17:24:43+00:00"
|
7277 |
+
},
|
7278 |
+
{
|
7279 |
+
"name": "zordius/lightncandy",
|
7280 |
+
"version": "v1.2.5",
|
7281 |
+
"source": {
|
7282 |
+
"type": "git",
|
7283 |
+
"url": "https://github.com/zordius/lightncandy.git",
|
7284 |
+
"reference": "37aa381e0f27d411a630062070c7a5a2174c62e7"
|
7285 |
+
},
|
7286 |
+
"dist": {
|
7287 |
+
"type": "zip",
|
7288 |
+
"url": "https://api.github.com/repos/zordius/lightncandy/zipball/37aa381e0f27d411a630062070c7a5a2174c62e7",
|
7289 |
+
"reference": "37aa381e0f27d411a630062070c7a5a2174c62e7",
|
7290 |
+
"shasum": ""
|
7291 |
+
},
|
7292 |
+
"require": {
|
7293 |
+
"php": ">=7.1.0"
|
7294 |
+
},
|
7295 |
+
"require-dev": {
|
7296 |
+
"phpunit/phpunit": "^7"
|
7297 |
+
},
|
7298 |
+
"type": "library",
|
7299 |
+
"extra": {
|
7300 |
+
"branch-alias": {
|
7301 |
+
"dev-master": "1.2.5-dev"
|
7302 |
+
}
|
7303 |
+
},
|
7304 |
+
"autoload": {
|
7305 |
+
"psr-4": {
|
7306 |
+
"LightnCandy\\": "src"
|
7307 |
+
}
|
7308 |
+
},
|
7309 |
+
"notification-url": "https://packagist.org/downloads/",
|
7310 |
+
"license": [
|
7311 |
+
"MIT"
|
7312 |
+
],
|
7313 |
+
"authors": [
|
7314 |
+
{
|
7315 |
+
"name": "Zordius Chen",
|
7316 |
+
"email": "zordius@gmail.com"
|
7317 |
+
}
|
7318 |
+
],
|
7319 |
+
"description": "An extremely fast PHP implementation of handlebars ( http://handlebarsjs.com/ ) and mustache ( http://mustache.github.io/ ).",
|
7320 |
+
"homepage": "https://github.com/zordius/lightncandy",
|
7321 |
+
"keywords": [
|
7322 |
+
"handlebars",
|
7323 |
+
"logicless",
|
7324 |
+
"mustache",
|
7325 |
+
"php",
|
7326 |
+
"template"
|
7327 |
+
],
|
7328 |
+
"time": "2020-03-08T06:00:24+00:00"
|
7329 |
+
}
|
7330 |
+
],
|
7331 |
+
"aliases": [],
|
7332 |
+
"minimum-stability": "stable",
|
7333 |
+
"stability-flags": [],
|
7334 |
+
"prefer-stable": false,
|
7335 |
+
"prefer-lowest": false,
|
7336 |
+
"platform": {
|
7337 |
+
"php": ">=5.6.20"
|
7338 |
+
},
|
7339 |
+
"platform-dev": []
|
7340 |
+
}
|
vendor/publishpress/wordpress-version-notices/includes.php
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <https://www.gnu.org/licenses/gpl-3.0.html>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PPVersionNotices
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (c) 2020 PublishPress. All rights reserved.
|
24 |
+
**/
|
25 |
+
|
26 |
+
use Pimple\Container;
|
27 |
+
use PPVersionNotices\ServicesProvider;
|
28 |
+
|
29 |
+
if (!defined('PP_VERSION_NOTICES_LOADED')) {
|
30 |
+
define('PP_VERSION_NOTICES_VERSION', '1.0.2');
|
31 |
+
define('PP_VERSION_NOTICES_BASE_PATH', __DIR__);
|
32 |
+
define('PP_VERSION_NOTICES_BASE_URL', untrailingslashit(plugin_dir_url(__FILE__)));
|
33 |
+
define('PP_VERSION_NOTICES_SRC_PATH', PP_VERSION_NOTICES_BASE_PATH . DIRECTORY_SEPARATOR . 'src');
|
34 |
+
|
35 |
+
if (file_exists(__DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php')) {
|
36 |
+
/*
|
37 |
+
* We need to check this because of the tests. Since we use composer the tests already loaded the class and
|
38 |
+
* the autoload.php file doesn't check that (it is generated by composer).
|
39 |
+
*
|
40 |
+
* Make sure to update the class name after running composer update or dump autoload.
|
41 |
+
*/
|
42 |
+
if (!class_exists('ComposerAutoloaderInit0ff73bab6c34dc502dbc3151d23f7930')) {
|
43 |
+
require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
|
44 |
+
}
|
45 |
+
}
|
46 |
+
|
47 |
+
$container = new Container();
|
48 |
+
$container->register(new ServicesProvider());
|
49 |
+
|
50 |
+
// Load the modules
|
51 |
+
$module = $container['module_top_notice'];
|
52 |
+
$module->init();
|
53 |
+
|
54 |
+
define('PP_VERSION_NOTICES_LOADED', true);
|
55 |
+
}
|
vendor/publishpress/wordpress-version-notices/license.txt
ADDED
@@ -0,0 +1,377 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
WordPress Version Notices
|
2 |
+
|
3 |
+
Copyright 2020 by the contributors
|
4 |
+
|
5 |
+
This program is free software; you can redistribute it and/or modify
|
6 |
+
it under the terms of the GNU General Public License as published by
|
7 |
+
the Free Software Foundation; either version 3 of the License, or
|
8 |
+
(at your option) any later version.
|
9 |
+
|
10 |
+
This program is distributed in the hope that it will be useful,
|
11 |
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
GNU General Public License for more details.
|
14 |
+
|
15 |
+
You should have received a copy of the GNU General Public License
|
16 |
+
along with this program; if not, write to the Free Software
|
17 |
+
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
18 |
+
|
19 |
+
This program incorporates work covered by the following copyright and
|
20 |
+
permission notices:
|
21 |
+
|
22 |
+
Edit Flow is Copyright 2009-2016 Mohammad Jangda, Daniel Bachhuber, et al.
|
23 |
+
http://editflow.org/
|
24 |
+
Edit Flow was produced by Daniel Bachhuber, Mo Jangda, and Scott Bressler,
|
25 |
+
with special help from Andrew Spittle and Andrew Witherspoon
|
26 |
+
|
27 |
+
Edit Flow is released under the GPL
|
28 |
+
|
29 |
+
and
|
30 |
+
|
31 |
+
WordPress Version Notices
|
32 |
+
|
33 |
+
WordPress Version Notices is Copyright (c) 2020 PublishPress
|
34 |
+
|
35 |
+
WordPress Version Notices is released under the GPL
|
36 |
+
|
37 |
+
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
38 |
+
|
39 |
+
GNU GENERAL PUBLIC LICENSE
|
40 |
+
Version 2, June 1991
|
41 |
+
|
42 |
+
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
43 |
+
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
44 |
+
Everyone is permitted to copy and distribute verbatim copies
|
45 |
+
of this license document, but changing it is not allowed.
|
46 |
+
|
47 |
+
Preamble
|
48 |
+
|
49 |
+
The licenses for most software are designed to take away your
|
50 |
+
freedom to share and change it. By contrast, the GNU General Public
|
51 |
+
License is intended to guarantee your freedom to share and change free
|
52 |
+
software--to make sure the software is free for all its users. This
|
53 |
+
General Public License applies to most of the Free Software
|
54 |
+
Foundation's software and to any other program whose authors commit to
|
55 |
+
using it. (Some other Free Software Foundation software is covered by
|
56 |
+
the GNU Lesser General Public License instead.) You can apply it to
|
57 |
+
your programs, too.
|
58 |
+
|
59 |
+
When we speak of free software, we are referring to freedom, not
|
60 |
+
price. Our General Public Licenses are designed to make sure that you
|
61 |
+
have the freedom to distribute copies of free software (and charge for
|
62 |
+
this service if you wish), that you receive source code or can get it
|
63 |
+
if you want it, that you can change the software or use pieces of it
|
64 |
+
in new free programs; and that you know you can do these things.
|
65 |
+
|
66 |
+
To protect your rights, we need to make restrictions that forbid
|
67 |
+
anyone to deny you these rights or to ask you to surrender the rights.
|
68 |
+
These restrictions translate to certain responsibilities for you if you
|
69 |
+
distribute copies of the software, or if you modify it.
|
70 |
+
|
71 |
+
For example, if you distribute copies of such a program, whether
|
72 |
+
gratis or for a fee, you must give the recipients all the rights that
|
73 |
+
you have. You must make sure that they, too, receive or can get the
|
74 |
+
source code. And you must show them these terms so they know their
|
75 |
+
rights.
|
76 |
+
|
77 |
+
We protect your rights with two steps: (1) copyright the software, and
|
78 |
+
(2) offer you this license which gives you legal permission to copy,
|
79 |
+
distribute and/or modify the software.
|
80 |
+
|
81 |
+
Also, for each author's protection and ours, we want to make certain
|
82 |
+
that everyone understands that there is no warranty for this free
|
83 |
+
software. If the software is modified by someone else and passed on, we
|
84 |
+
want its recipients to know that what they have is not the original, so
|
85 |
+
that any problems introduced by others will not reflect on the original
|
86 |
+
authors' reputations.
|
87 |
+
|
88 |
+
Finally, any free program is threatened constantly by software
|
89 |
+
patents. We wish to avoid the danger that redistributors of a free
|
90 |
+
program will individually obtain patent licenses, in effect making the
|
91 |
+
program proprietary. To prevent this, we have made it clear that any
|
92 |
+
patent must be licensed for everyone's free use or not licensed at all.
|
93 |
+
|
94 |
+
The precise terms and conditions for copying, distribution and
|
95 |
+
modification follow.
|
96 |
+
|
97 |
+
GNU GENERAL PUBLIC LICENSE
|
98 |
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
99 |
+
|
100 |
+
0. This License applies to any program or other work which contains
|
101 |
+
a notice placed by the copyright holder saying it may be distributed
|
102 |
+
under the terms of this General Public License. The "Program", below,
|
103 |
+
refers to any such program or work, and a "work based on the Program"
|
104 |
+
means either the Program or any derivative work under copyright law:
|
105 |
+
that is to say, a work containing the Program or a portion of it,
|
106 |
+
either verbatim or with modifications and/or translated into another
|
107 |
+
language. (Hereinafter, translation is included without limitation in
|
108 |
+
the term "modification".) Each licensee is addressed as "you".
|
109 |
+
|
110 |
+
Activities other than copying, distribution and modification are not
|
111 |
+
covered by this License; they are outside its scope. The act of
|
112 |
+
running the Program is not restricted, and the output from the Program
|
113 |
+
is covered only if its contents constitute a work based on the
|
114 |
+
Program (independent of having been made by running the Program).
|
115 |
+
Whether that is true depends on what the Program does.
|
116 |
+
|
117 |
+
1. You may copy and distribute verbatim copies of the Program's
|
118 |
+
source code as you receive it, in any medium, provided that you
|
119 |
+
conspicuously and appropriately publish on each copy an appropriate
|
120 |
+
copyright notice and disclaimer of warranty; keep intact all the
|
121 |
+
notices that refer to this License and to the absence of any warranty;
|
122 |
+
and give any other recipients of the Program a copy of this License
|
123 |
+
along with the Program.
|
124 |
+
|
125 |
+
You may charge a fee for the physical act of transferring a copy, and
|
126 |
+
you may at your option offer warranty protection in exchange for a fee.
|
127 |
+
|
128 |
+
2. You may modify your copy or copies of the Program or any portion
|
129 |
+
of it, thus forming a work based on the Program, and copy and
|
130 |
+
distribute such modifications or work under the terms of Section 1
|
131 |
+
above, provided that you also meet all of these conditions:
|
132 |
+
|
133 |
+
a) You must cause the modified files to carry prominent notices
|
134 |
+
stating that you changed the files and the date of any change.
|
135 |
+
|
136 |
+
b) You must cause any work that you distribute or publish, that in
|
137 |
+
whole or in part contains or is derived from the Program or any
|
138 |
+
part thereof, to be licensed as a whole at no charge to all third
|
139 |
+
parties under the terms of this License.
|
140 |
+
|
141 |
+
c) If the modified program normally reads commands interactively
|
142 |
+
when run, you must cause it, when started running for such
|
143 |
+
interactive use in the most ordinary way, to print or display an
|
144 |
+
announcement including an appropriate copyright notice and a
|
145 |
+
notice that there is no warranty (or else, saying that you provide
|
146 |
+
a warranty) and that users may redistribute the program under
|
147 |
+
these conditions, and telling the user how to view a copy of this
|
148 |
+
License. (Exception: if the Program itself is interactive but
|
149 |
+
does not normally print such an announcement, your work based on
|
150 |
+
the Program is not required to print an announcement.)
|
151 |
+
|
152 |
+
These requirements apply to the modified work as a whole. If
|
153 |
+
identifiable sections of that work are not derived from the Program,
|
154 |
+
and can be reasonably considered independent and separate works in
|
155 |
+
themselves, then this License, and its terms, do not apply to those
|
156 |
+
sections when you distribute them as separate works. But when you
|
157 |
+
distribute the same sections as part of a whole which is a work based
|
158 |
+
on the Program, the distribution of the whole must be on the terms of
|
159 |
+
this License, whose permissions for other licensees extend to the
|
160 |
+
entire whole, and thus to each and every part regardless of who wrote it.
|
161 |
+
|
162 |
+
Thus, it is not the intent of this section to claim rights or contest
|
163 |
+
your rights to work written entirely by you; rather, the intent is to
|
164 |
+
exercise the right to control the distribution of derivative or
|
165 |
+
collective works based on the Program.
|
166 |
+
|
167 |
+
In addition, mere aggregation of another work not based on the Program
|
168 |
+
with the Program (or with a work based on the Program) on a volume of
|
169 |
+
a storage or distribution medium does not bring the other work under
|
170 |
+
the scope of this License.
|
171 |
+
|
172 |
+
3. You may copy and distribute the Program (or a work based on it,
|
173 |
+
under Section 2) in object code or executable form under the terms of
|
174 |
+
Sections 1 and 2 above provided that you also do one of the following:
|
175 |
+
|
176 |
+
a) Accompany it with the complete corresponding machine-readable
|
177 |
+
source code, which must be distributed under the terms of Sections
|
178 |
+
1 and 2 above on a medium customarily used for software interchange; or,
|
179 |
+
|
180 |
+
b) Accompany it with a written offer, valid for at least three
|
181 |
+
years, to give any third party, for a charge no more than your
|
182 |
+
cost of physically performing source distribution, a complete
|
183 |
+
machine-readable copy of the corresponding source code, to be
|
184 |
+
distributed under the terms of Sections 1 and 2 above on a medium
|
185 |
+
customarily used for software interchange; or,
|
186 |
+
|
187 |
+
c) Accompany it with the information you received as to the offer
|
188 |
+
to distribute corresponding source code. (This alternative is
|
189 |
+
allowed only for noncommercial distribution and only if you
|
190 |
+
received the program in object code or executable form with such
|
191 |
+
an offer, in accord with Subsection b above.)
|
192 |
+
|
193 |
+
The source code for a work means the preferred form of the work for
|
194 |
+
making modifications to it. For an executable work, complete source
|
195 |
+
code means all the source code for all modules it contains, plus any
|
196 |
+
associated interface definition files, plus the scripts used to
|
197 |
+
control compilation and installation of the executable. However, as a
|
198 |
+
special exception, the source code distributed need not include
|
199 |
+
anything that is normally distributed (in either source or binary
|
200 |
+
form) with the major components (compiler, kernel, and so on) of the
|
201 |
+
operating system on which the executable runs, unless that component
|
202 |
+
itself accompanies the executable.
|
203 |
+
|
204 |
+
If distribution of executable or object code is made by offering
|
205 |
+
access to copy from a designated place, then offering equivalent
|
206 |
+
access to copy the source code from the same place counts as
|
207 |
+
distribution of the source code, even though third parties are not
|
208 |
+
compelled to copy the source along with the object code.
|
209 |
+
|
210 |
+
4. You may not copy, modify, sublicense, or distribute the Program
|
211 |
+
except as expressly provided under this License. Any attempt
|
212 |
+
otherwise to copy, modify, sublicense or distribute the Program is
|
213 |
+
void, and will automatically terminate your rights under this License.
|
214 |
+
However, parties who have received copies, or rights, from you under
|
215 |
+
this License will not have their licenses terminated so long as such
|
216 |
+
parties remain in full compliance.
|
217 |
+
|
218 |
+
5. You are not required to accept this License, since you have not
|
219 |
+
signed it. However, nothing else grants you permission to modify or
|
220 |
+
distribute the Program or its derivative works. These actions are
|
221 |
+
prohibited by law if you do not accept this License. Therefore, by
|
222 |
+
modifying or distributing the Program (or any work based on the
|
223 |
+
Program), you indicate your acceptance of this License to do so, and
|
224 |
+
all its terms and conditions for copying, distributing or modifying
|
225 |
+
the Program or works based on it.
|
226 |
+
|
227 |
+
6. Each time you redistribute the Program (or any work based on the
|
228 |
+
Program), the recipient automatically receives a license from the
|
229 |
+
original licensor to copy, distribute or modify the Program subject to
|
230 |
+
these terms and conditions. You may not impose any further
|
231 |
+
restrictions on the recipients' exercise of the rights granted herein.
|
232 |
+
You are not responsible for enforcing compliance by third parties to
|
233 |
+
this License.
|
234 |
+
|
235 |
+
7. If, as a consequence of a court judgment or allegation of patent
|
236 |
+
infringement or for any other reason (not limited to patent issues),
|
237 |
+
conditions are imposed on you (whether by court order, agreement or
|
238 |
+
otherwise) that contradict the conditions of this License, they do not
|
239 |
+
excuse you from the conditions of this License. If you cannot
|
240 |
+
distribute so as to satisfy simultaneously your obligations under this
|
241 |
+
License and any other pertinent obligations, then as a consequence you
|
242 |
+
may not distribute the Program at all. For example, if a patent
|
243 |
+
license would not permit royalty-free redistribution of the Program by
|
244 |
+
all those who receive copies directly or indirectly through you, then
|
245 |
+
the only way you could satisfy both it and this License would be to
|
246 |
+
refrain entirely from distribution of the Program.
|
247 |
+
|
248 |
+
If any portion of this section is held invalid or unenforceable under
|
249 |
+
any particular circumstance, the balance of the section is intended to
|
250 |
+
apply and the section as a whole is intended to apply in other
|
251 |
+
circumstances.
|
252 |
+
|
253 |
+
It is not the purpose of this section to induce you to infringe any
|
254 |
+
patents or other property right claims or to contest validity of any
|
255 |
+
such claims; this section has the sole purpose of protecting the
|
256 |
+
integrity of the free software distribution system, which is
|
257 |
+
implemented by public license practices. Many people have made
|
258 |
+
generous contributions to the wide range of software distributed
|
259 |
+
through that system in reliance on consistent application of that
|
260 |
+
system; it is up to the author/donor to decide if he or she is willing
|
261 |
+
to distribute software through any other system and a licensee cannot
|
262 |
+
impose that choice.
|
263 |
+
|
264 |
+
This section is intended to make thoroughly clear what is believed to
|
265 |
+
be a consequence of the rest of this License.
|
266 |
+
|
267 |
+
8. If the distribution and/or use of the Program is restricted in
|
268 |
+
certain countries either by patents or by copyrighted interfaces, the
|
269 |
+
original copyright holder who places the Program under this License
|
270 |
+
may add an explicit geographical distribution limitation excluding
|
271 |
+
those countries, so that distribution is permitted only in or among
|
272 |
+
countries not thus excluded. In such case, this License incorporates
|
273 |
+
the limitation as if written in the body of this License.
|
274 |
+
|
275 |
+
9. The Free Software Foundation may publish revised and/or new versions
|
276 |
+
of the General Public License from time to time. Such new versions will
|
277 |
+
be similar in spirit to the present version, but may differ in detail to
|
278 |
+
address new problems or concerns.
|
279 |
+
|
280 |
+
Each version is given a distinguishing version number. If the Program
|
281 |
+
specifies a version number of this License which applies to it and "any
|
282 |
+
later version", you have the option of following the terms and conditions
|
283 |
+
either of that version or of any later version published by the Free
|
284 |
+
Software Foundation. If the Program does not specify a version number of
|
285 |
+
this License, you may choose any version ever published by the Free Software
|
286 |
+
Foundation.
|
287 |
+
|
288 |
+
10. If you wish to incorporate parts of the Program into other free
|
289 |
+
programs whose distribution conditions are different, write to the author
|
290 |
+
to ask for permission. For software which is copyrighted by the Free
|
291 |
+
Software Foundation, write to the Free Software Foundation; we sometimes
|
292 |
+
make exceptions for this. Our decision will be guided by the two goals
|
293 |
+
of preserving the free status of all derivatives of our free software and
|
294 |
+
of promoting the sharing and reuse of software generally.
|
295 |
+
|
296 |
+
NO WARRANTY
|
297 |
+
|
298 |
+
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
299 |
+
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
300 |
+
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
301 |
+
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
302 |
+
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
303 |
+
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
304 |
+
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
305 |
+
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
306 |
+
REPAIR OR CORRECTION.
|
307 |
+
|
308 |
+
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
309 |
+
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
310 |
+
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
311 |
+
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
312 |
+
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
313 |
+
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
314 |
+
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
315 |
+
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
316 |
+
POSSIBILITY OF SUCH DAMAGES.
|
317 |
+
|
318 |
+
END OF TERMS AND CONDITIONS
|
319 |
+
|
320 |
+
How to Apply These Terms to Your New Programs
|
321 |
+
|
322 |
+
If you develop a new program, and you want it to be of the greatest
|
323 |
+
possible use to the public, the best way to achieve this is to make it
|
324 |
+
free software which everyone can redistribute and change under these terms.
|
325 |
+
|
326 |
+
To do so, attach the following notices to the program. It is safest
|
327 |
+
to attach them to the start of each source file to most effectively
|
328 |
+
convey the exclusion of warranty; and each file should have at least
|
329 |
+
the "copyright" line and a pointer to where the full notice is found.
|
330 |
+
|
331 |
+
<one line to give the program's name and a brief idea of what it does.>
|
332 |
+
Copyright (C) <year> <name of author>
|
333 |
+
|
334 |
+
This program is free software; you can redistribute it and/or modify
|
335 |
+
it under the terms of the GNU General Public License as published by
|
336 |
+
the Free Software Foundation; either version 2 of the License, or
|
337 |
+
(at your option) any later version.
|
338 |
+
|
339 |
+
This program is distributed in the hope that it will be useful,
|
340 |
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
341 |
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
342 |
+
GNU General Public License for more details.
|
343 |
+
|
344 |
+
You should have received a copy of the GNU General Public License along
|
345 |
+
with this program; if not, write to the Free Software Foundation, Inc.,
|
346 |
+
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
347 |
+
|
348 |
+
Also add information on how to contact you by electronic and paper mail.
|
349 |
+
|
350 |
+
If the program is interactive, make it output a short notice like this
|
351 |
+
when it starts in an interactive mode:
|
352 |
+
|
353 |
+
Gnomovision version 69, Copyright (C) year name of author
|
354 |
+
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
355 |
+
This is free software, and you are welcome to redistribute it
|
356 |
+
under certain conditions; type `show c' for details.
|
357 |
+
|
358 |
+
The hypothetical commands `show w' and `show c' should show the appropriate
|
359 |
+
parts of the General Public License. Of course, the commands you use may
|
360 |
+
be called something other than `show w' and `show c'; they could even be
|
361 |
+
mouse-clicks or menu items--whatever suits your program.
|
362 |
+
|
363 |
+
You should also get your employer (if you work as a programmer) or your
|
364 |
+
school, if any, to sign a "copyright disclaimer" for the program, if
|
365 |
+
necessary. Here is a sample; alter the names:
|
366 |
+
|
367 |
+
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
368 |
+
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
369 |
+
|
370 |
+
<signature of Ty Coon>, 1 April 1989
|
371 |
+
Ty Coon, President of Vice
|
372 |
+
|
373 |
+
This General Public License does not permit incorporating your program into
|
374 |
+
proprietary programs. If your program is a subroutine library, you may
|
375 |
+
consider it more useful to permit linking proprietary applications with the
|
376 |
+
library. If this is what you want to do, use the GNU Lesser General
|
377 |
+
Public License instead of this License.
|
vendor/publishpress/wordpress-version-notices/src/Module/AdInterface.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <https://www.gnu.org/licenses/gpl-3.0.html>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PPVersionNotices
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (c) 2020 PublishPress. All rights reserved.
|
24 |
+
**/
|
25 |
+
|
26 |
+
namespace PPVersionNotices\Module;
|
27 |
+
|
28 |
+
interface AdInterface
|
29 |
+
{
|
30 |
+
public function init();
|
31 |
+
|
32 |
+
/**
|
33 |
+
* @param string $message
|
34 |
+
* @param string $linkURL
|
35 |
+
*/
|
36 |
+
public function display($message = '', $linkURL = '');
|
37 |
+
}
|
vendor/publishpress/wordpress-version-notices/src/Module/Footer/Module.php
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <https://www.gnu.org/licenses/gpl-3.0.html>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PPVersionNotices
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (c) 2020 PublishPress. All rights reserved.
|
24 |
+
**/
|
25 |
+
|
26 |
+
namespace PPVersionNotices\Module\Footer;
|
27 |
+
|
28 |
+
use PPVersionNotices\Module\AdInterface;
|
29 |
+
use PPVersionNotices\Template\TemplateLoaderInterface;
|
30 |
+
use PPVersionNotices\Template\TemplateInvalidArgumentsException;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Class Module
|
34 |
+
*
|
35 |
+
* @package PPVersionNotices
|
36 |
+
*/
|
37 |
+
class Module implements AdInterface
|
38 |
+
{
|
39 |
+
const SETTINGS_FILTER = 'pp_pro_ads_footer_settings';
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @var TemplateLoaderInterface
|
43 |
+
*/
|
44 |
+
private $templateLoader;
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @var array
|
48 |
+
*/
|
49 |
+
private $settings = [];
|
50 |
+
|
51 |
+
public function __construct(TemplateLoaderInterface $templateLoader)
|
52 |
+
{
|
53 |
+
$this->templateLoader = $templateLoader;
|
54 |
+
}
|
55 |
+
}
|
vendor/publishpress/wordpress-version-notices/src/Module/TopNotice/Module.php
ADDED
@@ -0,0 +1,136 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <https://www.gnu.org/licenses/gpl-3.0.html>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PPVersionNotices
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (c) 2020 PublishPress. All rights reserved.
|
24 |
+
**/
|
25 |
+
|
26 |
+
namespace PPVersionNotices\Module\TopNotice;
|
27 |
+
|
28 |
+
use PPVersionNotices\Module\AdInterface;
|
29 |
+
use PPVersionNotices\Template\TemplateLoaderInterface;
|
30 |
+
use PPVersionNotices\Template\TemplateInvalidArgumentsException;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Class Module
|
34 |
+
*
|
35 |
+
* @package PPVersionNotices
|
36 |
+
*/
|
37 |
+
class Module implements AdInterface
|
38 |
+
{
|
39 |
+
const SETTINGS_FILTER = 'pp_version_notice_top_notice_settings';
|
40 |
+
|
41 |
+
const DISPLAY_ACTION = 'pp_version_notice_display_top_notice';
|
42 |
+
|
43 |
+
/**
|
44 |
+
* @var TemplateLoaderInterface
|
45 |
+
*/
|
46 |
+
private $templateLoader;
|
47 |
+
|
48 |
+
/**
|
49 |
+
* @var array
|
50 |
+
*/
|
51 |
+
private $settings = [];
|
52 |
+
|
53 |
+
public function __construct(TemplateLoaderInterface $templateLoader)
|
54 |
+
{
|
55 |
+
$this->templateLoader = $templateLoader;
|
56 |
+
}
|
57 |
+
|
58 |
+
public function init()
|
59 |
+
{
|
60 |
+
add_action(self::DISPLAY_ACTION, [$this, 'display'], 10, 2);
|
61 |
+
add_action('admin_enqueue_scripts', [$this, 'adminEnqueueStyle']);
|
62 |
+
add_action('in_admin_header', [$this, 'displayTopNotice']);
|
63 |
+
add_action('admin_init', [$this, 'collectTheSettings'], 5);
|
64 |
+
}
|
65 |
+
|
66 |
+
public function collectTheSettings()
|
67 |
+
{
|
68 |
+
$this->settings = apply_filters(self::SETTINGS_FILTER, []);
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* @param string $message
|
73 |
+
* @param string $linkURL
|
74 |
+
*/
|
75 |
+
public function display($message = '', $linkURL = '')
|
76 |
+
{
|
77 |
+
if (empty($message) || empty($linkURL)) {
|
78 |
+
throw new TemplateInvalidArgumentsException();
|
79 |
+
}
|
80 |
+
|
81 |
+
$context = [
|
82 |
+
'message' => $message,
|
83 |
+
'linkURL' => $linkURL
|
84 |
+
];
|
85 |
+
|
86 |
+
$this->templateLoader->displayOutput('top-notice', 'notice', $context);
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* @return array|false
|
91 |
+
*/
|
92 |
+
private function isValidScreen()
|
93 |
+
{
|
94 |
+
$screen = get_current_screen();
|
95 |
+
|
96 |
+
foreach ($this->settings as $pluginName => $setting) {
|
97 |
+
foreach ($setting['screens'] as $screenParams) {
|
98 |
+
if ($screenParams === true) {
|
99 |
+
return $setting;
|
100 |
+
}
|
101 |
+
|
102 |
+
$validVars = 0;
|
103 |
+
foreach ($screenParams as $var => $value) {
|
104 |
+
if (isset($screen->$var) && $screen->$var === $value) {
|
105 |
+
$validVars++;
|
106 |
+
}
|
107 |
+
}
|
108 |
+
|
109 |
+
if ($validVars === count($screenParams)) {
|
110 |
+
return $setting;
|
111 |
+
}
|
112 |
+
}
|
113 |
+
}
|
114 |
+
|
115 |
+
return false;
|
116 |
+
}
|
117 |
+
|
118 |
+
public function adminEnqueueStyle()
|
119 |
+
{
|
120 |
+
if ($this->isValidScreen()) {
|
121 |
+
wp_enqueue_style(
|
122 |
+
'pp-version-notice-bold-purple-style',
|
123 |
+
PP_VERSION_NOTICES_BASE_URL . '/assets/css/top-notice-bold-purple.css',
|
124 |
+
false,
|
125 |
+
PP_VERSION_NOTICES_VERSION
|
126 |
+
);
|
127 |
+
}
|
128 |
+
}
|
129 |
+
|
130 |
+
public function displayTopNotice()
|
131 |
+
{
|
132 |
+
if ($settings = $this->isValidScreen()) {
|
133 |
+
do_action(self::DISPLAY_ACTION, $settings['message'], $settings['link']);
|
134 |
+
}
|
135 |
+
}
|
136 |
+
}
|
vendor/publishpress/wordpress-version-notices/src/ServicesProvider.php
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <https://www.gnu.org/licenses/gpl-3.0.html>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PPVersionNotices
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (c) 2020 PublishPress. All rights reserved.
|
24 |
+
**/
|
25 |
+
|
26 |
+
namespace PPVersionNotices;
|
27 |
+
|
28 |
+
use Pimple\Container;
|
29 |
+
use Pimple\ServiceProviderInterface;
|
30 |
+
use PPVersionNotices\Module\TopNotice\Module as TopNoticeModule;
|
31 |
+
use PPVersionNotices\Template\TemplateLoader;
|
32 |
+
|
33 |
+
class ServicesProvider implements ServiceProviderInterface
|
34 |
+
{
|
35 |
+
public function register(Container $pimple)
|
36 |
+
{
|
37 |
+
$pimple['TEMPLATES_PATH'] = function (Container $c) {
|
38 |
+
return PP_VERSION_NOTICES_BASE_PATH . DIRECTORY_SEPARATOR . 'templates';
|
39 |
+
};
|
40 |
+
|
41 |
+
$pimple['module_top_notice'] = function (Container $c) {
|
42 |
+
return new TopNoticeModule($c['template_loader']);
|
43 |
+
};
|
44 |
+
|
45 |
+
$pimple['template_loader'] = function (Container $c) {
|
46 |
+
return new TemplateLoader($c['TEMPLATES_PATH']);
|
47 |
+
};
|
48 |
+
}
|
49 |
+
}
|
vendor/publishpress/wordpress-version-notices/src/Template/TemplateInvalidArgumentsException.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <https://www.gnu.org/licenses/gpl-3.0.html>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PPVersionNotices
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (c) 2020 PublishPress. All rights reserved.
|
24 |
+
**/
|
25 |
+
|
26 |
+
namespace PPVersionNotices\Template;
|
27 |
+
|
28 |
+
use RuntimeException;
|
29 |
+
|
30 |
+
class TemplateInvalidArgumentsException extends RuntimeException
|
31 |
+
{
|
32 |
+
|
33 |
+
}
|
vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoader.php
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <https://www.gnu.org/licenses/gpl-3.0.html>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PPVersionNotices
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (c) 2020 PublishPress. All rights reserved.
|
24 |
+
**/
|
25 |
+
|
26 |
+
namespace PPVersionNotices\Template;
|
27 |
+
|
28 |
+
class TemplateLoader implements TemplateLoaderInterface
|
29 |
+
{
|
30 |
+
/**
|
31 |
+
* @var string
|
32 |
+
*/
|
33 |
+
private $templatesPath;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* TemplateLoader constructor.
|
37 |
+
*
|
38 |
+
* @param string $templatesPath
|
39 |
+
*/
|
40 |
+
public function __construct($templatesPath)
|
41 |
+
{
|
42 |
+
$this->templatesPath = $templatesPath;
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Load template for modules.
|
47 |
+
*
|
48 |
+
* @param $moduleName
|
49 |
+
* @param $templateName
|
50 |
+
* @param array $context
|
51 |
+
* @param bool $return
|
52 |
+
*
|
53 |
+
* @return false|string
|
54 |
+
* @throws TemplateNotFoundException
|
55 |
+
*/
|
56 |
+
private function load($moduleName, $templateName, $context = [], $return = false)
|
57 |
+
{
|
58 |
+
$templatePath = $this->templatesPath . DIRECTORY_SEPARATOR . $moduleName . DIRECTORY_SEPARATOR . $templateName . '.php';
|
59 |
+
|
60 |
+
if (!file_exists($templatePath)) {
|
61 |
+
throw new TemplateNotFoundException('Template file not found');
|
62 |
+
}
|
63 |
+
|
64 |
+
if ($return) {
|
65 |
+
ob_start();
|
66 |
+
}
|
67 |
+
|
68 |
+
extract($context);
|
69 |
+
|
70 |
+
require $templatePath;
|
71 |
+
|
72 |
+
if ($return) {
|
73 |
+
return ob_get_clean();
|
74 |
+
}
|
75 |
+
|
76 |
+
return false;
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Load template for modules.
|
81 |
+
*
|
82 |
+
* @param string $moduleName
|
83 |
+
* @param string $templateName
|
84 |
+
* @param array $context
|
85 |
+
*
|
86 |
+
* @throws TemplateNotFoundException
|
87 |
+
*/
|
88 |
+
public function displayOutput($moduleName, $templateName, $context = [])
|
89 |
+
{
|
90 |
+
echo $this->load($moduleName, $templateName, $context, false);
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Load template for modules.
|
95 |
+
*
|
96 |
+
* @param string $moduleName
|
97 |
+
* @param string $templateName
|
98 |
+
* @param array $context
|
99 |
+
*
|
100 |
+
* @return false|string
|
101 |
+
*
|
102 |
+
* @throws TemplateNotFoundException
|
103 |
+
*/
|
104 |
+
public function returnOutput($moduleName, $templateName, $context = [])
|
105 |
+
{
|
106 |
+
return $this->load($moduleName, $templateName, $context, true);
|
107 |
+
}
|
108 |
+
}
|
vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoaderInterface.php
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <https://www.gnu.org/licenses/gpl-3.0.html>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PPVersionNotices
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (c) 2020 PublishPress. All rights reserved.
|
24 |
+
**/
|
25 |
+
|
26 |
+
namespace PPVersionNotices\Template;
|
27 |
+
|
28 |
+
interface TemplateLoaderInterface
|
29 |
+
{
|
30 |
+
/**
|
31 |
+
* Load template for modules.
|
32 |
+
*
|
33 |
+
* @param string $moduleName
|
34 |
+
* @param string $templateName
|
35 |
+
* @param array $context
|
36 |
+
*
|
37 |
+
* @throws TemplateNotFoundException
|
38 |
+
*/
|
39 |
+
public function displayOutput($moduleName, $templateName, $context = []);
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Load template for modules.
|
43 |
+
*
|
44 |
+
* @param string $moduleName
|
45 |
+
* @param string $templateName
|
46 |
+
* @param array $context
|
47 |
+
*
|
48 |
+
* @return false|string
|
49 |
+
*
|
50 |
+
* @throws TemplateNotFoundException
|
51 |
+
*/
|
52 |
+
public function returnOutput($moduleName, $templateName, $context = []);
|
53 |
+
}
|
vendor/publishpress/wordpress-version-notices/src/Template/TemplateNotFoundException.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <https://www.gnu.org/licenses/gpl-3.0.html>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PPVersionNotices
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (c) 2020 PublishPress. All rights reserved.
|
24 |
+
**/
|
25 |
+
|
26 |
+
namespace PPVersionNotices\Template;
|
27 |
+
|
28 |
+
use RuntimeException;
|
29 |
+
|
30 |
+
class TemplateNotFoundException extends RuntimeException
|
31 |
+
{
|
32 |
+
|
33 |
+
}
|
vendor/publishpress/wordpress-version-notices/templates/top-notice/notice.php
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$linkStart = '</div><div class="pp-version-notice-bold-purple-button"><a href="' . $linkURL . '" target="_blank">';
|
3 |
+
$linkEnd = '</a></div>';
|
4 |
+
$message = sprintf('<div class="pp-version-notice-bold-purple-message">' . $message, $linkStart, $linkEnd);
|
5 |
+
?>
|
6 |
+
<div class="pp-version-notice-bold-purple"><?php echo $message; ?></div>
|
vendor/publishpress/wordpress-version-notices/tests/_data/.gitkeep
ADDED
File without changes
|
vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-one/dumb-plugin-one.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Plugin Name: Dumb Plugin One
|
4 |
+
* Plugin URI: https://publishpress.com/
|
5 |
+
* Description: Dumb plugin for testing the library
|
6 |
+
* Author: PublishPress
|
7 |
+
* Author URI: https://publishpress.com
|
8 |
+
* Version: 0.1.0
|
9 |
+
*
|
10 |
+
* Copyright (c) 2020 PublishPress
|
11 |
+
*
|
12 |
+
* GNU General Public License, Free Software Foundation <http://creativecommons.org/licenses/GPL/2.0/>
|
13 |
+
*
|
14 |
+
* This program is free software: you can redistribute it and/or modify
|
15 |
+
* it under the terms of the GNU General Public License as published by
|
16 |
+
* the Free Software Foundation, either version 3 of the License, or
|
17 |
+
* (at your option) any later version.
|
18 |
+
*
|
19 |
+
* This program is distributed in the hope that it will be useful,
|
20 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
21 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
22 |
+
* GNU General Public License for more details.
|
23 |
+
*
|
24 |
+
* You should have received a copy of the GNU General Public License
|
25 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
26 |
+
*
|
27 |
+
* @package PublishPress
|
28 |
+
* @category Core
|
29 |
+
* @author PublishPress
|
30 |
+
* @copyright Copyright (C) 2020 PublishPress. All rights reserved.
|
31 |
+
*/
|
32 |
+
|
33 |
+
if (!defined('DUMB_PLUGIN_ONE_LOADED')) {
|
34 |
+
require_once 'version-notice.php';
|
35 |
+
|
36 |
+
define('DUMB_PLUGIN_ONE_LOADED', true);
|
37 |
+
}
|
vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-one/vendor/publishpress/wordpress-version-notices/.gitkeep
ADDED
File without changes
|
vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-one/version-notice.php
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <http://creativecommons.org/licenses/GPL/2.0/>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PublishPress
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (C) 2020 PublishPress. All rights reserved.
|
24 |
+
*/
|
25 |
+
|
26 |
+
// @todo: Load only in the admin
|
27 |
+
if (!defined('PP_VERSION_NOTICES_LOADED')) {
|
28 |
+
require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'publishpress' . DIRECTORY_SEPARATOR
|
29 |
+
. 'wordpress-version-notices' . DIRECTORY_SEPARATOR . 'includes.php';
|
30 |
+
}
|
31 |
+
|
32 |
+
add_filter(\PPVersionNotices\Module\TopNotice\Module::SETTINGS_FILTER, function ($settings) {
|
33 |
+
$settings['dumb-plugin-one'] = [
|
34 |
+
'message' => 'You\'re using Dumb Plugin One Free. Please, %supgrade to pro%s.',
|
35 |
+
'link' => 'http://example.com/upgrade',
|
36 |
+
'screens' => [
|
37 |
+
[
|
38 |
+
'base' => 'edit',
|
39 |
+
'id' => 'edit-post',
|
40 |
+
'post_type' => 'post',
|
41 |
+
],
|
42 |
+
]
|
43 |
+
];
|
44 |
+
|
45 |
+
return $settings;
|
46 |
+
});
|
vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-two/dumb-plugin-two.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Plugin Name: Dumb Plugin Two
|
4 |
+
* Plugin URI: https://publishpress.com/
|
5 |
+
* Description: Dumb plugin for testing the library
|
6 |
+
* Author: PublishPress
|
7 |
+
* Author URI: https://publishpress.com
|
8 |
+
* Version: 0.1.0
|
9 |
+
*
|
10 |
+
* Copyright (c) 2020 PublishPress
|
11 |
+
*
|
12 |
+
* GNU General Public License, Free Software Foundation <http://creativecommons.org/licenses/GPL/2.0/>
|
13 |
+
*
|
14 |
+
* This program is free software: you can redistribute it and/or modify
|
15 |
+
* it under the terms of the GNU General Public License as published by
|
16 |
+
* the Free Software Foundation, either version 3 of the License, or
|
17 |
+
* (at your option) any later version.
|
18 |
+
*
|
19 |
+
* This program is distributed in the hope that it will be useful,
|
20 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
21 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
22 |
+
* GNU General Public License for more details.
|
23 |
+
*
|
24 |
+
* You should have received a copy of the GNU General Public License
|
25 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
26 |
+
*
|
27 |
+
* @package PublishPress
|
28 |
+
* @category Core
|
29 |
+
* @author PublishPress
|
30 |
+
* @copyright Copyright (C) 2020 PublishPress. All rights reserved.
|
31 |
+
*/
|
32 |
+
|
33 |
+
if (!defined('DUMB_PLUGIN_TWO_LOADED')) {
|
34 |
+
require_once 'version-notice.php';
|
35 |
+
|
36 |
+
define('DUMB_PLUGIN_TWO_LOADED', true);
|
37 |
+
}
|
vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-two/vendor/publishpress/wordpress-version-notices/.gitkeep
ADDED
File without changes
|
vendor/publishpress/wordpress-version-notices/tests/_data/dumb-plugin-two/version-notice.php
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (c) 2020 PublishPress
|
4 |
+
*
|
5 |
+
* GNU General Public License, Free Software Foundation <http://creativecommons.org/licenses/GPL/2.0/>
|
6 |
+
*
|
7 |
+
* This program is free software: you can redistribute it and/or modify
|
8 |
+
* it under the terms of the GNU General Public License as published by
|
9 |
+
* the Free Software Foundation, either version 3 of the License, or
|
10 |
+
* (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This program is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15 |
+
* GNU General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU General Public License
|
18 |
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19 |
+
*
|
20 |
+
* @package PublishPress
|
21 |
+
* @category Core
|
22 |
+
* @author PublishPress
|
23 |
+
* @copyright Copyright (C) 2020 PublishPress. All rights reserved.
|
24 |
+
*/
|
25 |
+
|
26 |
+
// @todo: Load only in the admin
|
27 |
+
if (!defined('PP_VERSION_NOTICES_LOADED')) {
|
28 |
+
require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'publishpress' . DIRECTORY_SEPARATOR
|
29 |
+
. 'wordpress-version-notices' . DIRECTORY_SEPARATOR . 'includes.php';
|
30 |
+
}
|
31 |
+
|
32 |
+
add_filter(\PPVersionNotices\Module\TopNotice\Module::SETTINGS_FILTER, function ($settings) {
|
33 |
+
$settings['dumb-plugin-two'] = [
|
34 |
+
'message' => 'You\'re using Dumb Plugin Two Free. Please, %supgrade to pro%s.',
|
35 |
+
'link' => 'http://example.com/upgrade',
|
36 |
+
'screens' => [
|
37 |
+
[
|
38 |
+
'base' => 'edit',
|
39 |
+
'id' => 'edit-post',
|
40 |
+
'post_type' => 'page',
|
41 |
+
],
|
42 |
+
]
|
43 |
+
];
|
44 |
+
|
45 |
+
return $settings;
|
46 |
+
});
|
vendor/publishpress/wordpress-version-notices/tests/_data/dumb-templates/Dumb/test1.php
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<h1>Test1</h1>
|
vendor/publishpress/wordpress-version-notices/tests/_data/dumb-templates/Dumb/test2.php
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<h1>Test2: <?php echo $foo1; ?>, <?php echo $foo2; ?></h1>
|
vendor/publishpress/wordpress-version-notices/tests/_data/dump.sql
ADDED
@@ -0,0 +1,524 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# ************************************************************
|
2 |
+
# Sequel Pro SQL dump
|
3 |
+
# Version 4541
|
4 |
+
#
|
5 |
+
# http://www.sequelpro.com/
|
6 |
+
# https://github.com/sequelpro/sequelpro
|
7 |
+
#
|
8 |
+
# Host: 127.0.0.1 (MySQL 5.7.28)
|
9 |
+
# Database: wordpress
|
10 |
+
# Generation Time: 2020-03-03 16:30:50 +0000
|
11 |
+
# ************************************************************
|
12 |
+
|
13 |
+
|
14 |
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
15 |
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
16 |
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
17 |
+
/*!40101 SET NAMES utf8 */;
|
18 |
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
19 |
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
20 |
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
21 |
+
|
22 |
+
|
23 |
+
# Dump of table wp_commentmeta
|
24 |
+
# ------------------------------------------------------------
|
25 |
+
|
26 |
+
DROP TABLE IF EXISTS `wp_commentmeta`;
|
27 |
+
|
28 |
+
CREATE TABLE `wp_commentmeta` (
|
29 |
+
`meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
30 |
+
`comment_id` bigint(20) unsigned NOT NULL DEFAULT '0',
|
31 |
+
`meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
|
32 |
+
`meta_value` longtext COLLATE utf8mb4_unicode_520_ci,
|
33 |
+
PRIMARY KEY (`meta_id`),
|
34 |
+
KEY `comment_id` (`comment_id`),
|
35 |
+
KEY `meta_key` (`meta_key`(191))
|
36 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
|
37 |
+
|
38 |
+
|
39 |
+
|
40 |
+
# Dump of table wp_comments
|
41 |
+
# ------------------------------------------------------------
|
42 |
+
|
43 |
+
DROP TABLE IF EXISTS `wp_comments`;
|
44 |
+
|
45 |
+
CREATE TABLE `wp_comments` (
|
46 |
+
`comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
47 |
+
`comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT '0',
|
48 |
+
`comment_author` tinytext COLLATE utf8mb4_unicode_520_ci NOT NULL,
|
49 |
+
`comment_author_email` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
50 |
+
`comment_author_url` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
51 |
+
`comment_author_IP` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
52 |
+
`comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
53 |
+
`comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
54 |
+
`comment_content` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
|
55 |
+
`comment_karma` int(11) NOT NULL DEFAULT '0',
|
56 |
+
`comment_approved` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '1',
|
57 |
+
`comment_agent` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
58 |
+
`comment_type` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
59 |
+
`comment_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
|
60 |
+
`user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
|
61 |
+
PRIMARY KEY (`comment_ID`),
|
62 |
+
KEY `comment_post_ID` (`comment_post_ID`),
|
63 |
+
KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`),
|
64 |
+
KEY `comment_date_gmt` (`comment_date_gmt`),
|
65 |
+
KEY `comment_parent` (`comment_parent`),
|
66 |
+
KEY `comment_author_email` (`comment_author_email`(10))
|
67 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
|
68 |
+
|
69 |
+
LOCK TABLES `wp_comments` WRITE;
|
70 |
+
/*!40000 ALTER TABLE `wp_comments` DISABLE KEYS */;
|
71 |
+
|
72 |
+
INSERT INTO `wp_comments` (`comment_ID`, `comment_post_ID`, `comment_author`, `comment_author_email`, `comment_author_url`, `comment_author_IP`, `comment_date`, `comment_date_gmt`, `comment_content`, `comment_karma`, `comment_approved`, `comment_agent`, `comment_type`, `comment_parent`, `user_id`)
|
73 |
+
VALUES
|
74 |
+
(1,1,'A WordPress Commenter','wapuu@wordpress.example','https://wordpress.org/','','2020-03-03 16:23:13','2020-03-03 16:23:13','Hi, this is a comment.\nTo get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.\nCommenter avatars come from <a href=\"https://gravatar.com\">Gravatar</a>.',0,'1','','',0,0);
|
75 |
+
|
76 |
+
/*!40000 ALTER TABLE `wp_comments` ENABLE KEYS */;
|
77 |
+
UNLOCK TABLES;
|
78 |
+
|
79 |
+
|
80 |
+
# Dump of table wp_links
|
81 |
+
# ------------------------------------------------------------
|
82 |
+
|
83 |
+
DROP TABLE IF EXISTS `wp_links`;
|
84 |
+
|
85 |
+
CREATE TABLE `wp_links` (
|
86 |
+
`link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
87 |
+
`link_url` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
88 |
+
`link_name` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
89 |
+
`link_image` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
90 |
+
`link_target` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
91 |
+
`link_description` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
92 |
+
`link_visible` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'Y',
|
93 |
+
`link_owner` bigint(20) unsigned NOT NULL DEFAULT '1',
|
94 |
+
`link_rating` int(11) NOT NULL DEFAULT '0',
|
95 |
+
`link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
96 |
+
`link_rel` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
97 |
+
`link_notes` mediumtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
|
98 |
+
`link_rss` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
99 |
+
PRIMARY KEY (`link_id`),
|
100 |
+
KEY `link_visible` (`link_visible`)
|
101 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
|
102 |
+
|
103 |
+
|
104 |
+
|
105 |
+
# Dump of table wp_options
|
106 |
+
# ------------------------------------------------------------
|
107 |
+
|
108 |
+
DROP TABLE IF EXISTS `wp_options`;
|
109 |
+
|
110 |
+
CREATE TABLE `wp_options` (
|
111 |
+
`option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
112 |
+
`option_name` varchar(191) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
|
113 |
+
`option_value` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
|
114 |
+
`autoload` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'yes',
|
115 |
+
PRIMARY KEY (`option_id`),
|
116 |
+
UNIQUE KEY `option_name` (`option_name`),
|
117 |
+
KEY `autoload` (`autoload`)
|
118 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
|
119 |
+
|
120 |
+
LOCK TABLES `wp_options` WRITE;
|
121 |
+
/*!40000 ALTER TABLE `wp_options` DISABLE KEYS */;
|
122 |
+
|
123 |
+
INSERT INTO `wp_options` (`option_id`, `option_name`, `option_value`, `autoload`)
|
124 |
+
VALUES
|
125 |
+
(1,'siteurl','http://localhost:32880','yes'),
|
126 |
+
(2,'home','http://localhost:32880','yes'),
|
127 |
+
(3,'blogname','Tests','yes'),
|
128 |
+
(4,'blogdescription','Just another WordPress site','yes'),
|
129 |
+
(5,'users_can_register','0','yes'),
|
130 |
+
(6,'admin_email','anderson@publishpress.com','yes'),
|
131 |
+
(7,'start_of_week','1','yes'),
|
132 |
+
(8,'use_balanceTags','0','yes'),
|
133 |
+
(9,'use_smilies','1','yes'),
|
134 |
+
(10,'require_name_email','1','yes'),
|
135 |
+
(11,'comments_notify','1','yes'),
|
136 |
+
(12,'posts_per_rss','10','yes'),
|
137 |
+
(13,'rss_use_excerpt','0','yes'),
|
138 |
+
(14,'mailserver_url','mail.example.com','yes'),
|
139 |
+
(15,'mailserver_login','login@example.com','yes'),
|
140 |
+
(16,'mailserver_pass','password','yes'),
|
141 |
+
(17,'mailserver_port','110','yes'),
|
142 |
+
(18,'default_category','1','yes'),
|
143 |
+
(19,'default_comment_status','open','yes'),
|
144 |
+
(20,'default_ping_status','open','yes'),
|
145 |
+
(21,'default_pingback_flag','1','yes'),
|
146 |
+
(22,'posts_per_page','10','yes'),
|
147 |
+
(23,'date_format','F j, Y','yes'),
|
148 |
+
(24,'time_format','g:i a','yes'),
|
149 |
+
(25,'links_updated_date_format','F j, Y g:i a','yes'),
|
150 |
+
(26,'comment_moderation','0','yes'),
|
151 |
+
(27,'moderation_notify','1','yes'),
|
152 |
+
(28,'permalink_structure','','yes'),
|
153 |
+
(29,'rewrite_rules','','yes'),
|
154 |
+
(30,'hack_file','0','yes'),
|
155 |
+
(31,'blog_charset','UTF-8','yes'),
|
156 |
+
(32,'moderation_keys','','no'),
|
157 |
+
(33,'active_plugins','a:0:{}','yes'),
|
158 |
+
(34,'category_base','','yes'),
|
159 |
+
(35,'ping_sites','http://rpc.pingomatic.com/','yes'),
|
160 |
+
(36,'comment_max_links','2','yes'),
|
161 |
+
(37,'gmt_offset','0','yes'),
|
162 |
+
(38,'default_email_category','1','yes'),
|
163 |
+
(39,'recently_edited','','no'),
|
164 |
+
(40,'template','twentytwenty','yes'),
|
165 |
+
(41,'stylesheet','twentytwenty','yes'),
|
166 |
+
(42,'comment_whitelist','1','yes'),
|
167 |
+
(43,'blacklist_keys','','no'),
|
168 |
+
(44,'comment_registration','0','yes'),
|
169 |
+
(45,'html_type','text/html','yes'),
|
170 |
+
(46,'use_trackback','0','yes'),
|
171 |
+
(47,'default_role','subscriber','yes'),
|
172 |
+
(48,'db_version','45805','yes'),
|
173 |
+
(49,'uploads_use_yearmonth_folders','1','yes'),
|
174 |
+
(50,'upload_path','','yes'),
|
175 |
+
(51,'blog_public','1','yes'),
|
176 |
+
(52,'default_link_category','2','yes'),
|
177 |
+
(53,'show_on_front','posts','yes'),
|
178 |
+
(54,'tag_base','','yes'),
|
179 |
+
(55,'show_avatars','1','yes'),
|
180 |
+
(56,'avatar_rating','G','yes'),
|
181 |
+
(57,'upload_url_path','','yes'),
|
182 |
+
(58,'thumbnail_size_w','150','yes'),
|
183 |
+
(59,'thumbnail_size_h','150','yes'),
|
184 |
+
(60,'thumbnail_crop','1','yes'),
|
185 |
+
(61,'medium_size_w','300','yes'),
|
186 |
+
(62,'medium_size_h','300','yes'),
|
187 |
+
(63,'avatar_default','mystery','yes'),
|
188 |
+
(64,'large_size_w','1024','yes'),
|
189 |
+
(65,'large_size_h','1024','yes'),
|
190 |
+
(66,'image_default_link_type','none','yes'),
|
191 |
+
(67,'image_default_size','','yes'),
|
192 |
+
(68,'image_default_align','','yes'),
|
193 |
+
(69,'close_comments_for_old_posts','0','yes'),
|
194 |
+
(70,'close_comments_days_old','14','yes'),
|
195 |
+
(71,'thread_comments','1','yes'),
|
196 |
+
(72,'thread_comments_depth','5','yes'),
|
197 |
+
(73,'page_comments','0','yes'),
|
198 |
+
(74,'comments_per_page','50','yes'),
|
199 |
+
(75,'default_comments_page','newest','yes'),
|
200 |
+
(76,'comment_order','asc','yes'),
|
201 |
+
(77,'sticky_posts','a:0:{}','yes'),
|
202 |
+
(78,'widget_categories','a:2:{i:2;a:4:{s:5:\"title\";s:0:\"\";s:5:\"count\";i:0;s:12:\"hierarchical\";i:0;s:8:\"dropdown\";i:0;}s:12:\"_multiwidget\";i:1;}','yes'),
|
203 |
+
(79,'widget_text','a:0:{}','yes'),
|
204 |
+
(80,'widget_rss','a:0:{}','yes'),
|
205 |
+
(81,'uninstall_plugins','a:0:{}','no'),
|
206 |
+
(82,'timezone_string','','yes'),
|
207 |
+
(83,'page_for_posts','0','yes'),
|
208 |
+
(84,'page_on_front','0','yes'),
|
209 |
+
(85,'default_post_format','0','yes'),
|
210 |
+
(86,'link_manager_enabled','0','yes'),
|
211 |
+
(87,'finished_splitting_shared_terms','1','yes'),
|
212 |
+
(88,'site_icon','0','yes'),
|
213 |
+
(89,'medium_large_size_w','768','yes'),
|
214 |
+
(90,'medium_large_size_h','0','yes'),
|
215 |
+
(91,'wp_page_for_privacy_policy','3','yes'),
|
216 |
+
(92,'show_comments_cookies_opt_in','1','yes'),
|
217 |
+
(93,'admin_email_lifespan','1598804593','yes'),
|
218 |
+
(94,'initial_db_version','45805','yes'),
|
219 |
+
(95,'wp_user_roles','a:5:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:61:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:34:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:10:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:5:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}}','yes'),
|
220 |
+
(96,'fresh_site','1','yes'),
|
221 |
+
(97,'widget_search','a:2:{i:2;a:1:{s:5:\"title\";s:0:\"\";}s:12:\"_multiwidget\";i:1;}','yes'),
|
222 |
+
(98,'widget_recent-posts','a:2:{i:2;a:2:{s:5:\"title\";s:0:\"\";s:6:\"number\";i:5;}s:12:\"_multiwidget\";i:1;}','yes'),
|
223 |
+
(99,'widget_recent-comments','a:2:{i:2;a:2:{s:5:\"title\";s:0:\"\";s:6:\"number\";i:5;}s:12:\"_multiwidget\";i:1;}','yes'),
|
224 |
+
(100,'widget_archives','a:2:{i:2;a:3:{s:5:\"title\";s:0:\"\";s:5:\"count\";i:0;s:8:\"dropdown\";i:0;}s:12:\"_multiwidget\";i:1;}','yes'),
|
225 |
+
(101,'widget_meta','a:2:{i:2;a:1:{s:5:\"title\";s:0:\"\";}s:12:\"_multiwidget\";i:1;}','yes'),
|
226 |
+
(102,'sidebars_widgets','a:4:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:3:{i:0;s:8:\"search-2\";i:1;s:14:\"recent-posts-2\";i:2;s:17:\"recent-comments-2\";}s:9:\"sidebar-2\";a:3:{i:0;s:10:\"archives-2\";i:1;s:12:\"categories-2\";i:2;s:6:\"meta-2\";}s:13:\"array_version\";i:3;}','yes'),
|
227 |
+
(103,'cron','a:4:{i:1583252596;a:5:{s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1583252600;a:2:{s:19:\"wp_scheduled_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:25:\"delete_expired_transients\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1583252605;a:1:{s:30:\"wp_scheduled_auto_draft_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}s:7:\"version\";i:2;}','yes'),
|
228 |
+
(104,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),
|
229 |
+
(105,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),
|
230 |
+
(106,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),
|
231 |
+
(107,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),
|
232 |
+
(108,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),
|
233 |
+
(109,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),
|
234 |
+
(110,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),
|
235 |
+
(111,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),
|
236 |
+
(112,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),
|
237 |
+
(113,'_transient_doing_cron','1583252963.2819609642028808593750','yes'),
|
238 |
+
(114,'_site_transient_update_core','O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:59:\"https://downloads.wordpress.org/release/wordpress-5.3.2.zip\";s:6:\"locale\";s:5:\"en_US\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:59:\"https://downloads.wordpress.org/release/wordpress-5.3.2.zip\";s:10:\"no_content\";s:70:\"https://downloads.wordpress.org/release/wordpress-5.3.2-no-content.zip\";s:11:\"new_bundled\";s:71:\"https://downloads.wordpress.org/release/wordpress-5.3.2-new-bundled.zip\";s:7:\"partial\";b:0;s:8:\"rollback\";b:0;}s:7:\"current\";s:5:\"5.3.2\";s:7:\"version\";s:5:\"5.3.2\";s:11:\"php_version\";s:6:\"5.6.20\";s:13:\"mysql_version\";s:3:\"5.0\";s:11:\"new_bundled\";s:3:\"5.3\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1583252602;s:15:\"version_checked\";s:5:\"5.3.2\";s:12:\"translations\";a:0:{}}','no'),
|
239 |
+
(115,'_site_transient_update_plugins','O:8:\"stdClass\":4:{s:12:\"last_checked\";i:1583252602;s:8:\"response\";a:0:{}s:12:\"translations\";a:0:{}s:9:\"no_update\";a:2:{s:19:\"akismet/akismet.php\";O:8:\"stdClass\":9:{s:2:\"id\";s:21:\"w.org/plugins/akismet\";s:4:\"slug\";s:7:\"akismet\";s:6:\"plugin\";s:19:\"akismet/akismet.php\";s:11:\"new_version\";s:5:\"4.1.3\";s:3:\"url\";s:38:\"https://wordpress.org/plugins/akismet/\";s:7:\"package\";s:56:\"https://downloads.wordpress.org/plugin/akismet.4.1.3.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:59:\"https://ps.w.org/akismet/assets/icon-256x256.png?rev=969272\";s:2:\"1x\";s:59:\"https://ps.w.org/akismet/assets/icon-128x128.png?rev=969272\";}s:7:\"banners\";a:1:{s:2:\"1x\";s:61:\"https://ps.w.org/akismet/assets/banner-772x250.jpg?rev=479904\";}s:11:\"banners_rtl\";a:0:{}}s:9:\"hello.php\";O:8:\"stdClass\":9:{s:2:\"id\";s:25:\"w.org/plugins/hello-dolly\";s:4:\"slug\";s:11:\"hello-dolly\";s:6:\"plugin\";s:9:\"hello.php\";s:11:\"new_version\";s:5:\"1.7.2\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/hello-dolly/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/hello-dolly.1.7.2.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-256x256.jpg?rev=2052855\";s:2:\"1x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-128x128.jpg?rev=2052855\";}s:7:\"banners\";a:1:{s:2:\"1x\";s:66:\"https://ps.w.org/hello-dolly/assets/banner-772x250.jpg?rev=2052855\";}s:11:\"banners_rtl\";a:0:{}}}}','no'),
|
240 |
+
(116,'_site_transient_timeout_theme_roots','1583254403','no'),
|
241 |
+
(117,'_site_transient_theme_roots','a:4:{s:14:\"twentynineteen\";s:7:\"/themes\";s:15:\"twentyseventeen\";s:7:\"/themes\";s:13:\"twentysixteen\";s:7:\"/themes\";s:12:\"twentytwenty\";s:7:\"/themes\";}','no'),
|
242 |
+
(118,'_site_transient_update_themes','O:8:\"stdClass\":4:{s:12:\"last_checked\";i:1583252603;s:7:\"checked\";a:4:{s:14:\"twentynineteen\";s:3:\"1.4\";s:15:\"twentyseventeen\";s:3:\"2.2\";s:13:\"twentysixteen\";s:3:\"2.0\";s:12:\"twentytwenty\";s:3:\"1.1\";}s:8:\"response\";a:0:{}s:12:\"translations\";a:0:{}}','no'),
|
243 |
+
(119,'_site_transient_timeout_browser_ac05ce2b54bf6619514b7c7c2e5ab81a','1583857404','no'),
|
244 |
+
(120,'_site_transient_browser_ac05ce2b54bf6619514b7c7c2e5ab81a','a:10:{s:4:\"name\";s:6:\"Chrome\";s:7:\"version\";s:13:\"80.0.3987.122\";s:8:\"platform\";s:9:\"Macintosh\";s:10:\"update_url\";s:29:\"https://www.google.com/chrome\";s:7:\"img_src\";s:43:\"http://s.w.org/images/browsers/chrome.png?1\";s:11:\"img_src_ssl\";s:44:\"https://s.w.org/images/browsers/chrome.png?1\";s:15:\"current_version\";s:2:\"18\";s:7:\"upgrade\";b:0;s:8:\"insecure\";b:0;s:6:\"mobile\";b:0;}','no'),
|
245 |
+
(121,'_site_transient_timeout_php_check_a0c594a1902efeb727acf2a7ff080644','1583857405','no'),
|
246 |
+
(122,'_site_transient_php_check_a0c594a1902efeb727acf2a7ff080644','a:5:{s:19:\"recommended_version\";s:3:\"7.3\";s:15:\"minimum_version\";s:6:\"5.6.20\";s:12:\"is_supported\";b:1;s:9:\"is_secure\";b:1;s:13:\"is_acceptable\";b:1;}','no'),
|
247 |
+
(123,'can_compress_scripts','0','no'),
|
248 |
+
(124,'_site_transient_timeout_community-events-2eef883554c6a8b141bb80b5a73a1a02','1583295807','no'),
|
249 |
+
(125,'_site_transient_community-events-2eef883554c6a8b141bb80b5a73a1a02','a:3:{s:9:\"sandboxed\";b:0;s:8:\"location\";a:1:{s:2:\"ip\";s:10:\"172.23.0.0\";}s:6:\"events\";a:0:{}}','no'),
|
250 |
+
(126,'_transient_timeout_feed_9bbd59226dc36b9b26cd43f15694c5c3','1583295807','no'),
|
251 |
+
(127,'_transient_feed_9bbd59226dc36b9b26cd43f15694c5c3','a:4:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n\n\n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:49:\"\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:27:\"News – – WordPress.org\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:26:\"https://wordpress.org/news\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"WordPress News\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:13:\"lastBuildDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 02 Mar 2020 10:27:41 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"en-US\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"generator\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"https://wordpress.org/?v=5.4-beta3-47400\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"item\";a:10:{i:0;a:6:{s:4:\"data\";s:57:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:37:\"The Month in WordPress: February 2020\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:72:\"https://wordpress.org/news/2020/03/the-month-in-wordpress-february-2020/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 02 Mar 2020 09:15:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Month in WordPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8393\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:337:\"February 2020 was a busy month in the WordPress project! Most notably, there was an outpouring of sentiment in response to the unfortunate cancellation of WordCamp Asia. However, the team continues to work hard in the hopes of making WordCamp Asia 2021 happen. In addition, there were a number of releases and some exciting new […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Hugh Lashbrooke\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:9167:\"\n<p>February 2020 was a busy month in the WordPress project! Most notably, there was an outpouring of sentiment in response to the unfortunate cancellation of WordCamp Asia. However, the team continues to work hard in the hopes of making WordCamp Asia 2021 happen. In addition, there were a number of releases and some exciting new news during the month of February. Read on for more information!</p>\n\n\n\n<hr class=\"wp-block-separator\" />\n\n\n\n<h2>WordCamp Asia 2020 Cancelled & Pop-up Livestream</h2>\n\n\n\n<p>There was a ton of excitement around WordCamp Asia, not to mention all the effort from organizers, speakers, sponsors and volunteers. Unfortunately, on February 12th, <a href=\"https://wordpress.org/news/2020/02/wordcamp-asia-cancelled-due-to-covid-19/\">WordCamp Asia was cancelled</a> due to concern and uncertainty around COVID-19. Since then, the organizing team has worked to <a href=\"https://2020.asia.wordcamp.org/2020/02/12/cancellation/\">refund tickets and to support hotel and air refunds</a>. In addition, a <a href=\"https://wordpress.org/news/2020/02/pop-up-livestream-on-february-22/\">pop-up livestream</a> featuring some WordCamp Asia speakers and a Fireside Chat and Q&A with Matt Mullenweg took place on February 22nd.</p>\n\n\n\n<p>For a personal take on the cancellation of WordCamp Asia, read <a href=\"https://naoko.blog/2020/02/13/wordcamp-asia-2020-recap/\">this post from Naoko Takano</a>, the global lead organizer. Many thanks to the volunteers who worked hard to deliver WordCamp Asia. They’ve not only handled logistics associated with cancellation but have also announced that they’ve started <a href=\"https://2020.asia.wordcamp.org/2020/02/18/wordcamp-asia-2021/\">working on WordCamp Asia 2021</a> with some January dates in mind! To get the latest on WordCamp Asia, subscribe to updates <a href=\"https://2021.asia.wordcamp.org/\">here</a>. </p>\n\n\n\n<h2>WordPress 5.4 Beta is Now Available</h2>\n\n\n\n<p><a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\">WordPress 5.4 Beta 1</a> was released on February 11 and quickly followed by <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-2/\">Beta 2</a> on February 18 and <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-3/\">Beta 3</a> on February 25. These two releases get us closer to our primary goal for 2020: full-site editing with blocks. WordPress 5.4 will merge ten releases of the Gutenberg plugin and is scheduled to be released on March 31, 2020. It will come with many new features, such as two new blocks for social links and buttons, and easier navigation in the block breadcrumbs. There are also a number of accessibility improvements, such as easier multi-block selection and easier tabbing, one of the editor’s biggest accessibility issues. <a href=\"https://make.wordpress.org/core/tag/5-4/\">5.4 will also include</a> many developer-focused changes, such as improved favicon handling and many new hooks and filters.</p>\n\n\n\n<p>Want to get involved in building WordPress? There are a number of ways to help right now! If you speak a language other than English, <a href=\"https://translate.wordpress.org/projects/wp/dev/\">help us translate WordPress</a>. Found a bug? Post it to the<a href=\"https://wordpress.org/support/forum/alphabeta/\"> Alpha/Beta area</a> in the support forums. You can also help us test the current beta by installing <a href=\"https://wordpress.org/plugins/wordpress-beta-tester/\">the WordPress Beta Tester plugin</a>. Just remember that the software is still in development, so we recommend against running it on a production site. </p>\n\n\n\n<h2>WordCamp Centroamérica is Looking for Speakers and Sponsors!</h2>\n\n\n\n<p><a href=\"https://2020.centroamerica.wordcamp.org/\">WordCamp Centroamérica</a> is the first regional WordCamp for Central America and will be held on September 17-19, 2020, in Managua, Nicaragua. The <a href=\"https://2020.centroamerica.wordcamp.org/2020/01/28/llamado-a-ponentes-call-for-speakers/#more-5\">Call for Speakers</a> and <a href=\"https://2020.centroamerica.wordcamp.org/2020/01/16/call-for-sponsors/\">Call for Sponsors</a> are now open, so if you’re interested in speaking at or sponsoring WordCamp Centroamérica, now is your chance! To learn more about the eent, visit and subscribe to updates on their <a href=\"https://2020.centroamerica.wordcamp.org/\">website</a>, or follow their <a href=\"https://www.facebook.com/WordCampCA\">Facebook</a>, <a href=\"https://twitter.com/WordCampCA\">Twitter</a>, and <a href=\"https://instagram.com/wccentroamerica\">Instagram</a> accounts. </p>\n\n\n\n<p>Want to get involved in the Community team and help make more amazing WordCamps happen? <a href=\"https://make.wordpress.org/community/\">Follow the blog</a> and join the #community-events channel in <a href=\"https://make.wordpress.org/chat/\">the Making WordPress Slack group</a>! You can also find out about other <a href=\"https://central.wordcamp.org/\">upcoming WordCamps here</a>.</p>\n\n\n\n<h2>Contribute to WordPress Core via GitHub</h2>\n\n\n\n<p>An experimental feature has been added to Trac to help improve collaboration between Trac and GitHub. This feature allows contributors to link GitHub pull requests opened against the official <a href=\"https://github.com/wordpress/wordpress-develop\">WordPress Develop Git mirror</a> to tickets, which will make GitHub contributions more visible in the related Trac ticket. To learn all the details and to see how it works, read <a href=\"https://make.wordpress.org/core/2020/02/21/working-on-trac-tickets-using-github-pull-requests/\">this post</a>.</p>\n\n\n\n<h2>Gutenberg Development Continues</h2>\n\n\n\n<p>There are many new exciting additions to Gutenberg! On February 5, <a href=\"https://make.wordpress.org/core/2020/02/05/whats-new-in-gutenberg-5-february/\">Gutenberg 7.4 saw two new features added</a>, including background color support to the Columns block and text color support for the Group block. Many enhancements were made, including a number of improvements to the Navigation Block.</p>\n\n\n\n<p>Gutenberg 7.5 was released on February 12, <a href=\"https://make.wordpress.org/core/2020/02/26/whats-new-in-gutenberg-26-february/\">with 7.6 following</a> on February 27. They introduced even more features, including the Social Links block as a stable block and a number of additional blocks for full-site editing, not to mention the many enhancements, new APIs, bug fixes, documentation, and updates.</p>\n\n\n\n<p>Want to get involved in building Gutenberg? Follow <a href=\"https://make.wordpress.org/core/\">the Core team blog</a>, contribute to <a href=\"https://github.com/WordPress/gutenberg/\">Gutenberg on GitHub</a>, and join the #core-editor channel in <a href=\"https://make.wordpress.org/chat/\">the Making WordPress Slack group</a>.</p>\n\n\n\n<hr class=\"wp-block-separator\" />\n\n\n\n<h2>Further Reading:</h2>\n\n\n\n<ul><li>Aside from WordCamp Asia, two other WordCamps have been postponed due to COVID-19: <a href=\"https://2020-soltau.retreat.wordcamp.org/2020/02/29/verschiebung-des-wordcamp-retreat-postponing-of-wordcamp-retreat/\">WordCamp Retreat Soltau</a> and <a href=\"https://2020.geneve.wordcamp.org/wordcamp-geneve-reporte/\">WordCamp Genève</a>. News about further postponements or cancellations will be posted on <a href=\"https://central.wordcamp.org/news/\">the WordCamp Central blog</a>.</li><li>Automatic updates for themes and plugins <a href=\"https://make.wordpress.org/core/2020/02/26/feature-plugin-wp-auto-updates/\">are being planned</a> for inclusion in WordPress 5.5.</li><li>Version 2.2.1 of the WordPress Coding Standards has been released.</li><li>The Community Team <a href=\"https://make.wordpress.org/community/2020/02/06/community-team-reps-for-2020-2/\">has selected new team representatives</a> for 2020.</li><li>The Core team <a href=\"https://make.wordpress.org/core/2020/02/09/what-does-it-mean-to-be-a-component-maintainer-a-refresher/\">published a useful refresher</a> on what it means to be a component maintainer, along with some tips and best practices.</li><li><a href=\"https://make.wordpress.org/support/2020/02/changes-to-the-support-guidelines-for-linking-to-off-site-resources/\">The Support Team has announced</a> some amendments to their guidelines for linking to external resources when using the support forums.</li><li>The WordPress Foundation <a href=\"https://wordpressfoundation.org/2020/wordpress-foundation-donates-to-black-girls-code-and-internet-archive/\">has published financial information</a> regarding their charitable donations from 2019.</li><li>The Core XML Sitemaps project kicked off with <a href=\"https://make.wordpress.org/core/2020/02/24/xml-sitemaps-meeting-february-25th-2020/\">their first meeting</a> this month.</li><li>The Gutenberg team have created <a href=\"https://make.wordpress.org/core/2020/02/28/new-wordpress-create-block-package-for-block-scaffolding/\">a new @wordpress/create-block package</a> for scaffolding new blocks.</li></ul>\n\n\n\n<p><em>Have a story that we should include in the next “Month in WordPress” post? Please </em><a href=\"https://make.wordpress.org/community/month-in-wordpress-submissions/\"><em>submit it here</em></a><em>.</em></p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"8393\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"WordPress 5.4 Beta 3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-3/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 25 Feb 2020 22:10:50 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8384\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:343:\"WordPress 5.4 Beta 3 is now available! This software is still in development, so we don’t recommend you run it on a production site. Consider setting up a test site to play with the new version. You can test the WordPress 5.4 beta in two ways: Try the WordPress Beta Tester plugin (choose “bleeding edge nightlies” […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"David Baumwald\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:2869:\"\n<p>WordPress 5.4 Beta 3 is now available!</p>\n\n\n\n<p><strong>This software is still in development,</strong> so we don’t recommend you run it on a production site. Consider setting up a test site to play with the new version.</p>\n\n\n\n<p>You can test the WordPress 5.4 beta in two ways:</p>\n\n\n\n<ul><li>Try the <a href=\"https://wordpress.org/plugins/wordpress-beta-tester/\">WordPress Beta Tester</a> plugin (choose “bleeding edge nightlies” or “Beta/RC – Bleeding edge” option in version 2.2.0 or later of the plugin) * you must already have updated to your site to “bleeding edge nightlies” for the “Beta/RC – Bleeding edge” option to be available</li><li>Or <a href=\"https://wordpress.org/wordpress-5.4-beta3.zip\">download the beta here</a> (zip). </li></ul>\n\n\n\n<p>WordPress 5.4 is slated for release on <a href=\"https://make.wordpress.org/core/5-4/\">March 31st, 2020</a>, and we need your help to get there.</p>\n\n\n\n<p>Thanks to the testing and feedback from everyone who tested <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-2/\">beta 2</a> (and <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\">beta 1</a>) over <a href=\"https://core.trac.wordpress.org/query?status=closed&changetime=02%2F18%2F2020..02%2F25%2F2020&milestone=5.4&col=id&col=summary&col=status&col=milestone&col=owner&col=type&col=priority&order=priority\">24 tickets have been closed</a> in the past week. </p>\n\n\n\n<h2>Some highlights </h2>\n\n\n\n<ul><li><a href=\"https://github.com/WordPress/gutenberg/pull/20424\">Round-up of Gutenberg fixes</a></li><li><a href=\"https://core.trac.wordpress.org/ticket/47606\">Display Site Health score on Dashboard</a></li></ul>\n\n\n\n<h2>Developer notes</h2>\n\n\n\n<p>WordPress 5.4 has lots of refinements to polish the developer experience. To keep up, subscribe to the <a href=\"https://make.wordpress.org/core/\">Make WordPress Core blog</a> and pay special attention to the <a href=\"https://make.wordpress.org/core/tag/5-4+dev-notes/\">developer notes</a> tag for updates on those and other changes that could affect your products.</p>\n\n\n\n<h2>How to Help</h2>\n\n\n\n<p>Do you speak a language other than English? <a href=\"https://translate.wordpress.org/projects/wp/dev/\">Help us translate WordPress into more than 100 languages</a>!</p>\n\n\n\n<p>If you think you’ve found a bug, you can post to the <a href=\"https://wordpress.org/support/forum/alphabeta/\">Alpha/Beta area</a> in the support forums. We’d love to hear from you! If you’re comfortable writing a reproducible bug report, <a href=\"https://core.trac.wordpress.org/newticket\">file one on WordPress Trac</a> where you can also find a list of <a href=\"https://core.trac.wordpress.org/tickets/major\">known bugs</a>.</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"8384\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:57:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"Pop-Up Livestream on February 22\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"https://wordpress.org/news/2020/02/pop-up-livestream-on-february-22/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 20 Feb 2020 23:06:13 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Uncategorized\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8377\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:350:\"As mentioned in this post, Matt will host a livestream on February 22 during Bangkok daylight hours. He opened an invitation to any speaker who was affected by the cancellation, and the livestream will include the following fine people: Imran Sayed, Md Saif Hassan, Muhammad Muhsin, Nirav Mehta, Piccia Neri, Umar Draz, and Francesca Marano […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:7:\"Josepha\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:2219:\"\n<p>As mentioned <a href=\"https://wordpress.org/news/2020/02/wordcamp-asia-cancelled-due-to-covid-19/\">in this post</a>, Matt will host a <a href=\"https://livestream.w.org/\">livestream on February 22</a> during Bangkok daylight hours. He opened an invitation to any speaker who was affected by the cancellation, and the livestream will include the following fine people: <a href=\"https://profiles.wordpress.org/gsayed786/\">Imran Sayed</a>, <a href=\"https://profiles.wordpress.org/saiftheboss7/\">Md Saif Hassan</a>, <a href=\"https://profiles.wordpress.org/mmuhsin/\">Muhammad Muhsin</a>, <a href=\"https://profiles.wordpress.org/niravmehta/\">Nirav Mehta</a>, <a href=\"https://profiles.wordpress.org/piccianeri/\">Piccia Neri</a>, <a href=\"https://profiles.wordpress.org/itpixelz/\">Umar Draz</a>, and <a href=\"https://profiles.wordpress.org/francina/\">Francesca Marano</a> as well as a Fireside Chat and Q&A<strong> </strong>with <a href=\"https://profiles.wordpress.org/matt/\">Matt Mullenweg</a> & <a href=\"https://www.linkedin.com/in/monishavaradan/\">Monisha Varadan</a>.</p>\n\n\n\n<div class=\"wp-block-buttons aligncenter\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-background has-vivid-cyan-blue-background-color\" href=\"https://livestream.w.org/\" target=\"_blank\" rel=\"https://livestream.w.org/ noopener noreferrer\">Join the stream</a></div>\n</div>\n\n\n\n<p>This should be a great way to get to hear from some speakers who have yet to share their knowledge on a global stage. WordPress is enriched by a multitude of experiences and perspectives, and I hope you are as excited as I am to hear new voices from a part of the world that is frequently underrepresented in the WordPress open source project. </p>\n\n\n\n<p>Also exciting, <a href=\"https://2020.asia.wordcamp.org/2020/02/18/wordcamp-asia-2021/\">the WordCamp Asia team has announced that they’re aiming for January 2021</a>, so please mark your calendars now! This small but mighty team of trailblazing organizers has shown great resilience over the years they’ve spent, building toward this event. I am personally grateful for the hard work they’ve done and have yet to do, and can’t wait to thank them in Bangkok next year.</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"8377\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"WordPress 5.4 Beta 2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-2/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 18 Feb 2020 21:50:41 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8360\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:372:\"WordPress 5.4 Beta 2 is now available! This software is still in development, so we don’t recommend running it on a production site. Consider setting up a test site to play with the new version. You can test WordPress 5.4 beta 2 in two ways: Try the WordPress Beta Tester plugin (choose the “bleeding edge nightlies” option) Or download […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"David Baumwald\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:3397:\"\n<p>WordPress 5.4 Beta 2 is now available!</p>\n\n\n\n<p><strong>This software is still in development,</strong> so we don’t recommend running it on a production site. Consider setting up a test site to play with the new version.</p>\n\n\n\n<p>You can test WordPress 5.4 beta 2 in two ways:</p>\n\n\n\n<ul><li>Try the <a href=\"https://wordpress.org/plugins/wordpress-beta-tester/\">WordPress Beta Tester</a> plugin (choose the “bleeding edge nightlies” option)</li><li>Or <a href=\"https://wordpress.org/wordpress-5.4-beta2.zip\">download the beta here</a> (zip).</li></ul>\n\n\n\n<p>WordPress 5.4 is slated for release on <a href=\"https://make.wordpress.org/core/5-4/\">March 31, 2020</a>, and <strong>we need your help to get there</strong>!</p>\n\n\n\n<p>Thank you to all of the contributors that tested the <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\">beta 1</a> development release and provided feedback. Testing for bugs is an important part of polishing each release and a great way to contribute to WordPress.</p>\n\n\n\n<h2>Some highlights</h2>\n\n\n\n<p>Since <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\">beta 1</a>, <a href=\"https://core.trac.wordpress.org/query?status=closed&changetime=02%2F12%2F2020..&milestone=5.4&group=component&col=id&col=summary&col=owner&col=type&col=priority&col=component&col=version&order=priority\">27 bugs</a> have been fixed. Here is a summary of a few changes included in beta 2:</p>\n\n\n\n<ul><li>Block editor: Columns in the Block Library that have unassigned-width will now grow equally.</li><li>Block editor: The custom gradient picker now works in languages other than English.</li><li>Block editor: When choosing colors is not possible, the color formatter no longer shows.</li><li>Privacy: The privacy request form fields have been adjusted to be more consistent on mobile.</li><li>Privacy: The notice offering help when editing the privacy policy page will no longer show at the top of All Pages in the admin area.</li><li>Site Health: The error codes for failed REST API tests now display correctly.</li></ul>\n\n\n\n<h2>Developer notes</h2>\n\n\n\n<p>WordPress 5.4 has lots of refinements to polish the developer experience. To keep up, subscribe to the <a href=\"https://make.wordpress.org/core/\">Make WordPress Core blog</a> and pay special attention to the <a href=\"https://make.wordpress.org/core/tag/5-4+dev-notes/\">developers’ notes</a> for updates on those and other changes that could affect your products.</p>\n\n\n\n<h2>How to Help</h2>\n\n\n\n<p>Do you speak a language other than English? <a href=\"https://translate.wordpress.org/projects/wp/dev/\">Help us translate WordPress into more than 100 languages</a>!</p>\n\n\n\n<p>If you think you’ve found a bug, you can post to the <a href=\"https://wordpress.org/support/forum/alphabeta/\">Alpha/Beta area</a> in the support forums. We’d love to hear from you! </p>\n\n\n\n<p>If you’re comfortable writing a reproducible bug report, <a href=\"https://core.trac.wordpress.org/newticket\">file one on WordPress Trac</a>, where you can also find a list of <a href=\"https://core.trac.wordpress.org/tickets/major\">known bugs</a>.</p>\n\n\n\n<p><em>UPDATE – 20 Feb, 2020: This post was originally misattributed to Francesca Marano. The proper authorship has been corrected.</em></p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"8360\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"People of WordPress: Kori Ashton\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"https://wordpress.org/news/2020/02/people-of-wordpress-kori-ashton/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 14 Feb 2020 21:12:53 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:9:\"Community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:9:\"heropress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8348\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:374:\"You’ve probably heard that WordPress is open-source software, and may know that it’s created and run by volunteers. WordPress enthusiasts share many examples of how WordPress changed people’s lives for the better. This monthly series shares some of those lesser-known, amazing stories. The beginning In 1998, Kori created her very first HTML website. Her dad […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Yvette Sonneveld\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:11825:\"\n<p><em>You’ve probably heard that WordPress is open-source software, and may know that it’s created and run by volunteers. WordPress enthusiasts share many examples of how WordPress changed people’s lives for the better. This monthly series shares some of those lesser-known, amazing stories.</em></p>\n\n\n\n<h2><strong>The beginning</strong></h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img src=\"https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton.jpg?w=632&ssl=1\" alt=\"\" class=\"wp-image-8349\" srcset=\"https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton.jpg?w=960&ssl=1 960w, https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton.jpg?resize=300%2C300&ssl=1 300w, https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton.jpg?resize=150%2C150&ssl=1 150w, https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton.jpg?resize=768%2C767&ssl=1 768w\" sizes=\"(max-width: 632px) 100vw, 632px\" data-recalc-dims=\"1\" /><figcaption>Kori Ashton</figcaption></figure>\n\n\n\n<p>In 1998, Kori created her very first HTML website. Her dad was creating websites for a living at the time. She needed a website for her band because she wanted to be a rockstar. Under his training, and with a little bit of self-teaching, she learned how to build a website.</p>\n\n\n\n<p>She had been aware of WordPress since 2005, and, in 2008 a client specifically hired her as a freelancer to develop a WordPress website. Kori went straight to Google and taught herself how to build a WordPress website over a single weekend. She really enjoyed the experience of working with WordPress.</p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>My mind was absolutely blown when I saw the drag and drop options inside of menus to create dropdowns and a form builder. </em></p><cite>Kori Ashton</cite></blockquote>\n\n\n\n<p>She suggested to her dad that WordPress could be a solution for their customers who wanted to be able to access their own websites. Previously, they had found this was not as easy for clients unless they had specific software and knew how to code. So, Kori and her dad worked to learn WordPress over the next few years. </p>\n\n\n\n<p>Then in 2012, Kori and her parents launched their new business, WebTegrity, in San Antonio, Texas, US. It started out small: just Kori and her parents. Soon, they started subcontracting design work and quickly continued to grow their team.</p>\n\n\n\n<h2><strong>Going big time</strong></h2>\n\n\n\n<p>Even though the business was in a saturated industry in San Antonio — over 700 freelancers and agencies were providing similar services — Kori and her parents were able to sell their company five years later, with a multi-million dollar valuation. There were a few choices they made early on that led to that success.</p>\n\n\n\n<h3><strong>1. They picked a niche: WordPress specialists </strong></h3>\n\n\n\n<p>At the time, there were no WordPress-specific agencies in San Antonio. They emphasized the fact that WordPress was the only CMS their company would use. Prospective clients looking for a different type of CMS solution were not the right fit for their business. They also offered on-site, WordPress training and weekend workshops that were open to anyone (including other agencies) as one of their revenue streams. They soon were established as a city-wide WordPress authority.</p>\n\n\n\n<h3><strong>2. They cultivated a culture</strong></h3>\n\n\n\n<p>Kori wanted a great culture and environment in her company and to make that happen, she needed to hire the right people. She believes you must be careful about who you bring into the culture of your business, but particularly when hiring leaders into that community. You can’t teach passion so you’ve got to find people that are excited about what you do. You also need to look for integrity, creativity, a love for solving problems, and an eagerness to keep getting better. </p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>You can teach code all day long, but be sure to find people with the right hearts to join your community and then train them up the right way. This way you will grow your culture in a healthy way.</em></p><cite>Kori Ashton</cite></blockquote>\n\n\n\n<figure class=\"wp-block-image size-large\"><img src=\"https://i0.wp.com/wordpress.org/news/files/2020/02/kori-ashton-2.png?w=632&ssl=1\" alt=\"\" class=\"wp-image-8350\" srcset=\"https://i0.wp.com/wordpress.org/news/files/2020/02/kori-ashton-2.png?w=711&ssl=1 711w, https://i0.wp.com/wordpress.org/news/files/2020/02/kori-ashton-2.png?resize=287%2C300&ssl=1 287w\" sizes=\"(max-width: 632px) 100vw, 632px\" data-recalc-dims=\"1\" /><figcaption>Kori and her two sons</figcaption></figure>\n\n\n\n<h3><strong>3. They learned how to build sustainable revenue streams</strong></h3>\n\n\n\n<p>Like many other web development agencies, WebTegrity started out with the “one-time fee and you’re done” business model. This business model is known for unpredictable revenue streams. Hearing about recurring revenue business models at WordCamp Austin was a lightbulb moment for Kori. She started drafting a more sustainable business model on the way back home. </p>\n\n\n\n<p>Support packages were key to their new business plan. Clients needed ongoing support. They decided to include at least 12 months of post-launch support into their web development projects. This doubled their revenue in one year and allowed them to even out their revenue streams.</p>\n\n\n\n<h3><strong>4. They knew the importance of reputation</strong></h3>\n\n\n\n<p>Kori believes that every client, whether they have a $5,000 or a $50,000 budget, should get the same type of boutique-style, white glove, concierge relationship.</p>\n\n\n\n<p>Every single project results in the absolute best solution for a client’s needs. In addition to that, offering training helped boost their reputation. Explaining the lingo of the web development and SEO fields and showing the processes used, added transparency. It helped set and meet expectations and it built trust. </p>\n\n\n\n<h3><strong>5. They proactively gave back to the community</strong></h3>\n\n\n\n<p>Kori heard Matt Mullenweg speak about <a href=\"https://wordpress.org/five-for-the-future/\">Five For The Future</a> at WordCamp US. He encouraged people in the audience who make a living using WordPress, to find ways to give back 5% of their time to building the WordPress software and community. Matt talked about how firms and individuals could give back to the community. He suggested, for instance to:</p>\n\n\n\n<ul><li>start a WordPress Meetup group</li><li>present at a Meetup event </li><li>facilitate a Meetup group where maybe you’re just the organizer and you never have to speak because you’re not a fan of speaking</li><li>help organize a WordCamp</li><li>volunteer at a WordCamp</li><li>write a tutorial and tell people how to do WordPress related things </li><li>run a workshop</li><li>make a video</li></ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img src=\"https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton-3.jpg?fit=632%2C422&ssl=1\" alt=\"\" class=\"wp-image-8351\" srcset=\"https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton-3.jpg?w=1500&ssl=1 1500w, https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton-3.jpg?resize=300%2C200&ssl=1 300w, https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton-3.jpg?resize=1024%2C683&ssl=1 1024w, https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton-3.jpg?resize=768%2C513&ssl=1 768w, https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton-3.jpg?w=1264&ssl=1 1264w\" sizes=\"(max-width: 632px) 100vw, 632px\" /><figcaption>If you’re making an income using WordPress, consider giving 5% of your time back to building the software and/or the community.</figcaption></figure>\n\n\n\n<p>This gave Kori another light bulb moment. She could make videos to give back. So her way to give back to the WordPress community is her <a href=\"https://www.youtube.com/user/webtegrity\">YouTube channel</a>.</p>\n\n\n\n<p>Every Wednesday, she published a video on how to improve your online marketing. This made a huge impact, both inside the WordPress community, but also in her own business.</p>\n\n\n\n<h2><strong>Understanding</strong></h2>\n\n\n\n<p>So, in summary, how did Kori and her family turn their business into a multi-million dollar buyout in just five years? </p>\n\n\n\n<p>Ultimately, it was about understanding that you have to build value. About keeping an exit strategy in mind while building your business. For instance when naming your company. Will it stand alone? Could it turn into a brand that you could sell as an independent entity?</p>\n\n\n\n<ul><li>Think about revenue streams and watch sales margins.</li><li>Be sure to include healthy margins. </li><li>Don’t hire until you have no further option.</li><li>Make sure to structure your offerings in such a way that you’re actually recouping your value. </li><li>Understand entrepreneurship, watch Shark Tank, read more tutorials, watch more videos.</li><li>Get involved in the WordPress community. Get to know its core leaders, the speakers that travel around to all the WordCamps. Start following them on Twitter and try to understand what they’re sharing. </li></ul>\n\n\n\n<p>In the end, the fact that Kori was so active in the San Antonio community helped enable the sale.</p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>We just kept hammering on the fact that we were the go-to place here in San Antonio for WordPress. We kept training, we kept doing free opportunities, going out and speaking at different events, and people kept seeing us. We kept showing up, kept giving back and kept establishing ourselves as the authority.</em></p><cite>Kori Ashton</cite></blockquote>\n\n\n\n<h2><strong>Contributors</strong></h2>\n\n\n\n<p>Alison Rothwell (<a href=\"https://profiles.wordpress.org/wpfiddlybits/\">@wpfiddlybits</a>), Yvette Sonneveld (<a href=\"https://profiles.wordpress.org/yvettesonneveld/\">@yvettesonneveld</a>), Abha Thakor (<a href=\"https://profiles.wordpress.org/webcommsat/\">@webcommsat</a>), Josepha Haden (<a href=\"https://profiles.wordpress.org/chanthaboune/\">@chanthaboune</a>), Topher DeRosia (<a href=\"https://profiles.wordpress.org/topher1kenobe/\">@topher1kenobe</a>).</p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container\">\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-large\"><img src=\"https://i1.wp.com/wordpress.org/news/files/2019/07/heropress_large_white_logo.jpg?resize=632%2C474&ssl=1\" alt=\"\" class=\"wp-image-7025\" srcset=\"https://i1.wp.com/wordpress.org/news/files/2019/07/heropress_large_white_logo.jpg?w=1024&ssl=1 1024w, https://i1.wp.com/wordpress.org/news/files/2019/07/heropress_large_white_logo.jpg?resize=300%2C225&ssl=1 300w, https://i1.wp.com/wordpress.org/news/files/2019/07/heropress_large_white_logo.jpg?resize=768%2C576&ssl=1 768w\" sizes=\"(max-width: 632px) 100vw, 632px\" data-recalc-dims=\"1\" /></figure>\n</div>\n\n\n\n<div class=\"wp-block-column\" style=\"flex-basis:66.66%\">\n<p><em>This post is based on an <a href=\"https://heropress.com/essays/build-company-wordpress/\">article originally published on HeroPress.com</a>, a community initiative created by </em><a href=\"https://profiles.wordpress.org/topher1kenobe/\"><em>Topher DeRosia</em></a><em>. HeroPress highlights people in the WordPress community who have overcome barriers and whose stories would otherwise go unheard.Meet more WordPress community members over at </em><a href=\"https://heropress.com/\"><em>HeroPress.com</em></a><em>!</em></p>\n</div>\n</div>\n</div></div>\n</div></div>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"8348\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:57:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:39:\"WordCamp Asia Cancelled Due to COVID-19\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"https://wordpress.org/news/2020/02/wordcamp-asia-cancelled-due-to-covid-19/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 12 Feb 2020 04:23:12 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"WordCamp\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8344\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:349:\"I’ve arrived at the difficult decision to cancel the inaugural WordCamp Asia event, which was planned to take place in Bangkok on February 21st. The excitement and anticipation around this event have been huge, but there are too many unknowns around the health issues unfolding right now in the region to explicitly encourage a large […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matt Mullenweg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:1267:\"\n<p>I’ve arrived at the difficult decision to cancel the inaugural WordCamp Asia event, which was planned to take place in Bangkok on February 21st. The excitement and anticipation around this event have been huge, but there are too many unknowns around the health issues unfolding right now in the region to explicitly encourage a large public gathering bringing together over 1,300 people from around the world.</p>\n\n\n\n<p>We’re going to explore if speakers — including myself — can do our sessions with the same content and at the same time that was originally planned, just online instead of in-person so we can achieve our goal of bringing the pan-Asian community closer together without putting anyone’s health at additional risk.</p>\n\n\n\n<p>Regardless, I greatly appreciate the work everyone — from organizers to attendees, speakers to sponsors — put into making this a big success. So many people have come together to create an event to inspire and connect WordPressers, and I am confident that this passion will carry through into the event next year. Our thoughts are with everyone affected by the virus so far, and we sincerely hope that everything is resolved quickly so that this precaution looks unnecessary in hindsight.</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"8344\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"WordPress 5.4 Beta 1\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 11 Feb 2020 22:43:44 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8322\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:361:\"WordPress 5.4 Beta 1 is now available for testing! This software is still in development, so we don’t recommend running it on a production site. Consider setting up a test site to play with the new version. You can test the WordPress 5.4 beta in two ways: Try the WordPress Beta Tester plugin (choose the “bleeding edge nightlies” […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Francesca Marano\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:7546:\"\n<p>WordPress 5.4 Beta 1 is now available for testing!</p>\n\n\n\n<p><strong>This software is still in development,</strong> so we don’t recommend running it on a production site. Consider setting up a test site to play with the new version.</p>\n\n\n\n<p>You can test the WordPress 5.4 beta in two ways:</p>\n\n\n\n<ul><li>Try the <a href=\"https://wordpress.org/plugins/wordpress-beta-tester/\">WordPress Beta Tester</a> plugin (choose the “bleeding edge nightlies” option)</li><li>Or <a href=\"https://wordpress.org/wordpress-5.4-beta1.zip\">download the beta here (zip)</a>.</li></ul>\n\n\n\n<p>WordPress 5.4 is slated for release on <a href=\"https://make.wordpress.org/core/5-4/\">March 31, 2020</a>, and <strong>we need your help to get there</strong>!</p>\n\n\n\n<p>While the <strong>primary goal for 2020 is full-site editing with blocks</strong>, contributors to WordPress are working across every area of the project to ensure the software continues moving forward.</p>\n\n\n\n<p>Testing for bugs is an important part of polishing the release during the beta stage and a great way to contribute. Here are some of the big changes and features to pay close attention to while testing.</p>\n\n\n\n<h2>Block Editor: features and improvements</h2>\n\n\n\n<p>WordPress 5.4 Core will merge ten releases of the Gutenberg plugin. This means there’s a long list of exciting new features. Here are just a few:</p>\n\n\n\n<ul><li>Two new blocks: social links and buttons.</li><li>More color options for Button, Cover, Group and Column blocks .</li><li>A <a href=\"https://github.com/WordPress/gutenberg/pull/18041\">Welcome Guide modal</a>.</li><li>Tools for adding featured images in the Latest Posts block.</li><li>Easier navigation in the block breadcrumbs.</li></ul>\n\n\n\n<p>Some additional changes to make note of:</p>\n\n\n\n<ul><li>On mobile, the toolbar stays on top, so you can’t lose it.</li><li>Easier image sizing in the Gallery block.</li><li>Drag-and-drop images into the featured-image box.</li><li>Several new APIs.</li><li>Friendlier offline error messages on REST API request failures.</li><li>Table block captions.</li><li>You can now color just parts of the text in any RichText block. </li></ul>\n\n\n\n<h3>Accessibility improvements</h3>\n\n\n\n<ul><li>Easier multi-block selection. </li><li>Support for changing an image’s title attribute within the Image block.</li><li>Easier tabbing. This had been one of the editor’s biggest accessibility problems, but now tabbing works with the block’s sidebar.</li><li>Visual switch between Edit and Navigation modes and enable screen reader announcements.</li></ul>\n\n\n\n<p>To see all of the features for each release in detail check out the release posts: <a href=\"https://make.wordpress.org/core/2019/10/02/whats-new-in-gutenberg-2-october/\">6.6</a>, <a href=\"https://make.wordpress.org/core/2019/10/16/whats-new-in-gutenberg-16-october/\">6.7</a>, <a href=\"https://make.wordpress.org/core/2019/10/30/whats-new-in-gutenberg-30-october/\">6.8</a>, <a href=\"https://make.wordpress.org/core/2019/11/13/whats-new-in-gutenberg-13-november/\">6.9</a>, <a href=\"https://make.wordpress.org/core/2019/11/27/whats-new-in-gutenberg-27-november/\">7.0</a>, <a href=\"https://make.wordpress.org/core/2019/12/11/whats-new-in-gutenberg-11-december/\">7.1</a>, <a href=\"https://make.wordpress.org/core/2020/01/09/whats-new-in-gutenberg-8-january/\">7.2</a>, <a href=\"https://make.wordpress.org/core/2020/01/22/whats-new-in-gutenberg-22-january/\">7.3</a>, <a href=\"https://make.wordpress.org/core/2020/02/05/whats-new-in-gutenberg-5-february/\">7.4</a> and 7.5.</p>\n\n\n\n<h3>Continuing efforts to improve performance</h3>\n\n\n\n<p>The block editor team has achieved a 14% loading time reduction and 51% time-to-type reduction, for a particularly sizable post (~ 36,000 words, ~1,000 blocks) since WordPress 5.3.</p>\n\n\n\n<h2>Wait! There’s more</h2>\n\n\n\n<h3>Site Health </h3>\n\n\n\n<p>When a project powers 34% of the world’s websites, there must be a focus on security. This is why contributors continue working so hard on the Site Health Project.</p>\n\n\n\n<p>WordPress 5.4 adds a widget on the dashboard that warns administrators of potential issues that could affect their site’s performance or security. A call-to-action button directs them to the Site Health screen for details and suggested fixes.</p>\n\n\n\n<h3>Accessibility improvements</h3>\n\n\n\n<p>WordPress strives to improve accessibility with every release, and this release is no different. Version 5.4 will contain the following accessibility enhancements:</p>\n\n\n\n<ul><li>Better focus management in Menu, Customizer and Site Health screens, to fix some existing keyboard navigation issues.</li><li>Easier keyboard navigation for better semantics in the Media modal.</li><li>An easier-to-read Privacy Policy Guide.</li></ul>\n\n\n\n<h2>For Developers</h2>\n\n\n\n<p>5.4 also contains a bunch of developer focused changes.</p>\n\n\n\n<h3>Calendar Widget </h3>\n\n\n\n<p>The HTML 5.1 specification mandates that a <code><tfoot></code> tag must follow <code><tbody></code> tag (which was not the case in the calendar widget). WordPress 5.4 moves the navigation links to a <code><nav></code> HTML element immediately following the <code><table></code> element in order to produce valid HTML.</p>\n\n\n\n<h3>apply_shortcodes() as an alias for do_shortcode()</h3>\n\n\n\n<p>Instead of using <code>do_shortcode()</code>, <code>apply_shortcodes()</code> should be utilized instead. While <code>do_shortcode()</code> is not being deprecated, the new function delivers better semantics.</p>\n\n\n\n<h3>Better favicon handling</h3>\n\n\n\n<p>Now favicon requests can be managed with more flexibility. Administrators can choose a favicon in the Customizer, or upload a <code>/favicon.ico</code> file. The WordPress logo will always load as a fallback.</p>\n\n\n\n<h3>Other changes for developers</h3>\n\n\n\n<ul><li>Clearer information about errors in <code>wp_login_failed</code>.</li><li>Site ID has been added to the <code>newblog_notify_siteadmin</code> filter for multisite installs.</li><li>Support has been added for the required WordPress and PHP version headers in themes.</li><li>Embed support has been added for TikTok.</li></ul>\n\n\n\n<p>Keep your eyes on the <a href=\"https://make.wordpress.org/core/\">Make WordPress Core blog</a> for <a href=\"https://make.wordpress.org/core/tag/5-4+dev-notes/\">5.4-related developer notes</a> in the coming weeks, breaking down these and other changes in greater detail.</p>\n\n\n\n<p>So far, contributors have fixed more than <a href=\"https://core.trac.wordpress.org/query?status=closed&milestone=5.4&group=component&max=500&col=id&col=summary&col=owner&col=type&col=priority&col=component&col=version&order=priority\">255 tickets in WordPress 5.4</a> with more to come.</p>\n\n\n\n<h2>How You Can Help</h2>\n\n\n\n<p>Do you speak a language other than English? <a href=\"https://translate.wordpress.org/projects/wp/dev/\">Help us translate WordPress into more than 100 languages</a>!</p>\n\n\n\n<p>If you think you’ve found a bug, you can post to the <a href=\"https://wordpress.org/support/forum/alphabeta/\">Alpha/Beta area</a> in the support forums. We’d love to hear from you! If you’re comfortable writing a reproducible bug report, <a href=\"https://core.trac.wordpress.org/newticket\">file one on WordPress Trac</a> where you can also find a list of <a href=\"https://core.trac.wordpress.org/tickets/major\">known bugs</a>.</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"8322\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:57:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"The Month in WordPress: January 2020\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/news/2020/02/the-month-in-wordpress-january-2020/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 03 Feb 2020 09:54:06 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Month in WordPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8316\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:338:\"Following an action-packed December, 2020 is off to a fine start with some new releases and announcements. Read on to find out what happened in the WordPress project in January. Release of Gutenberg 7.2 & 7.3 Gutenberg 7.2, the first Gutenberg release of 2020, was deployed on January 8th and included over 180 pull requests […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Angela Jin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:5943:\"\n<p>Following an action-packed December, 2020 is off to a fine start with some new releases and announcements. Read on to find out what happened in the WordPress project in January.</p>\n\n\n\n<hr class=\"wp-block-separator\" />\n\n\n\n<h2>Release of Gutenberg 7.2 & 7.3</h2>\n\n\n\n<p><a href=\"https://make.wordpress.org/core/2020/01/09/whats-new-in-gutenberg-8-january/\">Gutenberg 7.2</a>, the first Gutenberg release of 2020, was deployed on January 8th and included over 180 pull requests from more than 56 contributors. This was followed soon after by <a href=\"https://make.wordpress.org/core/2020/01/22/whats-new-in-gutenberg-22-january/\">Gutenberg 7.3</a>. New features include a new Buttons block, support in adding links to Media & Text block images, improvements to the Navigation and Gallery blocks, performance improvements, and accessibility enhancements. These releases also included many additional enhancements, fixes, new APIs, documentation, and more.</p>\n\n\n\n<p>Want to get involved in building Gutenberg? Follow <a href=\"https://make.wordpress.org/core/\">the Core team blog</a>, contribute to <a href=\"https://github.com/WordPress/gutenberg/\">Gutenberg on GitHub</a>, and join the #core-editor channel in <a href=\"https://make.wordpress.org/chat/\">the Making WordPress Slack group</a>.</p>\n\n\n\n<h2>Proposal for an XML Sitemaps Feature Plugin</h2>\n\n\n\n<p>In June last year, a team of contributors <a href=\"https://make.wordpress.org/core/2019/06/12/xml-sitemaps-feature-project-proposal/\">proposed</a> a feature plugin that would bring standardized XML sitemaps to WordPress Core. Since then, the team has been working to bring this to reality and <a href=\"https://make.wordpress.org/core/2020/01/27/feature-plugin-xml-sitemaps/\">have now published a working plugin</a> to demonstrate this new capability.</p>\n\n\n\n<p>The plugin is still in development, but the included features already provide much-needed functionality from which all WordPress sites can benefit. You can install the plugin from your WordPress dashboard or <a href=\"https://wordpress.org/plugins/core-sitemaps/\">download it here</a>.</p>\n\n\n\n<p>Want to get involved in bringing this feature to Core? Follow <a href=\"https://make.wordpress.org/core/\">the Core team blog</a>, report any issues you find <a href=\"https://github.com/GoogleChromeLabs/wp-sitemaps/issues\">on GitHub</a>, and join the #core channel in <a href=\"https://make.wordpress.org/chat/\">the Making WordPress Slack group</a>.</p>\n\n\n\n<h2>A New Block-Based Themes Meeting</h2>\n\n\n\n<p>The Theme Review Team has <a href=\"https://make.wordpress.org/themes/2020/01/29/new-bi-weekly-block-based-themes-meeting/\">announced</a> that they will be holding bi-weekly meetings in the #themereview channel focused on discussing block-based themes. If you are interested in discussing themes within the context of Gutenberg’s full-site editing framework, this will be the place to do so! The first meeting will be held on Wednesday, February 5, at 16:00 UTC.</p>\n\n\n\n<p>Want to get involved with the Theme Review Team or <a href=\"https://make.wordpress.org/themes/handbook/get-involved/become-a-reviewer/\">become a reviewer</a>? Follow <a href=\"https://make.wordpress.org/themes/\">their blog</a>, and join the #themereview channel in <a href=\"https://make.wordpress.org/chat/\">the Making WordPress Slack group</a>.</p>\n\n\n\n<hr class=\"wp-block-separator\" />\n\n\n\n<h2>Further Reading</h2>\n\n\n\n<ul><li>The Core team has started work on WordPress 5.4 and kicked off their planning with <a href=\"https://make.wordpress.org/core/2020/01/14/wordpress-5-4-planning-roundup/\">a summary post</a>. You can follow all the v5.4 updates by watching <a href=\"https://make.wordpress.org/core/tag/5-4/\">the version tag</a> on the Core team blog.</li><li>The inaugural <a href=\"https://2020.asia.wordcamp.org/\">WordCamp Asia</a> event is taking place in February. This will be the largest WordPress event in the region, bringing together around 1,500 WordPress enthusiasts from around the world.</li><li>Two WordPress community leaders, <a href=\'https://profiles.wordpress.org/chanthaboune/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>chanthaboune</a> and <a href=\'https://profiles.wordpress.org/andreamiddleton/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>andreamiddleton</a>, <a href=\"https://wordpress.org/news/2020/01/wordpress-leaders-nominated-for-cmx-awards/\">were nominated for CMX awards</a> due to their work on the WordPress project, with <a href=\'https://profiles.wordpress.org/andreamiddleton/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>andreamiddleton</a> winning the award for Executive Leader of a Community Team.</li><li><a href=\"https://make.wordpress.org/core/2020/01/29/lazy-loading-images-in-wordpress-core/\">A feature plugin has been proposed</a> that introduces lazy-loading images to WordPress Core, which will be a huge step forward in improving performance all across the web.</li><li>The Core team has put together <a href=\"https://make.wordpress.org/core/handbook/tutorials/faq-for-new-contributors/\">an extensive and informative FAQ</a> to help new contributors get involved in contributing to the project.</li><li>One key priority for Gutenberg is the ability to control the block editor. There are already a number of APIs that control the experience, but there is a lack of consistency and missing APIs. <a href=\"https://make.wordpress.org/core/2020/01/23/controlling-the-block-editor/\">A method to address this</a> has been proposed.</li><li>The Design team <a href=\"https://make.wordpress.org/design/2020/01/24/gutenberg-phase-2-friday-design-update-43/\">published detailed information</a> on the recent design improvements in Gutenberg.</li></ul>\n\n\n\n<p><em>Have a story that we should include in the next “Month in WordPress” post? Please </em><a href=\"https://make.wordpress.org/community/month-in-wordpress-submissions/\"><em>submit it here</em></a><em>.</em></p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"8316\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:76:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:6:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"People of WordPress: Robert Cheleuka\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/news/2020/01/people-of-wordpress-robert-cheleuka/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:80:\"https://wordpress.org/news/2020/01/people-of-wordpress-robert-cheleuka/#comments\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 25 Jan 2020 15:26:54 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:9:\"Community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:9:\"heropress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8300\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:385:\"You’ve probably heard that WordPress is open-source software, and may know that it’s created and run by volunteers. WordPress enthusiasts share many examples of how WordPress changed people’s lives for the better. This monthly series shares some of those lesser-known, amazing stories. Meet Robert Cheleuka Robert is a self-taught graphic and motion designer turned web […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Yvette Sonneveld\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:8428:\"\n<p><em>You’ve probably heard that WordPress is open-source software, and may know that it’s created and run by volunteers. WordPress enthusiasts share many examples of how WordPress changed people’s lives for the better. This monthly series shares some of those lesser-known, amazing stories.</em></p>\n\n\n\n<h2><strong>Meet Robert Cheleuka</strong></h2>\n\n\n\n<p>Robert is a self-taught graphic and motion designer turned web designer (and aspiring web developer) from Malawi, Africa. Over the years, he has grown fond of WordPress and has become a loyal user. Still, the journey is rough.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img src=\"https://i2.wp.com/wordpress.org/news/files/2020/01/DSC08818.jpg?resize=632%2C790&ssl=1\" alt=\"Robert Cheleuka\" class=\"wp-image-8303\" data-recalc-dims=\"1\" /><figcaption>Robert Cheleuka</figcaption></figure>\n\n\n\n<h3><strong>Malawi</strong></h3>\n\n\n\n<p>Malawi is one of the poorest countries in the world. A tiny landlocked country with a population of 17 million, it’s largely rural and still considered a developing country. The average entry-level monthly pay for most skilled jobs is about $110. If you’re employed full-time in the creative industry and if you’re very lucky, you might be able to earn more than that. Employees earning more than $300 a month are rare to non-existent.</p>\n\n\n\n<p>Robert has been a freelance graphic designer since about 2011. He started by doing gigs from his dorm in college and from home. Earnings from his freelance jobs increased his interest in entrepreneurship and he started to consider starting his own creative agency.</p>\n\n\n\n<h3><strong>How Robert was introduced to WordPress</strong></h3>\n\n\n\n<p>Robert first came into contact with WordPress in 2014 when he and a friend started a local tech blog. Before that, all he knew was basic, outdated HTML from high school and some knowledge of Adobe Dreamweaver. They decided to use WordPress, and their new blog looked like it came from the future. They used a theme from the repo and got such positive feedback from the blog they decided to open a content and media publishing agency.</p>\n\n\n\n<p>While they got a few web redesign jobs thanks to the exposure the blog brought, they lacked the administrative and business skills needed and ended up going their separate ways. Then in his first real job after college Robert finally took it upon himself to learn the ins and outs of WordPress. He learned how to install WordPress on a server and did some research on customizing themes. </p>\n\n\n\n<p>With that knowledge alone he got his first web design clients and started earning nearly as much as he did at his job. Robert soon realized that free WordPress themes would only take him so far, especially with his limited code skills.</p>\n\n\n\n<p>Because in Malawi only people who travel abroad have access to credit cards, paying for premium themes was impossible. Like many WordPress designers in developing countries, Robert turned to using pirated themes instead. He knew that was both unsafe and unethical, and decided to learn how to code. Knowing how to build themes from scratch would surely help him rise above the competition. </p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img src=\"https://i1.wp.com/wordpress.org/news/files/2020/01/20180905_1971270886435744_8835917058488139776_n.jpg?fit=632%2C632&ssl=1\" alt=\"\" class=\"wp-image-8304\" srcset=\"https://i1.wp.com/wordpress.org/news/files/2020/01/20180905_1971270886435744_8835917058488139776_n.jpg?w=1080&ssl=1 1080w, https://i1.wp.com/wordpress.org/news/files/2020/01/20180905_1971270886435744_8835917058488139776_n.jpg?resize=300%2C300&ssl=1 300w, https://i1.wp.com/wordpress.org/news/files/2020/01/20180905_1971270886435744_8835917058488139776_n.jpg?resize=1024%2C1024&ssl=1 1024w, https://i1.wp.com/wordpress.org/news/files/2020/01/20180905_1971270886435744_8835917058488139776_n.jpg?resize=150%2C150&ssl=1 150w, https://i1.wp.com/wordpress.org/news/files/2020/01/20180905_1971270886435744_8835917058488139776_n.jpg?resize=768%2C768&ssl=1 768w\" sizes=\"(max-width: 632px) 100vw, 632px\" /></figure>\n\n\n\n<h3><strong>The WordPress community from Robert’s perspective</strong></h3>\n\n\n\n<p>Robert doesn’t have a lot of interaction with the WordPress community. Although he would search for solutions from blogs about WordPress he had never actually talked to or asked anyone from the community for a solution. </p>\n\n\n\n<p>Robert believes that this isolation is the result of a glass ceiling — the WordPress community is partially online and partially in-person, but there isn’t a local group in Malawi. And because Malawi, like many other developing nations, lacks a way to pay online many can’t access premium support, online learning, or most other types of professional development. No matter how welcoming the people of WordPress might be, it can still feel like it mostly belongs to those with enough privilege to conduct business on the internet.</p>\n\n\n\n<h3><strong>WordPress & inclusion</strong></h3>\n\n\n\n<p>As most freelancers know, it’s really hard to learn while you also still need to earn. Add pitching to clients and shipping graphic design projects… there are only so many hours in a day.</p>\n\n\n\n<p>Robert didn’t have a programming background and had always been more of a creative person. In order to grow as a web designer/developer, he needed to learn PHP. Again, without access to a credit card, that was complicated. Also, free coding training wasn’t as widely available as it is now.</p>\n\n\n\n<p>Robert wishes that more developers would consider alternative ways for users who cannot pay for courses, themes, or plugins (whether that’s because of available infrastructure or otherwise). He wishes that WordPress tutors and developers would open up ways to accommodate aspiring learners in developing countries who cannot access plugins, courses, and themes, to be able to give back and to participate at another level.</p>\n\n\n\n<p>WordPress has allowed him to build an income he would have no other way of earning and it makes a huge difference. He believes sharing stories like his will hopefully make WordPress products and services become more universally available. In addition, he hopes that more aspiring, self-taught developers will find courage in reaching out to connect with others out there.</p>\n\n\n\n<h2><strong>Contributors</strong></h2>\n\n\n\n<p>Alison Rothwell (<a href=\'https://profiles.wordpress.org/wpfiddlybits/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>wpfiddlybits</a>), Yvette Sonneveld (<a href=\'https://profiles.wordpress.org/yvettesonneveld/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>yvettesonneveld</a>), Josepha Haden (<a href=\'https://profiles.wordpress.org/chanthaboune/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>chanthaboune</a>), Siobhan Cunningham (<a href=\'https://profiles.wordpress.org/siobhanseija/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>siobhanseija</a>), Topher DeRosia (<a href=\'https://profiles.wordpress.org/topher1kenobe/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>topher1kenobe</a>)</p>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-large\"><img src=\"https://i1.wp.com/wordpress.org/news/files/2019/07/heropress_large_white_logo.jpg?resize=632%2C474&ssl=1\" alt=\"\" class=\"wp-image-7025\" srcset=\"https://i1.wp.com/wordpress.org/news/files/2019/07/heropress_large_white_logo.jpg?w=1024&ssl=1 1024w, https://i1.wp.com/wordpress.org/news/files/2019/07/heropress_large_white_logo.jpg?resize=300%2C225&ssl=1 300w, https://i1.wp.com/wordpress.org/news/files/2019/07/heropress_large_white_logo.jpg?resize=768%2C576&ssl=1 768w\" sizes=\"(max-width: 632px) 100vw, 632px\" data-recalc-dims=\"1\" /></figure>\n</div>\n\n\n\n<div class=\"wp-block-column\" style=\"flex-basis:66.66%\">\n<p> <em>This post is based on an article originally published on HeroPress.com, a community initiative created by <a href=\"https://profiles.wordpress.org/topher1kenobe/\">Topher DeRosia</a>. HeroPress highlights people in the WordPress community who have overcome barriers and whose stories would otherwise go unheard.</em> </p>\n</div>\n</div>\n\n\n\n<p> <em>Meet more WordPress community members over at </em><a href=\"https://heropress.com/\"><em>HeroPress.com</em></a><em>!</em> </p>\n\n\n\n<p><br></p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:36:\"http://wellformedweb.org/CommentAPI/\";a:1:{s:10:\"commentRss\";a:1:{i:0;a:5:{s:4:\"data\";s:76:\"https://wordpress.org/news/2020/01/people-of-wordpress-robert-cheleuka/feed/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:38:\"http://purl.org/rss/1.0/modules/slash/\";a:1:{s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"10\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"8300\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:42:\"WordPress Leaders Nominated for CMX Awards\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:78:\"https://wordpress.org/news/2020/01/wordpress-leaders-nominated-for-cmx-awards/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 15 Jan 2020 21:42:12 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:6:\"Awards\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:9:\"Community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8288\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:366:\"Two members of the WordPress leadership team were nominated for excellent work in their field in the first ever Community Industry Awards. Andrea Middleton is nominated for Executive Leader of a Community Team and Josepha Haden Chomphosy is nominated for Community Professional of the Year. CMX is one of the largest professional organizations dedicated to […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Francesca Marano\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:4014:\"\n<p>Two members of the WordPress leadership team were nominated for excellent work in their field in the first ever Community Industry Awards. <a href=\"https://profiles.wordpress.org/andreamiddleton/\">Andrea Middleton</a> is nominated for <a href=\"https://cmxhub.com/awards-executive\">Executive Leader of a Community Team</a> and <a href=\"https://profiles.wordpress.org/chanthaboune/\">Josepha Haden Chomphosy</a> is nominated for <a href=\"https://cmxhub.com/awards-professional\">Community Professional of the Year</a>.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img src=\"https://i0.wp.com/wordpress.org/news/files/2020/01/josepha_and_andrea.jpg?fit=632%2C281&ssl=1\" alt=\"\" class=\"wp-image-8292\" srcset=\"https://i0.wp.com/wordpress.org/news/files/2020/01/josepha_and_andrea.jpg?w=2412&ssl=1 2412w, https://i0.wp.com/wordpress.org/news/files/2020/01/josepha_and_andrea.jpg?resize=300%2C133&ssl=1 300w, https://i0.wp.com/wordpress.org/news/files/2020/01/josepha_and_andrea.jpg?resize=1024%2C455&ssl=1 1024w, https://i0.wp.com/wordpress.org/news/files/2020/01/josepha_and_andrea.jpg?resize=768%2C341&ssl=1 768w, https://i0.wp.com/wordpress.org/news/files/2020/01/josepha_and_andrea.jpg?resize=1536%2C683&ssl=1 1536w, https://i0.wp.com/wordpress.org/news/files/2020/01/josepha_and_andrea.jpg?resize=2048%2C910&ssl=1 2048w, https://i0.wp.com/wordpress.org/news/files/2020/01/josepha_and_andrea.jpg?w=1264&ssl=1 1264w, https://i0.wp.com/wordpress.org/news/files/2020/01/josepha_and_andrea.jpg?w=1896&ssl=1 1896w\" sizes=\"(max-width: 632px) 100vw, 632px\" /></figure>\n\n\n\n<p><a href=\"https://cmxhub.com/\">CMX</a> is one of the largest professional organizations dedicated to community builders. The awards were open to public nomination, and finalists were chosen by panels of their peers in the CMX community.</p>\n\n\n\n<p>Andrea has been a vital community strategist for the WordPress project since 2011. Her work to build and support a vibrant community has played a part in the success around the popular open source CMS. Her work is sponsored by Automattic, where she leads a team that focuses on educational efforts, funding, and in-person community-driven events that serve a global base.</p>\n\n\n\n<p>Josepha has been the Executive Director of the WordPress project since 2019. Her work to coordinate and guide volunteer efforts spans 20 teams and involves thousands of volunteers. Her work is also sponsored by Automattic, where she leads the open source division that focuses on all aspects of open source contribution including design, development, volunteer engagement, and the health of the overall WordPress ecosystem.</p>\n\n\n\n<h2>Votes are Open</h2>\n\n\n\n<p>Final recipients are chosen with open voting — if you feel like either Andrea or Josepha have had an impact on your careers, your trajectory in the WordPress project, or the health of WordPress as a whole, there are three ways you can show your support:</p>\n\n\n\n<ul><li>Stop by and vote for them (Andrea <a href=\"https://href.li/?https://cmxhub.com/awards-executive\">here</a>, Josepha <a href=\"https://href.li/?https://cmxhub.com/awards-professional\">here</a>)!</li><li>Share this post with your own communities!</li><li>Tweet some inspirational thoughts about your time/experience/learnings with WordPress (using #WordPress, naturally)!</li></ul>\n\n\n\n<h2>Thank You Notes</h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>A lot of care and passion goes into making the WordPress Project as fantastic as it is. I think these awards are a reflection of how wonderful the community and ecosystem are, and I appreciate everyone’s continued trust in my stewardship!</p><cite>Josepha Haden Chomphosy</cite></blockquote>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>WordPress community organizers are some of the most generous and creative people in the world — working with them is exciting and interesting every day. I’m humbled by this nomination; thank you!</p><cite>Andrea Middleton</cite></blockquote>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"8288\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}s:27:\"http://www.w3.org/2005/Atom\";a:1:{s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:4:\"href\";s:32:\"https://wordpress.org/news/feed/\";s:3:\"rel\";s:4:\"self\";s:4:\"type\";s:19:\"application/rss+xml\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:44:\"http://purl.org/rss/1.0/modules/syndication/\";a:2:{s:12:\"updatePeriod\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"\n hourly \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:15:\"updateFrequency\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"\n 1 \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:4:\"site\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"14607090\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}}}}}}s:4:\"type\";i:128;s:7:\"headers\";O:42:\"Requests_Utility_CaseInsensitiveDictionary\":1:{s:7:\"\0*\0data\";a:9:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Tue, 03 Mar 2020 16:23:27 GMT\";s:12:\"content-type\";s:34:\"application/rss+xml; charset=UTF-8\";s:25:\"strict-transport-security\";s:11:\"max-age=360\";s:6:\"x-olaf\";s:3:\"⛄\";s:13:\"last-modified\";s:29:\"Mon, 02 Mar 2020 10:27:41 GMT\";s:4:\"link\";s:63:\"<https://wordpress.org/news/wp-json/>; rel=\"https://api.w.org/\"\";s:15:\"x-frame-options\";s:10:\"SAMEORIGIN\";s:4:\"x-nc\";s:9:\"HIT ord 2\";}}s:5:\"build\";s:14:\"20130911040210\";}','no'),
|
252 |
+
(128,'_transient_timeout_feed_mod_9bbd59226dc36b9b26cd43f15694c5c3','1583295808','no'),
|
253 |
+
(129,'_transient_feed_mod_9bbd59226dc36b9b26cd43f15694c5c3','1583252608','no'),
|
254 |
+
(130,'_transient_timeout_feed_d117b5738fbd35bd8c0391cda1f2b5d9','1583295809','no'),
|
255 |
+
(131,'_transient_feed_d117b5738fbd35bd8c0391cda1f2b5d9','a:4:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n\n\n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:61:\"\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"WordPress Planet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"http://planet.wordpress.org/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"en\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:47:\"WordPress Planet - http://planet.wordpress.org/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"item\";a:50:{i:0;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"WPTavern: The International WordPress Community and WordCamps Amid COVID-19\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97595\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:195:\"https://wptavern.com/the-international-wordpress-community-and-wordcamps-amid-covid-19?utm_source=rss&utm_medium=rss&utm_campaign=the-international-wordpress-community-and-wordcamps-amid-covid-19\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6927:\"<p class=\"has-drop-cap\">With the rising numbers of people who have contracted COVID-19, a disease caused by SARS-CoV-2 (severe acute respiratory syndrome coronavirus 2), it is time for the WordPress community to begin evaluating what the remainder of 2020 may look like. It is not a time for panic. However, some serious discussions will need to happen and decisions made on an ongoing basis.</p>\n\n\n\n<p>Last month, WordCamp Asia made the tough decision to <a href=\"https://wptavern.com/wordcamp-asia-2020-canceled-over-covid-19-concerns\">cancel its inaugural event</a> in Bangkok, Thailand. Given the spread of the coronavirus strain in the East Asian region and many unknowns at that point, it was a safe decision to protect our international community.</p>\n\n\n\n<p><a href=\"https://www.wordfence.com/blog/2020/02/wordcamp-asia-cancellation-fee-assistance-package-from-wordfence/\">Wordfence spearheaded the effort</a> to aid people with financial losses due to WordCamp Asia’s late cancellation. The company covered $10,000 of lost funds for attendees. Yoast and GoDaddy are equally splitting costs beyond the initial $10,000 through the same WordCamp Asia Cancellation Fund. To date, 117 applications have been verified and approved for a total of $19,860. There are still eight pending applications for an additional $1,409.</p>\n\n\n\n<p>Mark Maunder, CEO of Defiant (the company behind Wordfence), seemed proud of how the community came together to make this happen. He said that people acted with integrity during the process and many often made sure to only ask for smaller amounts of money to cover their lost expenses.</p>\n\n\n\n<p>Yesterday, Maunder authored a detailed post titled <a href=\"https://www.wordfence.com/blog/2020/03/covid-19-and-wordpress-community-engagement-in-2020/\">COVID-19 and WordPress Community Engagement in 2020</a>. In it, he announced that his team would not be traveling globally to WordCamps until COVID-19 has run its course. He also urges organizers to cancel WordCamp Europe this summer, to cancel WordCamps globally for the time being, and for WordCamp US to be put on hold. Instead, the community can focus on doing remote events and providing an example to the world in how we can organize and collaborate online. By taking a proactive approach and dealing with the issue sooner rather than later, it can save organizers headaches down the road and save attendees money by canceling early.</p>\n\n\n\n<p>“It is my experience that people react to bad situations too slowly,” wrote Maunder. “Whether it is a choking victim, a storm or a national emergency, there is the awkward pause that happens as life-as-usual transforms into a realization of reality requiring fast action. Often, that reality only sets in after the event.”</p>\n\n\n\n<p>Maunder said he desired to take a data-driven approach to determine whether camps and conferences should cancel. It is not about raising panic or unnecessary alarm. He wants people to make sure they think about how we deal with this as a community and not in terms of our potential health risks as individuals. A healthy 30-year-old is at low risk of mortality, for example. However, that same healthy adult can transfer the virus to the elderly and immune-compromised people who are at higher risks. Bringing together large groups who are traveling internationally may help spread the virus because it de-localizes the problem. This is particularly true for larger WordCamps that have a global list of attendees.</p>\n\n\n\n<h2>Current WordCamp Updates and Cancellations</h2>\n\n\n\n<p class=\"has-drop-cap\">WordCamp Europe organizers announced earlier today that the annual event will continue as planned. The conference will take place on June 4-6 in Porto, Portugal. The team said they were in contact with the national health authority, DGS, in Portugal. They are monitoring the situation. Currently, there is at least one confirmed case of COVID-19 in Portugal, but the government has not shut down its borders. Those planning to attend WordCamp Europe should keep an eye on the camp’s <a href=\"https://2020.europe.wordcamp.org/coronavirus-update/\">Coronavirus Updates page</a>. Plans could change.</p>\n\n\n\n<p>Smaller, more regional WordCamps will want to keep a careful eye on what is going on locally. This means following local news sources and staying informed by local government officials.</p>\n\n\n\n<p>WordCamp Geneva organizers have <a href=\"https://2020.geneve.wordcamp.org/wordcamp-geneve-reporte/\">postponed their event</a>, which was set for March 21. At the moment, they are planning to set it back about six months, pending an improvement in the COVID-19 situation. Otherwise, they will make the decision to cancel the event completely for the year. The announcement came after the Swiss government banned large-scale events with over 1,000 people. The organizers worried that such a ban would eventually extend to smaller events.</p>\n\n\n\n<p>The WordCamp Retreat, held annually in Soltau, Germany, <a href=\"https://2020-soltau.retreat.wordcamp.org/2020/02/29/verschiebung-des-wordcamp-retreat-postponing-of-wordcamp-retreat\">has also been canceled for 2020</a>. The event was scheduled to run from April 30 through May 3. The organizers plan to revive the retreat in May 2021. Organizers said because of the unusual format in comparison to a normal WordCamp, the costs of waiting until later before deciding to cancel would have been financially irresponsible. The format of the retreat has higher costs associated with how it is run. February 29 was the last day to make a decision to cancel while breaking even financially.</p>\n\n\n\n<h2>Staying Informed</h2>\n\n\n\n<p class=\"has-drop-cap\">Aside from WordCamps, agencies and other companies with a physical location should prepare for having their employees do their work remotely. This means setting up channels for communication, if they are already not in place, for continuing their work efficiently. While we should all hope for the best outcome, preparedness is key for when things go awry.</p>\n\n\n\n<p>The most important thing for the global WordPress community to do right now is to continue communicating and sharing data from official sources. Organizers, employers, and travelers will sometimes have to make tough calls. Safety is always more important than whether we can network in person. </p>\n\n\n\n<p>The following are links to resources from the World Health Organization. Everyone should also keep track of national, state, and other local resources.</p>\n\n\n\n<ul><li><a href=\"https://www.who.int/emergencies/diseases/novel-coronavirus-2019\">WHO: COVID-19 Updates</a></li><li><a href=\"https://www.who.int/news-room/q-a-detail/q-a-coronaviruses\">WHO: Q&A on Coronaviruses (COVID-19)</a></li><li><a href=\"https://www.who.int/emergencies/diseases/novel-coronavirus-2019/travel-advice\">WHO: Travel Advice</a></li></ul>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 02 Mar 2020 21:27:04 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:57:\"WordPress.org blog: The Month in WordPress: February 2020\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8393\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:72:\"https://wordpress.org/news/2020/03/the-month-in-wordpress-february-2020/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:9165:\"<p>February 2020 was a busy month in the WordPress project! Most notably, there was an outpouring of sentiment in response to the unfortunate cancellation of WordCamp Asia. However, the team continues to work hard in the hopes of making WordCamp Asia 2021 happen. In addition, there were a number of releases and some exciting new news during the month of February. Read on for more information!</p>\n\n\n\n<hr class=\"wp-block-separator\" />\n\n\n\n<h2>WordCamp Asia 2020 Cancelled & Pop-up Livestream</h2>\n\n\n\n<p>There was a ton of excitement around WordCamp Asia, not to mention all the effort from organizers, speakers, sponsors and volunteers. Unfortunately, on February 12th, <a href=\"https://wordpress.org/news/2020/02/wordcamp-asia-cancelled-due-to-covid-19/\">WordCamp Asia was cancelled</a> due to concern and uncertainty around COVID-19. Since then, the organizing team has worked to <a href=\"https://2020.asia.wordcamp.org/2020/02/12/cancellation/\">refund tickets and to support hotel and air refunds</a>. In addition, a <a href=\"https://wordpress.org/news/2020/02/pop-up-livestream-on-february-22/\">pop-up livestream</a> featuring some WordCamp Asia speakers and a Fireside Chat and Q&A with Matt Mullenweg took place on February 22nd.</p>\n\n\n\n<p>For a personal take on the cancellation of WordCamp Asia, read <a href=\"https://naoko.blog/2020/02/13/wordcamp-asia-2020-recap/\">this post from Naoko Takano</a>, the global lead organizer. Many thanks to the volunteers who worked hard to deliver WordCamp Asia. They’ve not only handled logistics associated with cancellation but have also announced that they’ve started <a href=\"https://2020.asia.wordcamp.org/2020/02/18/wordcamp-asia-2021/\">working on WordCamp Asia 2021</a> with some January dates in mind! To get the latest on WordCamp Asia, subscribe to updates <a href=\"https://2021.asia.wordcamp.org/\">here</a>. </p>\n\n\n\n<h2>WordPress 5.4 Beta is Now Available</h2>\n\n\n\n<p><a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\">WordPress 5.4 Beta 1</a> was released on February 11 and quickly followed by <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-2/\">Beta 2</a> on February 18 and <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-3/\">Beta 3</a> on February 25. These two releases get us closer to our primary goal for 2020: full-site editing with blocks. WordPress 5.4 will merge ten releases of the Gutenberg plugin and is scheduled to be released on March 31, 2020. It will come with many new features, such as two new blocks for social links and buttons, and easier navigation in the block breadcrumbs. There are also a number of accessibility improvements, such as easier multi-block selection and easier tabbing, one of the editor’s biggest accessibility issues. <a href=\"https://make.wordpress.org/core/tag/5-4/\">5.4 will also include</a> many developer-focused changes, such as improved favicon handling and many new hooks and filters.</p>\n\n\n\n<p>Want to get involved in building WordPress? There are a number of ways to help right now! If you speak a language other than English, <a href=\"https://translate.wordpress.org/projects/wp/dev/\">help us translate WordPress</a>. Found a bug? Post it to the<a href=\"https://wordpress.org/support/forum/alphabeta/\"> Alpha/Beta area</a> in the support forums. You can also help us test the current beta by installing <a href=\"https://wordpress.org/plugins/wordpress-beta-tester/\">the WordPress Beta Tester plugin</a>. Just remember that the software is still in development, so we recommend against running it on a production site. </p>\n\n\n\n<h2>WordCamp Centroamérica is Looking for Speakers and Sponsors!</h2>\n\n\n\n<p><a href=\"https://2020.centroamerica.wordcamp.org/\">WordCamp Centroamérica</a> is the first regional WordCamp for Central America and will be held on September 17-19, 2020, in Managua, Nicaragua. The <a href=\"https://2020.centroamerica.wordcamp.org/2020/01/28/llamado-a-ponentes-call-for-speakers/#more-5\">Call for Speakers</a> and <a href=\"https://2020.centroamerica.wordcamp.org/2020/01/16/call-for-sponsors/\">Call for Sponsors</a> are now open, so if you’re interested in speaking at or sponsoring WordCamp Centroamérica, now is your chance! To learn more about the eent, visit and subscribe to updates on their <a href=\"https://2020.centroamerica.wordcamp.org/\">website</a>, or follow their <a href=\"https://www.facebook.com/WordCampCA\">Facebook</a>, <a href=\"https://twitter.com/WordCampCA\">Twitter</a>, and <a href=\"https://instagram.com/wccentroamerica\">Instagram</a> accounts. </p>\n\n\n\n<p>Want to get involved in the Community team and help make more amazing WordCamps happen? <a href=\"https://make.wordpress.org/community/\">Follow the blog</a> and join the #community-events channel in <a href=\"https://make.wordpress.org/chat/\">the Making WordPress Slack group</a>! You can also find out about other <a href=\"https://central.wordcamp.org/\">upcoming WordCamps here</a>.</p>\n\n\n\n<h2>Contribute to WordPress Core via GitHub</h2>\n\n\n\n<p>An experimental feature has been added to Trac to help improve collaboration between Trac and GitHub. This feature allows contributors to link GitHub pull requests opened against the official <a href=\"https://github.com/wordpress/wordpress-develop\">WordPress Develop Git mirror</a> to tickets, which will make GitHub contributions more visible in the related Trac ticket. To learn all the details and to see how it works, read <a href=\"https://make.wordpress.org/core/2020/02/21/working-on-trac-tickets-using-github-pull-requests/\">this post</a>.</p>\n\n\n\n<h2>Gutenberg Development Continues</h2>\n\n\n\n<p>There are many new exciting additions to Gutenberg! On February 5, <a href=\"https://make.wordpress.org/core/2020/02/05/whats-new-in-gutenberg-5-february/\">Gutenberg 7.4 saw two new features added</a>, including background color support to the Columns block and text color support for the Group block. Many enhancements were made, including a number of improvements to the Navigation Block.</p>\n\n\n\n<p>Gutenberg 7.5 was released on February 12, <a href=\"https://make.wordpress.org/core/2020/02/26/whats-new-in-gutenberg-26-february/\">with 7.6 following</a> on February 27. They introduced even more features, including the Social Links block as a stable block and a number of additional blocks for full-site editing, not to mention the many enhancements, new APIs, bug fixes, documentation, and updates.</p>\n\n\n\n<p>Want to get involved in building Gutenberg? Follow <a href=\"https://make.wordpress.org/core/\">the Core team blog</a>, contribute to <a href=\"https://github.com/WordPress/gutenberg/\">Gutenberg on GitHub</a>, and join the #core-editor channel in <a href=\"https://make.wordpress.org/chat/\">the Making WordPress Slack group</a>.</p>\n\n\n\n<hr class=\"wp-block-separator\" />\n\n\n\n<h2>Further Reading:</h2>\n\n\n\n<ul><li>Aside from WordCamp Asia, two other WordCamps have been postponed due to COVID-19: <a href=\"https://2020-soltau.retreat.wordcamp.org/2020/02/29/verschiebung-des-wordcamp-retreat-postponing-of-wordcamp-retreat/\">WordCamp Retreat Soltau</a> and <a href=\"https://2020.geneve.wordcamp.org/wordcamp-geneve-reporte/\">WordCamp Genève</a>. News about further postponements or cancellations will be posted on <a href=\"https://central.wordcamp.org/news/\">the WordCamp Central blog</a>.</li><li>Automatic updates for themes and plugins <a href=\"https://make.wordpress.org/core/2020/02/26/feature-plugin-wp-auto-updates/\">are being planned</a> for inclusion in WordPress 5.5.</li><li>Version 2.2.1 of the WordPress Coding Standards has been released.</li><li>The Community Team <a href=\"https://make.wordpress.org/community/2020/02/06/community-team-reps-for-2020-2/\">has selected new team representatives</a> for 2020.</li><li>The Core team <a href=\"https://make.wordpress.org/core/2020/02/09/what-does-it-mean-to-be-a-component-maintainer-a-refresher/\">published a useful refresher</a> on what it means to be a component maintainer, along with some tips and best practices.</li><li><a href=\"https://make.wordpress.org/support/2020/02/changes-to-the-support-guidelines-for-linking-to-off-site-resources/\">The Support Team has announced</a> some amendments to their guidelines for linking to external resources when using the support forums.</li><li>The WordPress Foundation <a href=\"https://wordpressfoundation.org/2020/wordpress-foundation-donates-to-black-girls-code-and-internet-archive/\">has published financial information</a> regarding their charitable donations from 2019.</li><li>The Core XML Sitemaps project kicked off with <a href=\"https://make.wordpress.org/core/2020/02/24/xml-sitemaps-meeting-february-25th-2020/\">their first meeting</a> this month.</li><li>The Gutenberg team have created <a href=\"https://make.wordpress.org/core/2020/02/28/new-wordpress-create-block-package-for-block-scaffolding/\">a new @wordpress/create-block package</a> for scaffolding new blocks.</li></ul>\n\n\n\n<p><em>Have a story that we should include in the next “Month in WordPress” post? Please </em><a href=\"https://make.wordpress.org/community/month-in-wordpress-submissions/\"><em>submit it here</em></a><em>.</em></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 02 Mar 2020 09:15:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Hugh Lashbrooke\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:91:\"WPTavern: Elementor Raises $15 Million, Plans to Invest in the Team, Product, and Community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97541\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:219:\"https://wptavern.com/elementor-raises-15-million-plans-to-invest-in-the-team-product-and-community?utm_source=rss&utm_medium=rss&utm_campaign=elementor-raises-15-million-plans-to-invest-in-the-team-product-and-community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5203:\"<img />\n\n\n\n<p class=\"has-drop-cap\">Elementor, which has quickly become one of the leading <a href=\"https://wordpress.org/plugins/elementor/\">WordPress page builders</a> and companies, announced Wednesday it <a href=\"https://elementor.com/blog/elementor-funding/\">raised $15 million in its first round of funding</a>, led by <a href=\"https://lsvp.com/\">Lightspeed Venture Partners</a>. The investment round comes on the heels of the plugin surpassing four million active installations.</p>\n\n\n\n<p>Founded in 2016, Yoni Luksenberg and Ariel Klikstein wanted to create a platform for web creators to drag and drop elements on a page to quickly build sites to their specifications. It took two years for the plugin to gather its first million users. Since then, the user base has continued to rapidly grow, adding an extra million users at an average rate of six months. </p>\n\n\n\n<p>In the past 12 months, the plugin has deployed over 300 new features. It is also currently translated into 55 languages, an effort driven by its massive community.</p>\n\n\n\n<p>“Elementor’s growth is a wonderful example of the power of community and open-source software,” said Tal Morgenstern, Partner at Lightspeed. “The founders set out to solve their own problems as web professionals and ended up with a global, highly-involved fan base that kept pushing and shaping the product from the very onset. Every single metric we looked at indicated an exceptionally strong market fit and we’re extremely happy to partner with this team for the next chapter of their journey.”</p>\n\n\n\n<p>The next question is how the Elementor team will utilize this funding to grow their platform.</p>\n\n\n\n<h2>Growing the Elementor Team and Platform</h2>\n\n\n\n<img />\n\n\n\n<p class=\"has-drop-cap\">Elementor currently has 130 employees, called “Elementorists,” who are spread across 16 countries. The company plans to use some of its funding to grow its team by 50%. It may not be long before they are pushing the 200-employee mark.</p>\n\n\n\n<p>The company will also use the funding to push the expansion of its global community. The team already has 500 meetups planned around the world in 2020.</p>\n\n\n\n<p>“We plan to utilize the funding to improve all aspects of the product and community,” said Luksenberg. “That means further strengthening the infrastructure of our platform, developing more innovative features, investing in more community-enhancing efforts like WordCamp sponsorships and meetups, and building more integrations with WordPress and with other plugins. Basically, this allows us to continue with all the efforts already in progress but at a faster pace and at a larger scale.”</p>\n\n\n\n<p>The Elementor team is set to push out new features and products at a much faster pace than before with the funding in place. Luksenberg was tight-lipped on the details. “We don’t want to ruin the surprise by revealing the features too soon,” he said. However, he promises that the company plans to set new web design and marketing standards while reducing “friction points” for web creators using Elementor.</p>\n\n\n\n<p>One major question is where Elementor stands in terms of the block editor (Gutenberg). In one sense, they are competitors. However, the team also created the <a href=\"https://wordpress.org/plugins/block-builder/\">Elementor Blocks for Gutenberg</a> plugin. While it only has 8,000 active installs, a drop in the bucket in comparison to their primary plugin, Luksenberg said the team has received positive feedback from users.</p>\n\n\n\n<p>“We are constantly testing out new integrations with the goal of improving compatibility with Gutenberg,” said Luksenberg. “We believe in democratizing the editor so different WordPress users and different personas will have their editor of choice. This way, they can pick the editor that best fits their unique needs and preferences. This is the beauty of open source. There are endless ways to build a contact form: Contact Form 7, Gravity Forms, Jetpack Forms. Similarly, there are endless ways to build and design a web page. The users should have the option to choose their preferred method.”</p>\n\n\n\n<p>Despite a couple of rumors floating around, the team has no plans to build a platform that is independent of core WordPress. The team’s work will be deeply entrenched into WordPress.</p>\n\n\n\n<p>However, they are currently considering offering a SaaS (Software as a Service) solution around the Elementor platform. It is unclear what such a SaaS product will look like if it happens, but it could be a natural evolution of their business growth. It will certainly be interesting to keep an eye on and see where they take it. “As a growing company, now with funding, it’s important to keep our options open,” said Luksenberg.</p>\n\n\n\n<p>Luksenberg hopes to see other companies in the WordPress ecosystem complete similar funding rounds and feels honored for his company to be in a position to lead the way. “It’s one small step for Elementor, one giant leap for the WordPress community,” he said.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 28 Feb 2020 19:31:40 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"WPTavern: Gutenberg 7.6 Includes Rotating Tips List and New Full-Site Editing Blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97195\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:213:\"https://wptavern.com/gutenberg-7-6-includes-rotating-tips-list-and-new-full-site-editing-blocks?utm_source=rss&utm_medium=rss&utm_campaign=gutenberg-7-6-includes-rotating-tips-list-and-new-full-site-editing-blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4530:\"<p>Yesterday, the Gutenberg team <a href=\"https://make.wordpress.org/core/2020/02/26/whats-new-in-gutenberg-26-february/\">released version 7.6 of the plugin</a>. Most of the work in this update went toward the upcoming full-site editing feature. The team continues to pump out new dynamic, placeholder blocks for post data. The biggest user-facing feature was the addition of a rotating list of tips in the block inserter.</p>\n\n\n\n<p><a href=\"https://make.wordpress.org/core/2020/02/12/whats-new-in-gutenberg-12-february/\">Version 7.5</a>, released two weeks ago, was the last major release of the plugin that will have features to land in WordPress 5.4, which is currently scheduled for release on March 31. However, bug fixes from 7.6 were ported to the most recent WordPress 5.4 beta updates.</p>\n\n\n\n<p>Version 7.6 does not include as many major feature additions as earlier releases. Aside from experimental work on full-site editing, it primarily includes bug fixes.</p>\n\n\n\n<p>The announcement post boasts a considerable speed improvement in loading time and keypress events. In comparison to version 7.5, loading time was reduced to 7.7 seconds from 8.5 seconds and keypress event speed was reduced to 48.59 milliseconds from 55.45 milliseconds. These tests are run against a post of approximately 36,000 words and 1,000 blocks.</p>\n\n\n\n<h2>Rotating Tips In Block Inserter</h2>\n\n\n\n<img />Block inserter tip section now rotates messages.\n\n\n\n<p>In the past, the block inserter had a single tip at the bottom right that read, “While writing, you can press <code>/</code> to quickly insert new blocks.” It was a useful tip, but it was easy to ignore because it never changed. After seeing the same message a couple dozen times, it had become little better than wasted space.</p>\n\n\n\n<p>Version 7.6 creates a <a href=\"https://github.com/WordPress/gutenberg/pull/20163\">rotating list of tips</a>. Each time a user opens the inserter, a new tip appears. At the moment, the list only contains five messages but more are sure to come in the future.</p>\n\n\n\n<p>There are open tickets to add contextual <a href=\"https://github.com/WordPress/gutenberg/issues/20196\">tips based on block search queries</a> and <a href=\"https://github.com/WordPress/gutenberg/issues/17091\">block-specific tips</a>. Both of those tickets could continue to help users learn the block system and provide a path for block creators to teach users how to use custom blocks.</p>\n\n\n\n<p>Currently, the list of tips is static. However, it may be possible for plugin authors to extend it in the future. I’m already contemplating writing a plugin to replace the tips with quotes from Joss Whedon’s <em>Firefly</em>.</p>\n\n\n\n<h2>Full Steam Ahead with Full-Site Editing</h2>\n\n\n\n<img />Growing list of post data blocks for full-site editing.\n\n\n\n<p>Gutenberg 7.6 added four new dynamic, placeholder blocks related to post data: featured image, tags, comments count, and comments form. This brings the total to around 12 blocks for full-site editing, which is still a few dozen short of where the platform will need to be before the feature is ready. Most work thus far has gone toward building out blocks that handle post data. Eventually, the team will need to expand to other areas that will need block representation on the front end.</p>\n\n\n\n<p>Theme authors looking to test out full-site editing should make sure to check out the <a href=\"https://github.com/WordPress/theme-experiments\">block-based theme experiments</a> repository, which continues to see regular updates.</p>\n\n\n\n<p>Users can now <a href=\"https://github.com/WordPress/gutenberg/pull/20361\">set the heading level</a> of the site title block. It can also be set to a paragraph. However, it does not include all of the design settings, such as text size or colors, that would come with a regular paragraph block. This is a good first step in recognizing the various ways the site title block will be used, but it will need to evolve into a much more robust block to allow users to do all the things they will eventually want to do with the site title.</p>\n\n\n\n<p>At this point, it is hard to gauge what full-site editing will look like. Everything is experimental. It only covers the most basic use cases. I am still cautious about its potential. On the other hand, I am ready to skip ahead a year and see how it all turns out. Every plugin update brings us a step closer, but it is tough waiting to see what the bigger picture looks like as it comes together.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 27 Feb 2020 21:48:35 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"WPTavern: Automatic Theme and Plugin Updates Slated for WordPress 5.5\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97498\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:183:\"https://wptavern.com/automatic-theme-and-plugin-updates-slated-for-wordpress-5-5?utm_source=rss&utm_medium=rss&utm_campaign=automatic-theme-and-plugin-updates-slated-for-wordpress-5-5\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3539:\"<img />Automatic updates column on the plugin management screen.\n\n\n\n<p class=\"has-drop-cap\">Today, Jean-Baptiste Audras <a href=\"https://make.wordpress.org/core/2020/02/26/feature-plugin-wp-auto-updates/\">announced the WordPress Auto-updates</a> feature plugin. The project seeks to bring automatic plugin and theme updates to WordPress version 5.5. It was originally slated as a feature project in 2019, but it was later bumped to the <a href=\"https://wptavern.com/progress-on-wordpress-2019-projects-sets-2020-roadmap\">2020 roadmap</a>.</p>\n\n\n\n<p>The <a href=\"https://wordpress.org/plugins/wp-autoupdates/\">WordPress Auto-updates</a> plugin is available for beta testing in the plugin directory. The plugin is currently marked to work with sites running PHP 7.2 or later, which is odd considering it is a feature plugin for core and will need to be compatible with WordPress’ minimum of PHP 5.6.</p>\n\n\n\n<p>The feature feels long overdue. We have been asking for it <a href=\"https://wptavern.com/its-time-for-wordpress-to-automatically-update-themes-plugins-and-core-by-default\">since at least 2015</a> here at the Tavern. Hosting companies and plugins like Jetpack have taken up the load over the years, offering automatic updates for millions of users. However, it is time for the core platform to take the reins and make this a feature available directly to all users. This would also provide a standardized path for third-party plugins to extend the feature with more controls for end-users.</p>\n\n\n\n<p>Work toward bringing the feature into core WordPress originally began in the <a href=\"https://core.trac.wordpress.org/ticket/48850\">plugin auto-updates</a> and <a href=\"https://core.trac.wordpress.org/ticket/49199\">theme auto-updates</a> Trac tickets. The code contributed to those tickets are now in the feature plugin. “WordPress contributors did a lot of work on the two related tickets during WP 5.4 development cycle, but decided to give it more time for testing as it’s an important feature,” wrote Audras in the announcement.</p>\n\n\n\n<p>Development is currently taking place on Audras’s <a href=\"https://github.com/audrasjb/wp-autoupdates\">GitHub repository</a>, but it may be moved to the official WordPress GitHub account.</p>\n\n\n\n<p>One of the primary goals of the project is to create an admin UI, which would give users the ability to manage how automatic updates work. Users will be able to enable or disable auto-updates on a plugin-by-plugin and theme-by-theme basis. This level of fine-grain control is welcome. While I generally prefer to auto-update everything, I have been burned by specific plugins and themes in the past. For those, I often prefer to update within a test environment first to be on the safe side. Undoubtedly, other users may find themselves in a similar situation. It is nice to see this being taken into account as a goal of the project.</p>\n\n\n\n<p>The project plans to set up email notifications for site administrators that will summarize any auto-updates that happen on the site. There will also be hooks and PHP constants to allow plugin developers to take control of the update settings.</p>\n\n\n\n<p>As usual, most of the completed work on the automatic updates roadmap has gone toward plugins. Just once, it would be nice to see a feature that crosses into both theme and plugin territory be completed for themes first. I only hope that themes do not end up taking a backseat due to time constraints, development hurdles, or anything else.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 26 Feb 2020 21:11:55 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:112:\"Post Status: WooCommerce Payments offers a more unified eCommerce experience, better feature parity with Shopify\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"https://poststatus.com/?p=77183\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:44:\"https://poststatus.com/woocommerce-payments/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2812:\"<p><a href=\"https://woocommerce.com/payments/\">WooCommerce Payments</a> is now available to select merchants who apply to the program. It\'s a big step for WooCommerce toward establishing stronger SaaS-like feature parity with Shopify.</p>\n\n\n\n<p>Built using <a href=\"https://stripe.com/\">Stripe\'s</a> best-in-class merchant tools, WooCommerce Payments will immediately offer broad payment support for the vast majority of WooCommerce users.</p>\n\n\n\n<p>Deposits, transactions, refunds, and disputes can all be managed directly through the WordPress dashboard. Store owners will not require a Stripe account, but a dedicated WooCommerce Payments account is required. It offers the same general fee structure as Stripe: 2.9% + $0.30 per US-based transaction.</p>\n\n\n\n<p>Automattic\'s General Manager of WooCommerce, Paul Maiorana, told Post Status that the payout schedule for merchants is on a rolling two-day basis.</p>\n\n\n\n<p>Most of the features in WooCommerce Payments will be familiar to existing Stripe users. The big benefit here is for WordPress users who have made the decision to use WooCommerce and are most comfortable managing as much of their business as they can directly through WooCommerce accounts and their WordPress dashboard — thereby eliminating the need to manage yet another account via a merchant processor.</p>\n\n\n\n<p>WooCommerce Payments also offers a nice revenue stream for a percentage of all platform sales to Automattic from all merchants who decide to use it.</p>\n\n\n\n<p>Shopify has had in-house payments for years, and it\'s been wildly successful. This is a no-brainer and a smart move by Automattic to establish better feature parity with the popular SaaS platform.</p>\n\n\n\n<p>We should expect WooCommerce to establish many more methods for connecting stores to services via WooCommerce itself, helping to create a more unified experience for store owners that\'s simpler to set up.</p>\n\n\n\n<p>The big difference between WooCommerce and Shopify will continue to be freedom and choices. With WooCommerce, store owners are always able to use all of the fully self-hosted, self-managed software they need for their business, and independent merchant services (among others) will always be an option too. There is significantly less lock-in when using WooCommerce, which Automattic can and should lean on as a feature for folks seeking greater autonomy for their online business.</p>\n\n\n\n<p>We look forward to offering more information and analysis around Automattic\'s WooCommerce strategy in the coming days for Post Status club members when we interview Paul more formally. Meanwhile, <a href=\"https://poststatus.slack.com/archives/CHNM7Q7T8/p1582725139143200\">he\'s answering some questions in chat for members</a>. <a href=\"https://poststatus.slack.com/archives/CHNM7Q7T8\">Join us</a>!</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 26 Feb 2020 14:44:55 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Brian Krogsgard\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"WordPress.org blog: WordPress 5.4 Beta 3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8384\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-3/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2827:\"<p>WordPress 5.4 Beta 3 is now available!</p>\n\n\n\n<p><strong>This software is still in development,</strong> so we don’t recommend you run it on a production site. Consider setting up a test site to play with the new version.</p>\n\n\n\n<p>You can test the WordPress 5.4 beta in two ways:</p>\n\n\n\n<ul><li>Try the <a href=\"https://wordpress.org/plugins/wordpress-beta-tester/\">WordPress Beta Tester</a> plugin (choose “bleeding edge nightlies” or “Beta/RC – Bleeding edge” option in version 2.2.0 or later of the plugin) * you must already have updated to your site to “bleeding edge nightlies” for the “Beta/RC – Bleeding edge” option to be available</li><li>Or <a href=\"https://wordpress.org/wordpress-5.4-beta3.zip\">download the beta here</a> (zip). </li></ul>\n\n\n\n<p>WordPress 5.4 is slated for release on <a href=\"https://make.wordpress.org/core/5-4/\">March 31st, 2020</a>, and we need your help to get there.</p>\n\n\n\n<p>Thanks to the testing and feedback from everyone who tested <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-2/\">beta 2</a> (and <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\">beta 1</a>) over <a href=\"https://core.trac.wordpress.org/query?status=closed&changetime=02%2F18%2F2020..02%2F25%2F2020&milestone=5.4&col=id&col=summary&col=status&col=milestone&col=owner&col=type&col=priority&order=priority\">24 tickets have been closed</a> in the past week. </p>\n\n\n\n<h2>Some highlights </h2>\n\n\n\n<ul><li><a href=\"https://github.com/WordPress/gutenberg/pull/20424\">Round-up of Gutenberg fixes</a></li><li><a href=\"https://core.trac.wordpress.org/ticket/47606\">Display Site Health score on Dashboard</a></li></ul>\n\n\n\n<h2>Developer notes</h2>\n\n\n\n<p>WordPress 5.4 has lots of refinements to polish the developer experience. To keep up, subscribe to the <a href=\"https://make.wordpress.org/core/\">Make WordPress Core blog</a> and pay special attention to the <a href=\"https://make.wordpress.org/core/tag/5-4+dev-notes/\">developer notes</a> tag for updates on those and other changes that could affect your products.</p>\n\n\n\n<h2>How to Help</h2>\n\n\n\n<p>Do you speak a language other than English? <a href=\"https://translate.wordpress.org/projects/wp/dev/\">Help us translate WordPress into more than 100 languages</a>!</p>\n\n\n\n<p>If you think you’ve found a bug, you can post to the <a href=\"https://wordpress.org/support/forum/alphabeta/\">Alpha/Beta area</a> in the support forums. We’d love to hear from you! If you’re comfortable writing a reproducible bug report, <a href=\"https://core.trac.wordpress.org/newticket\">file one on WordPress Trac</a> where you can also find a list of <a href=\"https://core.trac.wordpress.org/tickets/major\">known bugs</a>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 25 Feb 2020 22:10:50 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"David Baumwald\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:57:\"WPTavern: After the Acquisition: Flywheel in the New Year\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97226\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:157:\"https://wptavern.com/after-the-acquisition-flywheel-in-the-new-year?utm_source=rss&utm_medium=rss&utm_campaign=after-the-acquisition-flywheel-in-the-new-year\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7580:\"<p>Some WordPress developers and agencies were caught off guard when WP Engine <a href=\"https://wptavern.com/wp-engine-acquires-flywheel\">announced it had acquired Flywheel</a> in June last year. Flywheel had quickly become a trusted web hosting company for many that specifically catered to the needs of developers and agencies. For some, they questioned whether such a buyout would change the company culture and whether the good things about Flywheel’s services would be swallowed by WP Engine’s offerings.</p>\n\n\n\n<p>The move had also come only a month after Flywheel closed its $15 per month Tiny plan. There was some initial confusion that the two events were linked.</p>\n\n\n\n<p>“With any acquisition of this scale, there is going to be an initial wave of confusion, skepticism, and a bit of shock,” said Dusty Davidson, CEO and co-founder. “People had come to know, love, and trust Flywheel, and when it was announced that two well-known WordPress companies (and former competitors) were joining forces, they weren’t sure where we would stand as a company.”</p>\n\n\n\n<p>Davidson said the company fielded more questions that were concerned about the future than outright pushback against the move. Most such questions centered on whether Flywheel would continue offering their existing services and tools.</p>\n\n\n\n<p>“It’s now been six months since one of the largest acquisitions in WordPress history, and we’re happy to report that things remain ‘business as usual,\'” said Davidson. “We’ve remained true to our word, and Flywheel is continuing to live out our mission to help creatives do their best work. The community may have been skeptical about how this acquisition was going to pan out, but the fact is that nothing has really changed and our products have only improved!”</p>\n\n\n\n<p>How Flywheel would be folded into WP Engine was not clear early on. The two companies approached the change by learning from each other and gathering feedback. “We announced that we were acquired back in June, and it took about six months to figure out the logistics of the acquisition and the relationships between both companies,” said Davidson.</p>\n\n\n\n<p>After working out the details, it was decided that Flywheel would operate as a separate division within WP Engine with its own services.</p>\n\n\n\n<h2>Bringing the Tiny Plan Back</h2>\n\n\n\n<p>Some users <a href=\"https://wptavern.com/wp-engine-acquires-flywheel#comment-296007\">expressed disppointment</a> with the removal of the Tiny plan last year. It was an affordable tier for small sites at $15 per month.</p>\n\n\n\n<p>The plan change was the first time Flywheel had changed pricing in the company’s history. “The changes to plans back in May 2019 were made to allow us to continue investing more into the future of our platform, existing and future features, and to offer up more solutions to better fit our customers,” said Davidson.</p>\n\n\n\n<p>Based on customer feedback, Flywheel began to see that Tiny was a valuable plan for agencies who needed to offer a managed WordPress hosting solution for smaller clients. “When we joined forces with WP Engine, we were able to realign our goals as a business and refocus our efforts on the audience we’ve always catered to best: freelancers and small agencies,” said Davidson.</p>\n\n\n\n<h2>SOC Type 2 Certification</h2>\n\n\n\n<p>Earlier this month, Flywheel <a href=\"https://getflywheel.com/news/flywheel-managed-wordpress-host-completes-soc-2-compliance-and-certification/\">announced it had completed SOC 2 compliance and certification</a> as part of their long-term plan in building a more robust and trusted company.</p>\n\n\n\n<p>“Businesses using cloud service providers use SOC 2 reports to assess and address the risks associated with third-party technology services,” said Tommy Vacek, VP of Engineering. “When you boil it down though, it essentially means that Flywheel’s security practices are the best in the industry, and we’re one of the only WordPress hosts that has achieved it.”</p>\n\n\n\n<p>“It’s a sign of maturity on almost all areas of our business, from finance to information technology, and it also allows us to assess risk in our business and make decisions based off of it,” he said. “It’s a stamp of approval to demonstrate Flywheel’s intentionality around security.”</p>\n\n\n\n<h2>The 2020 Roadmap and Beyond</h2>\n\n\n\n<p>Rick Knudtson, CPO and co-founder, feels like the acquisition will allow the Flywheel team to better cater to creative agencies in the WordPress space. “Our product team is working on an exciting update to our offering entirely focused on supporting the growth of agencies, and our marketing team is hard at work creating brand new resources for agencies aspiring to make 2020 a great year,” he said. “Joining forces with WP Engine has allowed us to accelerate our product initiatives.”</p>\n\n\n\n<p>The company is now offering a <a href=\"https://getflywheel.com/selling-wordpress-maintenance/\">free course</a> on selling WordPress maintenance to clients. Themes by StudioPress, <a href=\"https://wptavern.com/wp-engine-acquires-studiopress\">acquired by WP Engine in 2018</a>, are all free for Flywheel customers. Flywheel is also working heavily on tools for WordPress developers.</p>\n\n\n\n<p>“Developers drive WordPress forward and WP Engine is committed to supporting the future of WordPress through industry-leading developer tools,” said Knudtson. One such tool is <a href=\"https://localwp.com/\">Local</a>, the company’s local development environment built for working with WordPress. “Since joining the WP Engine family, Local has become the standard local development and deployment tool for our customers across both of our platforms.”</p>\n\n\n\n<p>Local is currently used by over 50,000 developers. The team spent the last few months re-architecting the tool from the ground up. Knudtson said it is now five times faster than before. They are expanding the team that is working on Local to help handled more advanced developer workflows.</p>\n\n\n\n<p>“In 2020, we’ll introduce new ways to use Local so that all developers — novices or advanced, solo or within a team — can build their perfect development on top of Local,” said Knudtson. “Whether you just want to connect to your host and deploy, or you’re integrating into your existing CI/CD workflow, Local should be the solution.”</p>\n\n\n\n<p>The Local turnkey products, such as <a href=\"https://localwp.com/pro/\">Local Pro</a> and <a href=\"https://localwp.com/teams/\">Local Teams</a>, will be available to developers across both platforms in the future.</p>\n\n\n\n<p>Since the acquisition, Flywheel has included a new technology called <a href=\"https://getflywheel.com/layout/product-updates/smart-refresh/\">Smart Refresh</a> as part of their in-house caching engine. The system watches for updates made to a WordPress install and clears the cache when needed. Knudtson claims the updates to their system has increased backend performance on the platform by 50%.</p>\n\n\n\n<p>The company also recently announced its new <a href=\"https://getflywheel.com/layout/product-updates/keep-your-sites-flying-with-performance-insights/\">Performance Insights</a> feature. The tool provides proprietary performance data for developers to make decisions with sites they control.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 25 Feb 2020 19:55:17 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:92:\"Post Status: Elementor has raised a $15 million Series A, led by Lightspeed Venture Partners\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"https://poststatus.com/?p=77019\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:101:\"https://poststatus.com/elementor-has-raised-a-15-million-series-a-led-by-lightspeed-venture-partners/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2869:\"<p><a href=\"https://elementor.com/\">Elementor</a> has seen explosive growth in their WordPress-based page building application since its release in May 2016, now boasting more than 4 million installs of the <a href=\"https://wordpress.org/plugins/elementor/\">free version of the plugin</a>.</p>\n\n\n\n<p>The paid version of Elementor was introduced in November 2016, with a common freemium upgrade model. The Elementor community has taken off, furthering the product\'s growth and loyalty among freelancers, DIYers, and site wranglers.</p>\n\n\n\n<p>In such a crowded space as WordPress page building plugins, and especially considering core WordPress efforts via Gutenberg, Elementor\'s meteoric rise is an incredible accomplishment.</p>\n\n\n\n<p>Others have taken notice. In their Series A fundraising event, <a href=\"https://lsvp.com/\">Lightspeed Venture Partners</a> is leading a $15 million round. Elementor has been working on raising money since at least the second quarter of 2019, so this news is a long time coming.</p>\n\n\n\n<p><em><strong>Edit</strong>: Envato was rumored to be investing as well. I\'ve confirmed with Envato that while they are working closely with Elementor on some projects, they are not an investor in this round.</em></p>\n\n\n\n<p>Elementor has an opportunity to do a lot of interesting stuff with these funds — inside the WordPress experience, and I suspect independent of WordPress as well.</p>\n\n\n\n<p>I expect to see a fully hosted version of Elementor\'s site building capabilities where WordPress is (at least partially) hidden from the view of the user. They are currently <a href=\"https://careers.elementor.com/explore/co/rd/9C.41B/devops-engineer/all/\">hiring for</a> their “Cloud team” which is tasked with “building, maintaining, and supporting the company ‘Cloud Hosting SaaS Solution\'.”</p>\n\n\n\n<p>What has made Elementor stand out thus far is its relative intuitiveness and the establishment of a very loyal following — mostly lured in with extremely attractive pricing of the “Pro” product ($49 per site, or only $199 for unlimited sites), and a very generously featured free tier.</p>\n\n\n\n<p>Not many WordPress-centric companies have raised money. I\'m very interested to see where Elementor chooses to take the product from here. They certainly have both the momentum and the backing to do something big.</p>\n\n\n\n<p>With a team based in Israel, Elementor has more than 100 employees now working on the product and support. This raise will surely enable them to extend their runway while maintaining an attractive price point for the paid product and assist in the development of their next major release.</p>\n\n\n\n<p><em>Post Status was not included in the embargoed list of news sources to report this story. We became aware of the news through our own means and decided to report on it now.</em></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 25 Feb 2020 14:53:10 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Brian Krogsgard\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"WPTavern: On MAGA Caps and WordCamps\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97442\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:117:\"https://wptavern.com/on-maga-caps-and-wordcamps?utm_source=rss&utm_medium=rss&utm_campaign=on-maga-caps-and-wordcamps\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7583:\"<p class=\"has-drop-cap\">Within WordPress circles, I don’t talk much about politics. I was raised to believe that politics and religion are not polite dinner topics. That belief generally extends to my work-life too. However, sometimes these topics crash into one another at full speed.</p>\n\n\n\n<p>I don’t typically provide qualifying statements about my beliefs when writing an article. My words should stand on their own, regardless of my personal views. However, in this toxic political climate in the U.S. that sometimes worms its way into the WordPress community, alternative views are often automatically dismissed if the writer is not considered <em>one of their own</em>. If I wrote a piece that defended conservatism without self-describing myself as a liberal, my words would fall on many deaf ears. Such is the climate that we live in today.</p>\n\n\n\n<p>Therefore, without further ado, I proclaim myself as one of you.</p>\n\n\n\n<h2>WordCamps and Political/Hate Speech</h2>\n\n\n\n<p class=\"has-drop-cap\">In <a href=\"https://daily.jorb.in/2020/02/symbols-of-hate-at-wordcamps/\">Symbols of Hate at WordCamps</a>, Aaron Jorbin makes the argument that red MAGA (Make America Great Again) hats should be banned from WordCamps because they are symbols of racism. While one-sided and starting from the position that such apparel is hate speech regardless of context, it is a thought-provoking piece. It is also the sort of statement that will earn you internet points from what is seemingly a majority, Left-leaning inner WordPress community. But, there are unanswered questions and another side to this story that Jorbin failed to explore in his article.</p>\n\n\n\n<p>Jorbin opened with a large image. The image has a simple word as a <em>faux</em> HTML tag: <code></hate></code>. Before the argument begins, this imagery lets the readers know that there is no discussion. In HTML, the <code>/</code> character is meant to close a statement. The opening salvo is the end of the discussion. The text is merely a formality.</p>\n\n\n\n<p><strong>MAGA caps are hate speech.</strong></p>\n\n\n\n<p>There is no context in which a MAGA cap is acceptable. The reader should know this because the argument was won before it was given.</p>\n\n\n\n<p>“I fully cosign,” said Adam Soucie, the co-lead organizer for WordCamp 2020, <a href=\"https://twitter.com/AdamSoucie/status/1230923434122764294\">on Twitter</a>. “Show up to @WordCampOrlando in one of those red hats and you’ll be politely asked to leave. You know exactly what you’re doing with that choice. If you have a problem with that, take it up with Central.”</p>\n\n\n\n<p>The message is clear that certain people are not welcome. More often than not, that message is squarely aimed at conservatives. This type of groupthink is prevalent within the WordPress community. <em>Your political beliefs are not welcome.</em></p>\n\n\n\n<p>In his article, Jorbin does describe how political speech, the MAGA cap, has been co-opted by various hate groups. The question is whether we allow the actions of the minority of one group to become the deciding factor in how we treat the majority. We must also ask whether we hold other political speech to the same standard.</p>\n\n\n\n<p>Conservatives within our community often feel like they have no voice. The article and the subsequent discussions taking place on social media help drive home that feeling.</p>\n\n\n\n<p>“Today is a hard day to be a Republican in the WordPress Community,” wrote Bridget Willard <a href=\"https://twitter.com/YouTooCanBeGuru/status/1231122059159162880\">on Twitter</a>. “I see the tweets. And the moral superiority. It isn’t kind or inclusive.”</p>\n\n\n\n<p>She is not alone. Like her, many feel like they will be ostracized if they post a dissenting opinion that does not 100% jive with the Left-leaning vocal majority.</p>\n\n\n\n<p>“A MAGA hat makes me angry and uncomfortable, but speech is speech unless there’s a direct incitement,” responded Steve Stern <a href=\"https://twitter.com/sds52/status/1230916355668529152\">on Twitter</a>. “Do we ban all political content from all WP events? Is a T-shirt supporting a leftist cause OK? WordPress needs to support freedom, even when uncomfortable.”</p>\n\n\n\n<p>It is a slippery slope from banning a MAGA cap to stifling more mundane conservative speech, particularly when conservative voices are within the minority in our community. If the MAGA cap is hate speech, it cannot be a stretch to label anything about the man who gave rise to some extremist voices as falling under the same guideline.</p>\n\n\n\n<p>Let us say, for the sake of argument, that the red MAGA cap is deemed hate speech, regardless of who is wearing it, their intentions, and context. Outright ban it. Does such a ban extend to a “Trump 2020” T-shirt? In the mind of many who would ban the MAGA hat, I can guarantee they would like to see the ban extended to any Trump or even conservative-related apparel. Others may not be willing to go that far. However, for many, a ban on such apparel has absolutely nothing to do with hate speech. It has to do with a difference of opinion. Political opinion. Instead of meeting on equal terms and discussing those differences as open-minded adults, it is easier to quash an opponent’s freedom of expression by labeling it all as hate.</p>\n\n\n\n<p>If a red MAGA cap is always hate speech, it is not a leap to say that any Trump-supporting apparel is also hate speech. There has to be a line, and the one between a baseball cap and a T-shirt sporting “Trump 2020” is blurry.</p>\n\n\n\n<p>Perhaps the solution is to ban all political apparel at WordCamps, regardless of whose politics are on showcase. If some cannot stomach a MAGA cap, a life-long hunter should not have to look at a “meat is murder” T-shirt. We should also ban the countless other slogans that itch some group or another the wrong way.</p>\n\n\n\n<p>Or, we can all put on our big boy and girl pants and step out into the world as adults who might be presented with ideas outside our own from time to time.</p>\n\n\n\n<p>WordPress’s mission statement is to <em>democratize publishing</em>. The goal is not to democratize publishing <em>for some</em> or <em>for those who share our political views</em>. The implication is that we are democratizing publishing <strong>for all</strong>. By extension, WordCamps are about bringing people together from all walks of life. We don’t all share the same views, but we should respect that others believe differently. The idea is to break bread with those who are different from you and perhaps grow from this interaction.</p>\n\n\n\n<p>Then, imagine yourself in my shoes. I live in rural Alabama. This is Trump Country. If I got angry every time I came across the path of someone wearing a MAGA cap, I would spend most of my days in a fit of rage. Some of my more liberal friends ask how I live <em>among them</em>, jokingly. Truth be told, it is pretty easy once you start looking at people as people. Once you stop making assumptions about them by the clothes they wear or the political views they hold. Once you sit down and listen to their hopes and dreams and fears.</p>\n\n\n\n<p>At WordCamps, the best thing would be for everyone to leave their politics at the door. If we need a rule to formalize it, then so be it. We all have so much more in common that we likely realize. Let’s focus on the good that we can do together.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 24 Feb 2020 21:14:46 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:10;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:42:\"WPTavern: Goodbye Featured Themes, For Now\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97396\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:127:\"https://wptavern.com/goodbye-featured-themes-for-now?utm_source=rss&utm_medium=rss&utm_campaign=goodbye-featured-themes-for-now\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4943:\"<img />Front page of the theme directory, featuring popular themes.\n\n\n\n<p class=\"has-drop-cap\">Yesterday, the <a href=\"https://meta.trac.wordpress.org/ticket/5044\">featured themes page was quietly removed</a> from the <a href=\"https://wordpress.org/themes\">WordPress theme directory</a>. Previously, it was the primary page users would see when visiting the directory. It has now been replaced with the popular themes list. This change is only reflected on the WordPress.org website and not directly in the WordPress admin for end-users.</p>\n\n\n\n<p>This is the first major change with the featured list since it was switched to a randomized set of themes in 2014. Over the past six years, volunteers have presented numerous ideas on what to do with the page that is, in many ways, the face of WordPress, particularly for new users who are searching for their first theme. No proposal has gone beyond a Trac ticket with a handful of participants or a theme review team meeting. It is almost as if every idea was dead on arrival.</p>\n\n\n\n<p>Removing the featured list altogether is not a simple matter of hiding the page on WordPress.org. There is an API endpoint that serves the list and core WordPress fetches themes directly from WordPress.org. Even if removed from the software, we would still be dealing with years of backward compatibility for older versions of WordPress. At this point, outright removal is not an ideal solution.</p>\n\n\n\n<p>The <a href=\"https://meta.trac.wordpress.org/changeset/9522\">commit note</a> makes a point that hiding the page from the theme directory is only temporary. The idea is to eventually replace it with a properly-curated featured themes list. </p>\n\n\n\n<p>However, such a proposal could languish for years. Given that we have suffered through six years of a randomly-generated list, it is unclear if anyone is motivated enough to push the project forward.</p>\n\n\n\n<h2>What Happened to the Curated Featured Themes List?</h2>\n\n\n\n<p>In October, the WordPress theme review team <a href=\"https://wptavern.com/curated-list-of-featured-themes-coming-to-the-theme-directory\">decided to create a system</a> for a curated feature themes list. <a href=\"https://make.wordpress.org/themes/2019/10/22/meeting-notes-for-tuesday-22nd-october-2019/\">The initial plan</a> was for the team representatives to work out the finer details and create a path forward. However, the idea seemed to fizzle out before it ever broke ground. There was little public mention of it after the excitement of the initial decision.</p>\n\n\n\n<p>“It was really hard to come up with requirements that we wanted the themes to follow,” said Carolina Nymark, a TRT representative. “Like the keyboard navigation and skip link had to be added to the theme, and no upsell. That alone limited the possible themes to a selection that was too small.”</p>\n\n\n\n<p>The idea for curated themes was that they would be the best of the best. Seemingly, that meant going above and beyond the standard requirements while being completely free of commercial interests. In hindsight, that level of scrutiny over the list may have been too tough of a sell. Curation does not necessarily have to strive for perfection. Uniqueness may provide more room for flexibility.</p>\n\n\n\n<p>“We did not hold any meetings with votes because there were concerns that people would only root for their own theme, their friends’ themes, or even get paid to suggest themes,” said Nymark. “It would be too easy to game it for profit.” Such backdoor schemes have been trouble with previous programs in the team’s past.</p>\n\n\n\n<p>The curated list based on their criteria would be too small to rotate regularly on the featured page. The team attempted to find other solutions. However, they were unsuccessful.</p>\n\n\n\n<p>“It was a strain that we could not figure out a good solution where theme authors would be treated fairly,” said Nymark. “Then we had a video meeting with [Josepha Haden, Executive Director of WordPress] where she said that the TRT team representatives should not have to select the featured themes. And it stopped there.”</p>\n\n\n\n<p>Ari Stathopoulos, a TRT representative, mentioned the elephant in the room that the team was not addressing. “There would be significant drama if the list was manually curated,” he said. “If it’s done by reps, then those who were not selected would accuse reps of favoring some themes. If it was done by a rotating committee, the same. Authors would rather believe that they are a victim of some conspiracy rather than believe their theme is bad.”</p>\n\n\n\n<p>A curated themes list is still a possibility. It is unlikely the theme review team will be handling it directly anytime soon. If it does happen, it will likely be another party who makes the call and gets to be the <em>bad guy</em>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 21 Feb 2020 18:45:39 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:11;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:25:\"Matt: Livestream Tomorrow\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:22:\"https://ma.tt/?p=50924\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:42:\"https://ma.tt/2020/02/livestream-tomorrow/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:662:\"<p>About eight of the speakers including myself <a href=\"https://livestream.w.org/\">are going to be doing a livestream tomorrow from 2 to 10 UTC, or what would be 9am to 5pm in Bangkok</a> where the inaugural WordCamp Asia was <a href=\"https://wordpress.org/news/2020/02/wordcamp-asia-cancelled-due-to-covid-19/\">supposed to happen</a> this weekend.</p>\n\n\n\n<p>We’d all much rather be in person, but I do think there is a silver lining in us learning how to do official WordPress livestream events that can be accessible to everyone all over the world, following in the footsteps awesome virtual events like <a href=\"https://wordsesh.com/\">WordSesh</a>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 21 Feb 2020 01:37:22 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:12;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:52:\"WordPress.org blog: Pop-Up Livestream on February 22\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8377\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"https://wordpress.org/news/2020/02/pop-up-livestream-on-february-22/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2217:\"<p>As mentioned <a href=\"https://wordpress.org/news/2020/02/wordcamp-asia-cancelled-due-to-covid-19/\">in this post</a>, Matt will host a <a href=\"https://livestream.w.org/\">livestream on February 22</a> during Bangkok daylight hours. He opened an invitation to any speaker who was affected by the cancellation, and the livestream will include the following fine people: <a href=\"https://profiles.wordpress.org/gsayed786/\">Imran Sayed</a>, <a href=\"https://profiles.wordpress.org/saiftheboss7/\">Md Saif Hassan</a>, <a href=\"https://profiles.wordpress.org/mmuhsin/\">Muhammad Muhsin</a>, <a href=\"https://profiles.wordpress.org/niravmehta/\">Nirav Mehta</a>, <a href=\"https://profiles.wordpress.org/piccianeri/\">Piccia Neri</a>, <a href=\"https://profiles.wordpress.org/itpixelz/\">Umar Draz</a>, and <a href=\"https://profiles.wordpress.org/francina/\">Francesca Marano</a> as well as a Fireside Chat and Q&A<strong> </strong>with <a href=\"https://profiles.wordpress.org/matt/\">Matt Mullenweg</a> & <a href=\"https://www.linkedin.com/in/monishavaradan/\">Monisha Varadan</a>.</p>\n\n\n\n<div class=\"wp-block-buttons aligncenter\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-background has-vivid-cyan-blue-background-color\" href=\"https://livestream.w.org/\" target=\"_blank\" rel=\"https://livestream.w.org/ noopener noreferrer\">Join the stream</a></div>\n</div>\n\n\n\n<p>This should be a great way to get to hear from some speakers who have yet to share their knowledge on a global stage. WordPress is enriched by a multitude of experiences and perspectives, and I hope you are as excited as I am to hear new voices from a part of the world that is frequently underrepresented in the WordPress open source project. </p>\n\n\n\n<p>Also exciting, <a href=\"https://2020.asia.wordcamp.org/2020/02/18/wordcamp-asia-2021/\">the WordCamp Asia team has announced that they’re aiming for January 2021</a>, so please mark your calendars now! This small but mighty team of trailblazing organizers has shown great resilience over the years they’ve spent, building toward this event. I am personally grateful for the hard work they’ve done and have yet to do, and can’t wait to thank them in Bangkok next year.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 20 Feb 2020 23:06:13 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:7:\"Josepha\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:13;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:26:\"WPTavern: Publishing Break\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97350\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:97:\"https://wptavern.com/publishing-break?utm_source=rss&utm_medium=rss&utm_campaign=publishing-break\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:1404:\"<p>The Tavern is taking a break for the week as both of its authors are out. We’re happy about expanding families, and saying “boo” to the flu.</p>\n\n\n\n<p>In the meantime, here are some of my favorite WordPress-powered sites that I follow and learn from:</p>\n\n\n\n<ul><li><a href=\"https://tim.blog/\">Tim Ferriss is back to blogging and it’s great</a>.</li><li><a href=\"https://seths.blog/\">Seth Godin never stopped blogging and stays great</a>.</li><li><a href=\"https://fs.blog/\">Farnam Street always expands my mind</a>. (Three nice .blog domains in a row!)</li><li><a href=\"https://heropress.com/\">HeroPress gives me energy to work through the hard problems in WordPress</a>.</li><li><a href=\"https://nav.al/\">Naval is thoughtful and provocative</a>.</li><li><a href=\"https://avc.com/\">Fred Wilson is one of the most successful early-stage investors, and still takes the time to blog almost every day</a>.</li><li><a href=\"https://laughingsquid.com/\">Laughing Squid collects the weirdest and most interesting stuff on the internet</a>.</li><li><a href=\"https://onbeing.org/\">Krista Tippett’s On Being expands your soul</a>.</li></ul>\n\n\n\n<p>Finally, <a href=\"https://om.co/2020/01/16/podcast-interviewing-matt-mullenweg/\">the podcast I did with Om a few weeks ago covers some fun early internet trivia</a>. We’ll be back to regularly scheduled programming next week!</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 20 Feb 2020 01:28:07 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matt Mullenweg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:14;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"WordPress.org blog: WordPress 5.4 Beta 2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8360\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-2/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3351:\"<p>WordPress 5.4 Beta 2 is now available!</p>\n\n\n\n<p><strong>This software is still in development,</strong> so we don’t recommend running it on a production site. Consider setting up a test site to play with the new version.</p>\n\n\n\n<p>You can test WordPress 5.4 beta 2 in two ways:</p>\n\n\n\n<ul><li>Try the <a href=\"https://wordpress.org/plugins/wordpress-beta-tester/\">WordPress Beta Tester</a> plugin (choose the “bleeding edge nightlies” option)</li><li>Or <a href=\"https://wordpress.org/wordpress-5.4-beta2.zip\">download the beta here</a> (zip).</li></ul>\n\n\n\n<p>WordPress 5.4 is slated for release on <a href=\"https://make.wordpress.org/core/5-4/\">March 31, 2020</a>, and <strong>we need your help to get there</strong>!</p>\n\n\n\n<p>Thank you to all of the contributors that tested the <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\">beta 1</a> development release and provided feedback. Testing for bugs is an important part of polishing each release and a great way to contribute to WordPress.</p>\n\n\n\n<h2>Some highlights</h2>\n\n\n\n<p>Since <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\">beta 1</a>, <a href=\"https://core.trac.wordpress.org/query?status=closed&changetime=02%2F12%2F2020..&milestone=5.4&group=component&col=id&col=summary&col=owner&col=type&col=priority&col=component&col=version&order=priority\">27 bugs</a> have been fixed. Here is a summary of a few changes included in beta 2:</p>\n\n\n\n<ul><li>Block editor: Columns in the Block Library that have unassigned-width will now grow equally.</li><li>Block editor: The custom gradient picker now works in languages other than English.</li><li>Block editor: When choosing colors is not possible, the color formatter no longer shows.</li><li>Privacy: The privacy request form fields have been adjusted to be more consistent on mobile.</li><li>Privacy: The notice offering help when editing the privacy policy page will no longer show at the top of All Pages in the admin area.</li><li>Site Health: The error codes for failed REST API tests now display correctly.</li></ul>\n\n\n\n<h2>Developer notes</h2>\n\n\n\n<p>WordPress 5.4 has lots of refinements to polish the developer experience. To keep up, subscribe to the <a href=\"https://make.wordpress.org/core/\">Make WordPress Core blog</a> and pay special attention to the <a href=\"https://make.wordpress.org/core/tag/5-4+dev-notes/\">developers’ notes</a> for updates on those and other changes that could affect your products.</p>\n\n\n\n<h2>How to Help</h2>\n\n\n\n<p>Do you speak a language other than English? <a href=\"https://translate.wordpress.org/projects/wp/dev/\">Help us translate WordPress into more than 100 languages</a>!</p>\n\n\n\n<p>If you think you’ve found a bug, you can post to the <a href=\"https://wordpress.org/support/forum/alphabeta/\">Alpha/Beta area</a> in the support forums. We’d love to hear from you! </p>\n\n\n\n<p>If you’re comfortable writing a reproducible bug report, <a href=\"https://core.trac.wordpress.org/newticket\">file one on WordPress Trac</a>, where you can also find a list of <a href=\"https://core.trac.wordpress.org/tickets/major\">known bugs</a>.</p>\n\n\n\n<p><em>UPDATE – 20 Feb, 2020: This post was originally misattributed to Francesca Marano. The proper authorship has been corrected.</em></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 18 Feb 2020 21:50:41 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"David Baumwald\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:15;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:52:\"WordPress.org blog: People of WordPress: Kori Ashton\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8348\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"https://wordpress.org/news/2020/02/people-of-wordpress-kori-ashton/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:9806:\"<p><em>You’ve probably heard that WordPress is open-source software, and may know that it’s created and run by volunteers. WordPress enthusiasts share many examples of how WordPress changed people’s lives for the better. This monthly series shares some of those lesser-known, amazing stories.</em></p>\n\n\n\n<h2><strong>The beginning</strong></h2>\n\n\n\n<img src=\"https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton.jpg?w=632&ssl=1\" alt=\"\" class=\"wp-image-8349\" />Kori Ashton\n\n\n\n<p>In 1998, Kori created her very first HTML website. Her dad was creating websites for a living at the time. She needed a website for her band because she wanted to be a rockstar. Under his training, and with a little bit of self-teaching, she learned how to build a website.</p>\n\n\n\n<p>She had been aware of WordPress since 2005, and, in 2008 a client specifically hired her as a freelancer to develop a WordPress website. Kori went straight to Google and taught herself how to build a WordPress website over a single weekend. She really enjoyed the experience of working with WordPress.</p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>My mind was absolutely blown when I saw the drag and drop options inside of menus to create dropdowns and a form builder. </em></p><cite>Kori Ashton</cite></blockquote>\n\n\n\n<p>She suggested to her dad that WordPress could be a solution for their customers who wanted to be able to access their own websites. Previously, they had found this was not as easy for clients unless they had specific software and knew how to code. So, Kori and her dad worked to learn WordPress over the next few years. </p>\n\n\n\n<p>Then in 2012, Kori and her parents launched their new business, WebTegrity, in San Antonio, Texas, US. It started out small: just Kori and her parents. Soon, they started subcontracting design work and quickly continued to grow their team.</p>\n\n\n\n<h2><strong>Going big time</strong></h2>\n\n\n\n<p>Even though the business was in a saturated industry in San Antonio — over 700 freelancers and agencies were providing similar services — Kori and her parents were able to sell their company five years later, with a multi-million dollar valuation. There were a few choices they made early on that led to that success.</p>\n\n\n\n<h3><strong>1. They picked a niche: WordPress specialists </strong></h3>\n\n\n\n<p>At the time, there were no WordPress-specific agencies in San Antonio. They emphasized the fact that WordPress was the only CMS their company would use. Prospective clients looking for a different type of CMS solution were not the right fit for their business. They also offered on-site, WordPress training and weekend workshops that were open to anyone (including other agencies) as one of their revenue streams. They soon were established as a city-wide WordPress authority.</p>\n\n\n\n<h3><strong>2. They cultivated a culture</strong></h3>\n\n\n\n<p>Kori wanted a great culture and environment in her company and to make that happen, she needed to hire the right people. She believes you must be careful about who you bring into the culture of your business, but particularly when hiring leaders into that community. You can’t teach passion so you’ve got to find people that are excited about what you do. You also need to look for integrity, creativity, a love for solving problems, and an eagerness to keep getting better. </p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>You can teach code all day long, but be sure to find people with the right hearts to join your community and then train them up the right way. This way you will grow your culture in a healthy way.</em></p><cite>Kori Ashton</cite></blockquote>\n\n\n\n<img src=\"https://i0.wp.com/wordpress.org/news/files/2020/02/kori-ashton-2.png?w=632&ssl=1\" alt=\"\" class=\"wp-image-8350\" />Kori and her two sons\n\n\n\n<h3><strong>3. They learned how to build sustainable revenue streams</strong></h3>\n\n\n\n<p>Like many other web development agencies, WebTegrity started out with the “one-time fee and you’re done” business model. This business model is known for unpredictable revenue streams. Hearing about recurring revenue business models at WordCamp Austin was a lightbulb moment for Kori. She started drafting a more sustainable business model on the way back home. </p>\n\n\n\n<p>Support packages were key to their new business plan. Clients needed ongoing support. They decided to include at least 12 months of post-launch support into their web development projects. This doubled their revenue in one year and allowed them to even out their revenue streams.</p>\n\n\n\n<h3><strong>4. They knew the importance of reputation</strong></h3>\n\n\n\n<p>Kori believes that every client, whether they have a $5,000 or a $50,000 budget, should get the same type of boutique-style, white glove, concierge relationship.</p>\n\n\n\n<p>Every single project results in the absolute best solution for a client’s needs. In addition to that, offering training helped boost their reputation. Explaining the lingo of the web development and SEO fields and showing the processes used, added transparency. It helped set and meet expectations and it built trust. </p>\n\n\n\n<h3><strong>5. They proactively gave back to the community</strong></h3>\n\n\n\n<p>Kori heard Matt Mullenweg speak about <a href=\"https://wordpress.org/five-for-the-future/\">Five For The Future</a> at WordCamp US. He encouraged people in the audience who make a living using WordPress, to find ways to give back 5% of their time to building the WordPress software and community. Matt talked about how firms and individuals could give back to the community. He suggested, for instance to:</p>\n\n\n\n<ul><li>start a WordPress Meetup group</li><li>present at a Meetup event </li><li>facilitate a Meetup group where maybe you’re just the organizer and you never have to speak because you’re not a fan of speaking</li><li>help organize a WordCamp</li><li>volunteer at a WordCamp</li><li>write a tutorial and tell people how to do WordPress related things </li><li>run a workshop</li><li>make a video</li></ul>\n\n\n\n<img src=\"https://i1.wp.com/wordpress.org/news/files/2020/02/kori-ashton-3.jpg?fit=632%2C422&ssl=1\" alt=\"\" class=\"wp-image-8351\" />If you’re making an income using WordPress, consider giving 5% of your time back to building the software and/or the community.\n\n\n\n<p>This gave Kori another light bulb moment. She could make videos to give back. So her way to give back to the WordPress community is her <a href=\"https://www.youtube.com/user/webtegrity\">YouTube channel</a>.</p>\n\n\n\n<p>Every Wednesday, she published a video on how to improve your online marketing. This made a huge impact, both inside the WordPress community, but also in her own business.</p>\n\n\n\n<h2><strong>Understanding</strong></h2>\n\n\n\n<p>So, in summary, how did Kori and her family turn their business into a multi-million dollar buyout in just five years? </p>\n\n\n\n<p>Ultimately, it was about understanding that you have to build value. About keeping an exit strategy in mind while building your business. For instance when naming your company. Will it stand alone? Could it turn into a brand that you could sell as an independent entity?</p>\n\n\n\n<ul><li>Think about revenue streams and watch sales margins.</li><li>Be sure to include healthy margins. </li><li>Don’t hire until you have no further option.</li><li>Make sure to structure your offerings in such a way that you’re actually recouping your value. </li><li>Understand entrepreneurship, watch Shark Tank, read more tutorials, watch more videos.</li><li>Get involved in the WordPress community. Get to know its core leaders, the speakers that travel around to all the WordCamps. Start following them on Twitter and try to understand what they’re sharing. </li></ul>\n\n\n\n<p>In the end, the fact that Kori was so active in the San Antonio community helped enable the sale.</p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>We just kept hammering on the fact that we were the go-to place here in San Antonio for WordPress. We kept training, we kept doing free opportunities, going out and speaking at different events, and people kept seeing us. We kept showing up, kept giving back and kept establishing ourselves as the authority.</em></p><cite>Kori Ashton</cite></blockquote>\n\n\n\n<h2><strong>Contributors</strong></h2>\n\n\n\n<p>Alison Rothwell (<a href=\"https://profiles.wordpress.org/wpfiddlybits/\">@wpfiddlybits</a>), Yvette Sonneveld (<a href=\"https://profiles.wordpress.org/yvettesonneveld/\">@yvettesonneveld</a>), Abha Thakor (<a href=\"https://profiles.wordpress.org/webcommsat/\">@webcommsat</a>), Josepha Haden (<a href=\"https://profiles.wordpress.org/chanthaboune/\">@chanthaboune</a>), Topher DeRosia (<a href=\"https://profiles.wordpress.org/topher1kenobe/\">@topher1kenobe</a>).</p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container\">\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<img src=\"https://i1.wp.com/wordpress.org/news/files/2019/07/heropress_large_white_logo.jpg?resize=632%2C474&ssl=1\" alt=\"\" class=\"wp-image-7025\" />\n</div>\n\n\n\n<div class=\"wp-block-column\">\n<p><em>This post is based on an <a href=\"https://heropress.com/essays/build-company-wordpress/\">article originally published on HeroPress.com</a>, a community initiative created by </em><a href=\"https://profiles.wordpress.org/topher1kenobe/\"><em>Topher DeRosia</em></a><em>. HeroPress highlights people in the WordPress community who have overcome barriers and whose stories would otherwise go unheard.Meet more WordPress community members over at </em><a href=\"https://heropress.com/\"><em>HeroPress.com</em></a><em>!</em></p>\n</div>\n</div>\n</div></div>\n</div></div>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 14 Feb 2020 21:12:53 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Yvette Sonneveld\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:16;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:79:\"WPTavern: WooCommerce Partners With Square to Expand Services for CBD Merchants\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97197\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:203:\"https://wptavern.com/woocommerce-partners-with-square-to-expand-services-for-cbd-merchants?utm_source=rss&utm_medium=rss&utm_campaign=woocommerce-partners-with-square-to-expand-services-for-cbd-merchants\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5047:\"<img />\n\n\n\n<p class=\"has-drop-cap\">WooCommerce, the open-source eCommerce platform developed and supported by Automattic, <a href=\"https://woocommerce.com/sell-cbd-online/\">announced a partnership</a> with Square payment solutions yesterday. The partnership expands services for merchants who are selling CBD products online. While it is a small step toward making it easier to sell CBD products, there are still many restrictions and pitfalls that merchants must overcome.</p>\n\n\n\n<p>Cannabidiol, known as CBD, was removed from the U.S. federal list of controlled substances in December 2018. It is one of 100s of identified cannabinoids in cannabis plants and does not have the psychoactive effects of THC. The Farm Bill (<a href=\"https://www.congress.gov/bill/115th-congress/house-bill/2/text\">Agriculture Improvement Act of 2018</a>) removed some restrictions and provided a regulated path for farmers and merchants to sell CBD-based products.</p>\n\n\n\n<p>CBD exists in a legal gray area in some jurisdictions in the U.S. State and local laws may still ban selling CBD and other substances (<em>for example, I live in Alabama where we have some “dry” counties where selling alcohol is illegal</em>). Therefore, merchants need to be aware that there are legal issues to consider, despite it being legal at the federal level. They should always check their local laws.</p>\n\n\n\n<p>Other hurdles include finding a payment processor, web host, shipping company, and bank that don’t have internal policies that forbid CBD products or at least working within any guidelines they do have. WooCommerce’s partnership with Square may help U.S. merchants at least tackle the payment processor part of the equation.</p>\n\n\n\n<p>“WooCommerce is proud to offer CBD merchants secure, efficient services that enable business owners to focus on improving consumers’ lives,” says Paul Maiorana, General Manager of WooCommerce.</p>\n\n\n\n<p>By using Square, U.S. merchants can also use other Automattic services such as Jetpack for backups and malware scanning, <a href=\"https://woocommerce.com/products/shipping/\">WooCommerce Shipping</a> for printing labels, and <a href=\"https://woocommerce.com/products/tax/\">WooCommerce Tax</a> for automatically calculating sales tax at checkout.</p>\n\n\n\n<p>“Because it’s still a highly-regulated substance, CBD products sold online require adherence to a special set of rules,” wrote Lynn Jatania in a <a href=\"https://woocommerce.com/posts/how-to-sell-cbd-online\">how-to post for WooCommerce merchants</a>. In the post, she describes steps sellers must follow and issues they may encounter.</p>\n\n\n\n<h2>Restrictions on Automattic-Hosted or Connected Stores</h2>\n\n\n\n<p>The version of the WooCommerce software available through WordPress.com or WooCommerce.com forbids the sale of CBD products because it is hosted by Automattic. Merchants must use the WooCommerce plugin from WordPress.org and run their stores on a third-party host that allows selling CBD products.</p>\n\n\n\n<p>The WordPress.com <a href=\"https://en.support.wordpress.com/store-guidelines/\">store guidelines</a> state:</p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>For example, you may not sell (or facilitate the sale of) any of the following in (or through) your store:…Controlled and highly-regulated substances (including alcohol, marijuana, cannabidiol or CBD, and other cannabis-derived products)</p></blockquote>\n\n\n\n<p>Self-hosted WooCommerce stores also have restrictions if they wish to connect their stores to any of Automattic’s services. This became a <a href=\"https://wptavern.com/woocommerce-com-clarifies-its-policy-on-selling-cbd-products\">source of confusion in June 2019</a>, when a self-hosted WooCommerce merchant was informed they could not connect to WordPress.com via Jetpack while selling CBD products. The WooCommerce team updated its guidelines to better clarify what is allowed when using Automattic’s services.</p>\n\n\n\n<p>The policy is nearly the same today. However, the partnership with Square loosens the rules to a degree. Currently, only U.S. stores are allowed to sell CBD products while connected to WordPress.com. They are also required to use Square for payment processing.</p>\n\n\n\n<p>From the <a href=\"https://docs.woocommerce.com/document/woocommerce-cbd/\">WooCommerce Guidelines for CBD and Other Hemp-Derived Products</a>:</p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Square has a vetting process for stores selling CBD and other hemp-derived products, so we currently require Square as the payment provider if you’d like to connect your store to Jetpack, WooCommerce Tax, and WooCommerce Shipping. We may approve additional payment providers in the future.</p></blockquote>\n\n\n\n<p>Using Square is not as simple as signing up. To sell CBD products, merchants must go through an application process to make sure they are selling CBD products with approval. The industry is heavily regulated, so this process may take some time.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 14 Feb 2020 19:38:14 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:17;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:61:\"WPTavern: WordPress 5.4 Beta 1 Ready for Testing and Feedback\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97193\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:167:\"https://wptavern.com/wordpress-5-4-beta-1-ready-for-testing-and-feedback?utm_source=rss&utm_medium=rss&utm_campaign=wordpress-5-4-beta-1-ready-for-testing-and-feedback\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7216:\"<p>Release coordinator Francesca Marano announced the <a href=\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\">release of WordPress 5.4 Beta 1</a> on February 11. Most of the work has centered on the block editor. However, at the moment, contributors have closed another <a href=\"https://core.trac.wordpress.org/query?status=closed&milestone=5.4&group=component&max=500&col=id&col=summary&col=owner&col=type&col=priority&col=component&col=version&order=priority\">258 tickets for the 5.4 milestone</a>.</p>\n\n\n\n<p>A second beta release is scheduled for February 18, according to the <a href=\"https://make.wordpress.org/core/5-4/\">5.4 release schedule</a>, along with follow-up betas and release candidates in the following weeks. The final release of WordPress 5.4 is slated for March 31.</p>\n\n\n\n<p>At this point in the development cycle, WordPress 5.4 is in a feature freeze, which means no new enhancements or feature requests will be considered. Only bug fixes and inline documentation are planned for the remainder of the cycle.</p>\n\n\n\n<p>Developers should follow the <a href=\"https://make.wordpress.org/core/handbook/testing/beta-testing/\">beta testing handbook page</a> to test their plugins and themes. Users who want to try out the upcoming release can do so via the <a href=\"https://wordpress.org/plugins/wordpress-beta-tester/\">WordPress Beta Tester plugin</a>.</p>\n\n\n\n<h2>Block Editor Changes</h2>\n\n\n\n<img />New welcome modal for the block editor.\n\n\n\n<p>WordPress 5.4 will comprise of 10 major releases of the Gutenberg plugin, which is the development project behind the block editor. The oldest update, version 6.6, was released on October 2. The latest update, version 7.5, landed on February 12.</p>\n\n\n\n<p>For end-users who are still using the classic editor, version 5.4 is an opportunity to see if the block editor has improved enough to use. While it may not be ready for everyone, the user experience continues to get better with each release.</p>\n\n\n\n<p>The block editor will feel much improved to users who have not yet tested the new features within the Gutenberg plugin. There is a welcome modal to introduce end-users to the block editor, which probably should have been added in WordPress 5.0 when the block editor landed. This update will also feature two new blocks: a social links block and a buttons group block.</p>\n\n\n\n<p>The new navigation block will not land in WordPress 5.4. “The Navigation block is usable right now,” said Mark Uraine in a <a href=\"https://make.wordpress.org/core/2020/02/07/navigation-block-exclusion-from-wp-5-4/\">post explaining the decision</a>. “But we don’t think it’s useful yet – at least not until it has an intuitive place to live.” The goal is for it to be available to users in the context of adding it to the header, footer, or sidebar rather than post content. It will make more sense for it to land in an update that branches the block system outside of the content area.</p>\n\n\n\n<p>Several blocks now have extra text and background color settings, including gradient backgrounds. Users can set the image size for galleries, drag and drop a featured image, and change the title attribute for the image block. Multi-block selection is much improved along with numerous other user experience and accessibility improvements.</p>\n\n\n\n<p>The following is, mostly, our coverage of each major Gutenberg release, dating back to version 6.6, along with a few links to the release announcements for versions we did not cover:</p>\n\n\n\n<ul><li><a href=\"https://make.wordpress.org/core/2019/10/02/whats-new-in-gutenberg-2-october/\">Gutenberg 6.6 on Make Core Blog</a></li><li><a href=\"https://wptavern.com/gutenberg-6-7-introduces-storybook-and-gradient-backgrounds\">Gutenberg 6.7 Introduces Storybook and Gradient Backgrounds</a></li><li><a href=\"https://make.wordpress.org/core/2019/10/30/whats-new-in-gutenberg-30-october/\">Gutenberg 6.8 on Make Core Blog</a></li><li><a href=\"https://wptavern.com/gutenberg-6-9-introduces-image-titles-block-patterns-and-new-theme-features\">Gutenberg 6.9 Introduces Image Titles, Block Patterns, and New Theme Features</a></li><li><a href=\"https://wptavern.com/gutenberg-7-0-launches-stable-navigation-block-post-blocks-and-template-parts\">Gutenberg 7.0 Launches Stable Navigation Block, Post Blocks, and Template Parts</a></li><li><a href=\"https://wptavern.com/gutenberg-7-1-includes-welcome-modal-improves-multi-block-selection-and-adds-drag-and-drop-featured-images\">Gutenberg 7.1 Includes Welcome Modal, Improves Multi-Block Selection, and Adds Drag-and-Drop Featured Images</a></li><li><a href=\"https://wptavern.com/gutenberg-7-2-adds-long-awaited-multi-button-block-and-gallery-image-size-option\">Gutenberg 7.2 Adds Long-Awaited Multi-Button Block and Gallery Image Size Option</a></li><li><a href=\"https://wptavern.com/gutenberg-7-3-brings-navigation-block-colors-block-collections-api-and-dynamic-post-blocks\">Gutenberg 7.3 Brings Navigation Block Colors, Block Collections API, and Dynamic Post Blocks</a></li><li><a href=\"https://wptavern.com/gutenberg-7-4-adds-new-color-controls-link-ui-and-block-scaffolding-for-developers\">Gutenberg 7.4 Adds New Color Controls, Link UI, and Block Scaffolding for Developers</a></li><li><a href=\"https://make.wordpress.org/core/2020/02/12/whats-new-in-gutenberg-12-february/\">Gutenberg 7.5 on Make Core Blog</a></li></ul>\n\n\n\n<h2>Important Developer Changes</h2>\n\n\n\n<p>Developers should begin testing their plugins and themes to make sure there are no breaking changes with the 5.4 beta release. Most changes will be with the block editor. However, there are some noteworthy updates to other areas of WordPress.</p>\n\n\n\n<p>The <code>get_calendar()</code> function and anything that uses it, such as the calendar widget, have a <a href=\"https://make.wordpress.org/core/2020/02/12/changes-related-to-calendar-widget-markup-in-wordpress-5-4/\">breaking HTML change</a>. The previous and next month links have been moved below the <code><table></code> element and within a new <code><nav></code> element. This may potentially break calendar designs for theme authors.</p>\n\n\n\n<p>A new <code>apply_shortcodes()</code> function was added as an alias for <code>do_shortcode()</code>. The purpose of the function was to distinguish between <code>do_*</code> functions, which imply an action, and <code>apply_*</code> functions, which imply a filter or something that should return a value. It is purely a semantic change. It would be nice to see further cleanup of the function-naming mess that represents much of WordPress’ core code. With 16 years of technical debt, it could use an overhaul. Perhaps the acceptance of this <a href=\"https://core.trac.wordpress.org/ticket/37422\">four-year-old ticket</a> on a simple shortcode function can start a trend.</p>\n\n\n\n<p>Like plugins, themes can now set <a href=\"https://core.trac.wordpress.org/ticket/44592\">minimum version support</a>. By using the <code>Requires at least</code> and <code>Requires PHP</code> headers in a theme’s <code>style.css</code> file, theme authors can set the minimum WordPress version and PHP version, respectively.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 13 Feb 2020 17:19:17 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:18;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:60:\"WPTavern: WordCamp Asia 2020 Canceled Over COVID-19 Concerns\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97179\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:165:\"https://wptavern.com/wordcamp-asia-2020-canceled-over-covid-19-concerns?utm_source=rss&utm_medium=rss&utm_campaign=wordcamp-asia-2020-canceled-over-covid-19-concerns\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6893:\"<p>Matt Mullenweg announced this morning that he made the call to <a href=\"https://wordpress.org/news/2020/02/wordcamp-asia-cancelled-due-to-covid-19/\">cancel the first WordCamp Asia</a> amid concerns surrounding <a href=\"https://www.who.int/dg/speeches/detail/who-director-general-s-remarks-at-the-media-briefing-on-2019-ncov-on-11-february-2020\">COVID-19</a>, the recent coronavirus strain with over 42,000 reported cases. The virus has caused over 1,000 deaths to date. WordCamp Asia was scheduled to run from February 21-23 in Bangkok, Thailand.</p>\n\n\n\n<p>“I’ve arrived at the difficult decision to cancel the inaugural WordCamp Asia event,” wrote Mullenweg. “The excitement and anticipation around this event have been huge, but there are too many unknowns around the health issues unfolding right now in the region to explicitly encourage a large public gathering bringing together over 1,300 people from around the world.”</p>\n\n\n\n<p>Mullenweg expressed a desire to explore an online event, possibly live-streaming some of the sessions. However, WordCamp Asia organizers said they will not be able to organize one. “We believe our efforts are now best focused on making the best arrangements necessary to assist all affected participants,” said Naoko Takano, the global lead of WordCamp Asia 2020.</p>\n\n\n\n<p>“I greatly appreciate the work everyone — from organizers to attendees, speakers to sponsors — put into making this a big success,” said Mullenweg. “So many people have come together to create an event to inspire and connect WordPressers, and I am confident that this passion will carry through into the event next year. Our thoughts are with everyone affected by the virus so far, and we sincerely hope that everything is resolved quickly so that this precaution looks unnecessary in hindsight.”</p>\n\n\n\n<p>Some attendees have already made the trip to Bangkok. Others have purchased non-refundable flights. The WordCamp Asia team will refund all event tickets and will provide a free ticket to next year’s event. Organizers, speakers, attendees, and sponsors should all <a href=\"https://2020.asia.wordcamp.org/2020/02/12/cancellation/\">read WordCamp Asia’s cancellation post</a> for details on any next steps they may need to take.</p>\n\n\n\n<p>“While we regret that we will not see you in Bangkok this time, we hope you understand that the organising team is standing by this decision to ensure the safety of all WordCamp attendees,” wrote Takano.</p>\n\n\n\n<p>There are no details on when the event will be rescheduled. The team said they hope to hold it in early 2021 and will make an announcement as soon as possible.</p>\n\n\n\n<p>Several people expressed their disappointment with the news in the comments on the WordCamp Asia cancellation post, but it better to err on the side of caution with such a large event. The first priority is the safety of all attendees. It was no doubt a difficult decision for all parties involved.</p>\n\n\n\n<p>Some of the attendees with non-refundable tickets and those already in the region talked about meeting up in the <a href=\"https://2020.asia.wordcamp.org/2020/02/12/cancellation/#comment-938\">announcement’s comments</a>. This could be a nice alternative to at least network with others.</p>\n\n\n\n<p><strong>Update:</strong> There is an unofficial <a href=\"https://www.meetup.com/WordCamp-Asia-Meetup/\">WordCamp Asia Meetup</a> currently being set up. Also, follow the <a href=\"https://wordpress.slack.com/archives/CLAFGCLBG\">#wcasia WordPress Slack channel</a> for discussion.</p>\n\n\n\n<h2>WordCamp Europe Sends Open Letter of Unity</h2>\n\n\n\n<p>In a letter from WordCamp Europe, another regional camp, past and present organizers <a href=\"https://2020.europe.wordcamp.org/2020/02/12/sending-love-to-wordcamp-asia/\">reached out to the WordCamp Asia team</a>.</p>\n\n\n\n<p>“We woke up this morning to the sad news that WordCamp Asia has been canceled,” the team wrote. “We can only imagine what a heart-wrenching and difficult decision this must have been, and how much pain it must be causing you to see something you have poured your hearts and souls into just disappear into thin air.”</p>\n\n\n\n<p>Putting together a large, regional WordCamp is a tremendous undertaking that takes 100s of volunteer hours. Events such as these can take a full year of planning and organizing.</p>\n\n\n\n<p>“We know how hard it can be to come together across cultures and countries, but that in the end it is worth it because you are one team working together,” wrote the organizers. “You are creating a flagship event and you know that it will bring joy to so many people and that every one of you has been waiting for the day of the event, and for that not to happen despite all of that work and care must be devastating.”</p>\n\n\n\n<h2>Wordfence to Aid With Lost Fees</h2>\n\n\n\n<p>Mark Maunder, Wordfence Founder and CEO, announced on the Wordfence blog that his company is <a href=\"https://www.wordfence.com/blog/2020/02/wordcamp-asia-cancellation-fee-assistance-package-from-wordfence/\">creating a $10,000 fund</a> to help attendees with hotel and airline change fees. The company will provide up to $200 in assistance per person, which will be served on a first-come-first-served basis. Maunder stressed that people should try to recoup any losses they can by following the advice on the WordCamp Asia cancellation post first. This will allow them to help as many people as possible.</p>\n\n\n\n<p>“Cancelling WC Asia 10 days before it commences is a brutally tough call,” he wrote. “I’ve had the organizers in my thoughts for the past few days knowing, via backchannels, that they’re agonizing over this. This is the right call.”</p>\n\n\n\n<p>The aid is available to all WordCamp Asia organizers, speakers, and attendees while there are still funds available. Those in need of assistance can find more information on the <a href=\"https://www.wordfence.com/blog/2020/02/wordcamp-asia-cancellation-fee-assistance-package-from-wordfence/\">fund’s announcement post</a>.</p>\n\n\n\n<p><strong>Update – February 12:</strong> Wordfence exceeded their $10,000 fund with 94 applicants. GoDaddy Pro stepped in to add an additional $10,000 to the fund, according to a <a href=\"https://twitter.com/mmaunder/status/1227698625859420163\">tweet by Maunder</a>.</p>\n\n\n\n<p><strong>Update – February 13:</strong> <a href=\"https://twitter.com/mmaunder/status/1227918513525919777\">Yoast added $10,000</a>, bringing the total to $30,000. At the moment, no additional funding is needed because requests are slowing. If needed, Maunder said he would <a href=\"https://twitter.com/mmaunder/status/1227925429123678209\">reach out to others</a> who have made offers to help.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 12 Feb 2020 16:26:56 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:19;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:59:\"WordPress.org blog: WordCamp Asia Cancelled Due to COVID-19\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8344\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"https://wordpress.org/news/2020/02/wordcamp-asia-cancelled-due-to-covid-19/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:1265:\"<p>I’ve arrived at the difficult decision to cancel the inaugural WordCamp Asia event, which was planned to take place in Bangkok on February 21st. The excitement and anticipation around this event have been huge, but there are too many unknowns around the health issues unfolding right now in the region to explicitly encourage a large public gathering bringing together over 1,300 people from around the world.</p>\n\n\n\n<p>We’re going to explore if speakers — including myself — can do our sessions with the same content and at the same time that was originally planned, just online instead of in-person so we can achieve our goal of bringing the pan-Asian community closer together without putting anyone’s health at additional risk.</p>\n\n\n\n<p>Regardless, I greatly appreciate the work everyone — from organizers to attendees, speakers to sponsors — put into making this a big success. So many people have come together to create an event to inspire and connect WordPressers, and I am confident that this passion will carry through into the event next year. Our thoughts are with everyone affected by the virus so far, and we sincerely hope that everything is resolved quickly so that this precaution looks unnecessary in hindsight.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 12 Feb 2020 04:23:12 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matt Mullenweg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:20;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"WordPress.org blog: WordPress 5.4 Beta 1\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8322\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2020/02/wordpress-5-4-beta-1/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7500:\"<p>WordPress 5.4 Beta 1 is now available for testing!</p>\n\n\n\n<p><strong>This software is still in development,</strong> so we don’t recommend running it on a production site. Consider setting up a test site to play with the new version.</p>\n\n\n\n<p>You can test the WordPress 5.4 beta in two ways:</p>\n\n\n\n<ul><li>Try the <a href=\"https://wordpress.org/plugins/wordpress-beta-tester/\">WordPress Beta Tester</a> plugin (choose the “bleeding edge nightlies” option)</li><li>Or <a href=\"https://wordpress.org/wordpress-5.4-beta1.zip\">download the beta here (zip)</a>.</li></ul>\n\n\n\n<p>WordPress 5.4 is slated for release on <a href=\"https://make.wordpress.org/core/5-4/\">March 31, 2020</a>, and <strong>we need your help to get there</strong>!</p>\n\n\n\n<p>While the <strong>primary goal for 2020 is full-site editing with blocks</strong>, contributors to WordPress are working across every area of the project to ensure the software continues moving forward.</p>\n\n\n\n<p>Testing for bugs is an important part of polishing the release during the beta stage and a great way to contribute. Here are some of the big changes and features to pay close attention to while testing.</p>\n\n\n\n<h2>Block Editor: features and improvements</h2>\n\n\n\n<p>WordPress 5.4 Core will merge ten releases of the Gutenberg plugin. This means there’s a long list of exciting new features. Here are just a few:</p>\n\n\n\n<ul><li>Two new blocks: social links and buttons.</li><li>More color options for Button, Cover, Group and Column blocks .</li><li>A <a href=\"https://github.com/WordPress/gutenberg/pull/18041\">Welcome Guide modal</a>.</li><li>Tools for adding featured images in the Latest Posts block.</li><li>Easier navigation in the block breadcrumbs.</li></ul>\n\n\n\n<p>Some additional changes to make note of:</p>\n\n\n\n<ul><li>On mobile, the toolbar stays on top, so you can’t lose it.</li><li>Easier image sizing in the Gallery block.</li><li>Drag-and-drop images into the featured-image box.</li><li>Several new APIs.</li><li>Friendlier offline error messages on REST API request failures.</li><li>Table block captions.</li><li>You can now color just parts of the text in any RichText block. </li></ul>\n\n\n\n<h3>Accessibility improvements</h3>\n\n\n\n<ul><li>Easier multi-block selection. </li><li>Support for changing an image’s title attribute within the Image block.</li><li>Easier tabbing. This had been one of the editor’s biggest accessibility problems, but now tabbing works with the block’s sidebar.</li><li>Visual switch between Edit and Navigation modes and enable screen reader announcements.</li></ul>\n\n\n\n<p>To see all of the features for each release in detail check out the release posts: <a href=\"https://make.wordpress.org/core/2019/10/02/whats-new-in-gutenberg-2-october/\">6.6</a>, <a href=\"https://make.wordpress.org/core/2019/10/16/whats-new-in-gutenberg-16-october/\">6.7</a>, <a href=\"https://make.wordpress.org/core/2019/10/30/whats-new-in-gutenberg-30-october/\">6.8</a>, <a href=\"https://make.wordpress.org/core/2019/11/13/whats-new-in-gutenberg-13-november/\">6.9</a>, <a href=\"https://make.wordpress.org/core/2019/11/27/whats-new-in-gutenberg-27-november/\">7.0</a>, <a href=\"https://make.wordpress.org/core/2019/12/11/whats-new-in-gutenberg-11-december/\">7.1</a>, <a href=\"https://make.wordpress.org/core/2020/01/09/whats-new-in-gutenberg-8-january/\">7.2</a>, <a href=\"https://make.wordpress.org/core/2020/01/22/whats-new-in-gutenberg-22-january/\">7.3</a>, <a href=\"https://make.wordpress.org/core/2020/02/05/whats-new-in-gutenberg-5-february/\">7.4</a> and 7.5.</p>\n\n\n\n<h3>Continuing efforts to improve performance</h3>\n\n\n\n<p>The block editor team has achieved a 14% loading time reduction and 51% time-to-type reduction, for a particularly sizable post (~ 36,000 words, ~1,000 blocks) since WordPress 5.3.</p>\n\n\n\n<h2>Wait! There’s more</h2>\n\n\n\n<h3>Site Health </h3>\n\n\n\n<p>When a project powers 34% of the world’s websites, there must be a focus on security. This is why contributors continue working so hard on the Site Health Project.</p>\n\n\n\n<p>WordPress 5.4 adds a widget on the dashboard that warns administrators of potential issues that could affect their site’s performance or security. A call-to-action button directs them to the Site Health screen for details and suggested fixes.</p>\n\n\n\n<h3>Accessibility improvements</h3>\n\n\n\n<p>WordPress strives to improve accessibility with every release, and this release is no different. Version 5.4 will contain the following accessibility enhancements:</p>\n\n\n\n<ul><li>Better focus management in Menu, Customizer and Site Health screens, to fix some existing keyboard navigation issues.</li><li>Easier keyboard navigation for better semantics in the Media modal.</li><li>An easier-to-read Privacy Policy Guide.</li></ul>\n\n\n\n<h2>For Developers</h2>\n\n\n\n<p>5.4 also contains a bunch of developer focused changes.</p>\n\n\n\n<h3>Calendar Widget </h3>\n\n\n\n<p>The HTML 5.1 specification mandates that a <code><tfoot></code> tag must follow <code><tbody></code> tag (which was not the case in the calendar widget). WordPress 5.4 moves the navigation links to a <code><nav></code> HTML element immediately following the <code><table></code> element in order to produce valid HTML.</p>\n\n\n\n<h3>apply_shortcodes() as an alias for do_shortcode()</h3>\n\n\n\n<p>Instead of using <code>do_shortcode()</code>, <code>apply_shortcodes()</code> should be utilized instead. While <code>do_shortcode()</code> is not being deprecated, the new function delivers better semantics.</p>\n\n\n\n<h3>Better favicon handling</h3>\n\n\n\n<p>Now favicon requests can be managed with more flexibility. Administrators can choose a favicon in the Customizer, or upload a <code>/favicon.ico</code> file. The WordPress logo will always load as a fallback.</p>\n\n\n\n<h3>Other changes for developers</h3>\n\n\n\n<ul><li>Clearer information about errors in <code>wp_login_failed</code>.</li><li>Site ID has been added to the <code>newblog_notify_siteadmin</code> filter for multisite installs.</li><li>Support has been added for the required WordPress and PHP version headers in themes.</li><li>Embed support has been added for TikTok.</li></ul>\n\n\n\n<p>Keep your eyes on the <a href=\"https://make.wordpress.org/core/\">Make WordPress Core blog</a> for <a href=\"https://make.wordpress.org/core/tag/5-4+dev-notes/\">5.4-related developer notes</a> in the coming weeks, breaking down these and other changes in greater detail.</p>\n\n\n\n<p>So far, contributors have fixed more than <a href=\"https://core.trac.wordpress.org/query?status=closed&milestone=5.4&group=component&max=500&col=id&col=summary&col=owner&col=type&col=priority&col=component&col=version&order=priority\">255 tickets in WordPress 5.4</a> with more to come.</p>\n\n\n\n<h2>How You Can Help</h2>\n\n\n\n<p>Do you speak a language other than English? <a href=\"https://translate.wordpress.org/projects/wp/dev/\">Help us translate WordPress into more than 100 languages</a>!</p>\n\n\n\n<p>If you think you’ve found a bug, you can post to the <a href=\"https://wordpress.org/support/forum/alphabeta/\">Alpha/Beta area</a> in the support forums. We’d love to hear from you! If you’re comfortable writing a reproducible bug report, <a href=\"https://core.trac.wordpress.org/newticket\">file one on WordPress Trac</a> where you can also find a list of <a href=\"https://core.trac.wordpress.org/tickets/major\">known bugs</a>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 11 Feb 2020 22:43:44 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Francesca Marano\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:21;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:65:\"WPTavern: EditorsKit Tackles Typography With First Premium Add-On\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97154\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:175:\"https://wptavern.com/editorskit-tackles-typography-with-first-premium-add-on?utm_source=rss&utm_medium=rss&utm_campaign=editorskit-tackles-typography-with-first-premium-add-on\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5031:\"<p>Jeffrey Carandang released the <a href=\"https://editorskit.com/wordpress-gutenberg-editor-typography-and-google-fonts-add-on/\">EditorsKit Typography Add-On</a> today, the first commercial extension to his <a href=\"https://wordpress.org/plugins/block-options/\">EditorsKit WordPress plugin</a>. The plugin provides page and block-level typography options. It works with Google Fonts, includes preset font combinations, and allows users to create custom typography rules.</p>\n\n\n\n<p>Unlike many other block editor plugins that offer a library of blocks, EditorsKit does not add custom blocks. Instead, it focuses on creating a better block editor experience. It enhances the editor interface, adds extra options to the editor toolbar, and extends options for existing blocks. It is a toolkit that is almost experimental, handling user-requested features long before they land in core WordPress or even the Gutenberg plugin.</p>\n\n\n\n<p>Until now, EditorsKit has remained a free plugin with no commercial components. However, it was almost inevitable that such a plugin would need some financial backing, particularly with the pace that Carandang is adding new features.</p>\n\n\n\n<p>“The plan was actually for Gutenberg and EditorsKit to mature enough, then create premium add-ons or services,” said Carandang. “But, the circumstances changed when I created ShareABlock. There are so many things that I want to achieve when creating a layout that core blocks cannot do yet.”</p>\n\n\n\n<p><a href=\"https://wptavern.com/creator-of-editorskit-launches-community-block-sharing-site\">ShareABlock</a> is Carandang’s community website for sharing blocks and templates. Site visitors can download block files directly from the site and import them into the block editor. Members can also share their custom block and template designs with others. Everything on the site is free to the community.</p>\n\n\n\n<p>“For this specific add-on, I was trying to solve the issue when it comes to typography in the Gutenberg Editor that I’ve experienced when creating templates and block patterns for ShareABlock,” said Carandang. “I always find myself doing custom functions to use specific Google Fonts when creating a template. I figured there might be others that are having the same problem.”</p>\n\n\n\n<p>The typography add-on for EditorsKit is a value-add on top of the normal free version of the plugin. For users who decide to purchase, they can choose between three plans that range from $29 and $99 per year, depending on the number of sites they need updates and support on.</p>\n\n\n\n<p>“My main focus is still on the free version,” said Carandang. “There will just be a few add-ons that will be built along the way whenever the circumstances need it.”</p>\n\n\n\n<p>This add-on is just the first step into a larger goal to add some other commercial add-ons and integration into EditorsKit. “I have a couple of other ideas,” said Carandang. “I plan to turn this into a bundle to make it easier for users to manage them inside the settings page.”</p>\n\n\n\n<h2>How the Plugin Works</h2>\n\n\n\n<p>Yesterday, Carandang launched version 1.2.5 of the primary EditorsKit plugin. Along with a handful of new features and bug fixes, he added a new “Extensions” tab to the plugin’s settings screen. End-users can grab the typography add-on from that new page. Once installed and activated, users can view and set a default font combination from that same area in the plugin.</p>\n\n\n\n<img />Typography Settings on the EditorsKit settings screen.\n\n\n\n<p>The plugin adds typography options on the post-editing screen. It provides a custom sidebar that allows end-users to select a font combination for the entire post. </p>\n\n\n\n<p>End-users can also create custom typography rules from this same sidebar. Any custom rules created are stored for use on other posts and pages too. There is also an option to apply the rules to the <code><body></code> element on the front end and override the theme’s typography.</p>\n\n\n\n<img />Post/Page-level typography options in the block editor.\n\n\n\n<p>On the block level, each block allows users to select a font family and weight. This is handled through a custom “Typography Settings” panel. Currently, there are over 60 choices from Google Fonts and a few system fonts. The add-on also automatically updates the font-weight options on a per-font basis (not all fonts are built for all weights).</p>\n\n\n\n<img />Per-block typography settings.\n\n\n\n<p>The one potential downside to this add-on is how easy it is to go overboard when adding external fonts. When using too many on a page, it will slow down the page-loading speed. As a general rule of thumb, users should not select more than two or three fonts to keep speed in check. It would be handy if the plugin added a warning message somewhere in the UI to let users know of the dangers of using too many fonts.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 11 Feb 2020 20:25:41 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:22;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:64:\"WPTavern: Awesome Motive Acquires the All in One SEO Pack Plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97109\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:173:\"https://wptavern.com/awesome-motive-acquires-the-all-in-one-seo-pack-plugin?utm_source=rss&utm_medium=rss&utm_campaign=awesome-motive-acquires-the-all-in-one-seo-pack-plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7061:\"<img />\n\n\n\n<p class=\"has-drop-cap mt-2\">Last Thursday, Awesome Motive CEO Syed Balkhi <a href=\"https://semperplugins.com/all-in-one-seo-is-now-part-of-the-awesome-motive-family/\">announced his company acquired the All in One SEO Pack</a> (AIOSEO) plugin. Michael Torbert, the plugin creator, first released <a href=\"https://wordpress.org/plugins/all-in-one-seo-pack/\">AIOSEO</a> in 2007. Since then, the plugin has been downloaded over 65 million times. It is currently active on over 2 million WordPress sites.</p>\n\n\n\n<p>Balkhi said his company acquired the project for two primary reasons. “First, because our users continuously asked us to build an SEO plugin that’s easier to use and is more affordable,” he said. “They specifically wanted an SEO plugin that was reliable and results-focused like some SaaS software is.” The second reason was that he did not want the plugin to end up in the wrong hands. “All in One SEO has played an important role in the history of WordPress, in the history of WPBeginner (since this was the first SEO plugin I used), and there are a lot of users who rely on All in One SEO Pack to optimize their WordPress site for SEO.”</p>\n\n\n\n<p>“I’m confident in handing over the reins to such a great organization in Awesome Motive and excited to see what the next chapter brings for AIOSEOP under your leadership,” said Torbert in response to Balkhi’s announcement.</p>\n\n\n\n<p>For many years, AIOSEO enjoyed the spotlight. It was the go-to SEO plugin for a large segment of the WordPress user base. However, in recent years, Yoast SEO has captured a larger share of the market. It is currently installed on over 5 million websites. Other plugins such as The SEO Framework have also eaten into the market. Plus, newcomer Rank Math SEO has been making waves and picking up users at a steady clip. Needless to say, there is much fiercer competition among SEO plugins than in AIOSEO’s heyday.</p>\n\n\n\n<p>“The SEO plugin market is definitely a competitive one, but I feel it’s only competitive by quantity,” said Balkhi. “WordPress as a platform is flourishing, and one of the reasons for that is the choices/freedoms that WordPress offers to users, including the choice of which SEO plugin to use.”</p>\n\n\n\n<p>Balkhi has a knack for growing products, and the WordPress ecosystem is steadily growing. Currently, over 14 million websites use his software. He launched <a href=\"https://www.wpbeginner.com/\">WP Beginner</a>, a free WordPress resource site, in 2009. Since then, he’s launched successful products like <a href=\"https://optinmonster.com/\">OptinMonster</a>, a conversion optimization toolkit; <a href=\"https://wpforms.com/\">WPForms</a>, a drag-and-drop form builder; <a href=\"https://www.monsterinsights.com/\">MonsterInsights</a>, a Google Analytics plugin; and more. In 2019, his company launched <a href=\"https://rafflepress.com/\">RafflePress</a>, a contest and giveaway plugin.</p>\n\n\n\n<p>Balkhi noted that he does not manage all of these properties on his own. “The truth is that I’m blessed to work alongside with some of the most talented people in the ecosystem that are my partners in various ventures, such as Thomas Griffin, Jared Atchison, Chris Christoff, John Turner, Blair Williams, Steve and Stephanie Wells, Josh Kohlbach, and now Benjamin Rojas,” he said. “Without my partners and the rest of our amazing Awesome Motive team, none of what we do would be possible.”</p>\n\n\n\n<p>The question is now whether his company can grow AIOSEO’s audience from its current 2 million users while turning a profit.</p>\n\n\n\n<p>“Our growth plan for the next year and beyond is to make an SEO plugin that’s geared towards beginners and non-techy business owners,” said Balkhi. “An SEO plugin that’s always reliable, comes with exceptional customer support, and most importantly is results-focused. I believe when we meet these three criteria, we will have done more than enough to set ourselves apart from the competition.”</p>\n\n\n\n<p>Except for Torbert, the entire AIOSEO team is joining Awesome Motive and will continue working on the plugin. “Some of the team members were previously part-time contractors, but now they will be working full-time on AIOSEO, so you can say that the product team has actually grown,” said Balkhi.</p>\n\n\n\n<p>Benjamin Rojas will be taking the lead role in managing the plugin. He was previously one of the senior members from Awesome Motive’s OptinMonster team. Alongside this change, the company is planning to add two new hires in the coming weeks. Balkhi expressed a desire to “hit the ground running at full speed.”</p>\n\n\n\n<h2>The Future of the Plugin</h2>\n\n\n\n<img />Primary settings screen for the AIOSEO plugin.\n\n\n\n<p>The current version of AIOSEO (v.3.3.5) feels a bit dated. It lacks integration directly with the block editor, relying on the older meta box system. The settings screens do not fit completely into the WordPress admin UI. Cleaning up these areas could offer some quick and instant wins in the short term.</p>\n\n\n\n<p>AIOSEO and other SEO plugins, in general, need to make the complex simple.</p>\n\n\n\n<p>SEO plugins can be painfully complex to configure. At times, the user experience can be overwhelming. The average user should not need to be an SEO expert or spend half an hour configuring a post’s SEO options. It should not feel like work before sharing content with the world.</p>\n\n\n\n<p>“Aside from SEO experts and consultants, just about everyone else finds SEO to be confusing,” said Balkhi. “How do you know whether the SEO settings that you have are driving results? Is the green light enough or is it lying? Is the green light even relevant?” These are the types of questions Balkhi said his company receives from users. “Unfortunately there isn’t a single solution in the market that solves these problems,” he said.</p>\n\n\n\n<p>Based on what is currently available, there’s a gap between the set-it-and-forget-it type of SEO plugins and highly-advanced plugins. There’s an unclaimed middle ground that guides users without complicating things.</p>\n\n\n\n<p>Balkhi is not yet prepared to provide specific details from the roadmap, playing it a little close to the vest. “I want to build a WordPress SEO plugin that’s both reliable and results-focused,” he said. He will be working closely with the team as they work to revamp the plugin.</p>\n\n\n\n<p>“I have a lot of plans to improve the product, and I’m really excited to be bringing several of our internal SEO tools into a single plugin suite to share with the larger community,” said Balkhi. “My goal is that after our series of updates and new features, All in One SEO will give WordPress sites an even bigger SEO advantage over other third-party CMS platforms.”</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 10 Feb 2020 20:56:41 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:23;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:80:\"WPTavern: Convert Classic Content to Blocks With the Bulk Block Converter Plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97056\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:205:\"https://wptavern.com/convert-classic-content-to-blocks-with-the-bulk-block-converter-plugin?utm_source=rss&utm_medium=rss&utm_campaign=convert-classic-content-to-blocks-with-the-bulk-block-converter-plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3462:\"<p>Organic Themes released the <a href=\"https://wordpress.org/plugins/bulk-block-converter/\">Bulk Block Converter </a>WordPress plugin last month and updated it in the past week. The plugin allows users to convert classic content, written in the old editor, to the new block format.</p>\n\n\n\n<p>Unless end-users have the Classic Editor plugin installed, their old content is placed into the classic block in the newer block editor. WordPress provides an option for transforming this content into individual blocks from the block-editor interface. However, this must be done on a per-post basis.</p>\n\n\n\n<p>“Going back and converting each post and page with a classic block to individual blocks can be a very long and tedious process,” said David Morgan, co-founder of Organic Themes. “The Bulk Block Converter plugin quickly scans all your posts and pages for classic blocks, and allows you to quickly convert them all to individual blocks within one interface.”</p>\n\n\n\n<p>Originally, Organic Themes built the plugin for internal use at their company. “We developed the plugin to help us convert the content of our theme demos to blocks more efficiently,” said Morgan. The company had to convert over 40 theme-demo sites with an average of 50 posts and pages per site. They built this plugin to avoid a long and painstaking process. Then decided to share it. “We thought the tool could be very useful for other users migrating to Gutenberg.”</p>\n\n\n\n<p>For users with a lot of old content, Bulk Block Converter could be the key to moving it all to the new block editor system. Based on the conversions I ran on a couple of test installations, it worked flawlessly.</p>\n\n\n\n<h2>How the Plugin Works</h2>\n\n\n\n<img /> Block Conversion plugin screen in the admin.\" class=\"wp-image-97059\" srcset=\"https://wptavern.com/wp-content/uploads/2020/02/bulk-block-converter-tool.png 896w, https://wptavern.com/wp-content/uploads/2020/02/bulk-block-converter-tool-300x175.png 300w, https://wptavern.com/wp-content/uploads/2020/02/bulk-block-converter-tool-768x449.png 768w, https://wptavern.com/wp-content/uploads/2020/02/bulk-block-converter-tool-500x292.png 500w\" sizes=\"(max-width: 896px) 100vw, 896px\" />Bulk Block Converter admin screen for converting content.\n\n\n\n<p>The Bulk Block Converter plugin adds a new “Block Conversion” sub-menu item to the WordPress “Tools” menu in the admin. Once on that screen, it provides a “Scan Content” button. When clicked, it checks all of your posts, pages, and other custom post types for classic content. It then builds a list table of all the content.</p>\n\n\n\n<p>From that point, you can choose between converting each post individually or running a bulk conversion of all posts. I always recommend being cautious with such plugins by converting and checking a couple of individual posts before trying bulk conversions.</p>\n\n\n\n<p>The process for converting posts was snappy during my tests. In just a few moments, I converted all of my old content over without issue.</p>\n\n\n\n<p class=\"has-text-color has-background has-white-color has-blue-700-background-color is-style-highlight shadow-md text-white bg-blue-700\">Like any plugin that modifies content in this way, it is prudent to store a backup of your site before converting the posts. This is also a one-way conversion process. Once a post is transformed, there is no going back.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 07 Feb 2020 20:49:03 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:24;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:94:\"WPTavern: Gutenberg 7.4 Adds New Color Controls, Link UI, and Block Scaffolding for Developers\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=97032\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:229:\"https://wptavern.com/gutenberg-7-4-adds-new-color-controls-link-ui-and-block-scaffolding-for-developers?utm_source=rss&utm_medium=rss&utm_campaign=gutenberg-7-4-adds-new-color-controls-link-ui-and-block-scaffolding-for-developers\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4443:\"<p class=\"has-drop-cap\">The Gutenberg development team <a href=\"https://make.wordpress.org/core/2020/02/05/whats-new-in-gutenberg-5-february/\">launched version 7.4 of the plugin</a> yesterday. The update includes a few user-facing features: a text color control for the group block, background-color control for the columns block, and a new link UI for rich text components. For developers, the team introduced a script for launching a block plugin from the command line.</p>\n\n\n\n<p>After a dramatic increase in speed in the <a href=\"https://wptavern.com/gutenberg-7-3-brings-navigation-block-colors-block-collections-api-and-dynamic-post-blocks\">last update</a>, version 7.4 continues down the same path. When tested against a post with approximately 36,000 words and 1,000 blocks, page load speeds dropped from 5.461s to 5.037s and keypress events from 34.63ms to 34.54ms. This is not a significant reduction, but every improvement helps.</p>\n\n\n\n<p>The update includes over two dozen bug fixes and several enhancements. Work toward the navigation block continues. The experience is slowly getting better, but it still doesn’t feel ready for production.</p>\n\n\n\n<p>The team also launched an early, experimental <a href=\"https://github.com/WordPress/gutenberg/pull/19883\">mechanism for handling global styles</a>, a feature that may be complete this year. <a href=\"https://wptavern.com/key-takeaways-from-the-first-future-of-themes-meeting\">Global styles</a> would allow themes to set default colors, typographical settings, and potentially more. Theme authors should keep an eye on the development of this feature and offer feedback.</p>\n\n\n\n<h2>Group Block Gets Text Color Control</h2>\n\n\n\n<img />Changing the text color for an entire group.\n\n\n\n<p>The Gutenberg team once again cleans up one of my biggest gripes. When using the group block in the past, end-users could not apply a text color to every sub-element of the group block. Instead, they had to add a text color to any blocks within the group. It was a painstaking process at times, particularly with groups of many blocks.</p>\n\n\n\n<p>With this change in version 7.4, users can apply a <a href=\"https://github.com/WordPress/gutenberg/pull/19181\">text color to the entire group</a> at once, and that color should trickle down to sub-blocks. Of course, users can still change the color of inner blocks if necessary.</p>\n\n\n\n<h2>Columns Block Gets Background Color Control</h2>\n\n\n\n<img />Customizing the background color on a columns block.\n\n\n\n<p>Gutenberg 7.4 adds the <a href=\"https://github.com/WordPress/gutenberg/pull/17813\">background color control to the columns block</a>. This makes it work similarly to the group block by adding a background color to the entire containing block. Unfortunately, it did not receive the same text color control in this release.</p>\n\n\n\n<p>Currently, there is still no way to add background and text colors to an individual column. End-users can only add a color on the sub-blocks within a column. The feature is a step in the right direction, but it’s still missing some essential color options.</p>\n\n\n\n<h2>Link UI Updated</h2>\n\n\n\n<img />Inserting a link into a paragraph with the new UI.\n\n\n\n<p>This is a minor change but welcome. The link UI for rich text, a component used for blocks such as paragraphs, <a href=\"https://github.com/WordPress/gutenberg/pull/19686\">now has the same UI</a> as the navigation and button blocks. The consistency is nice, but I am a fan of the improvement overall. </p>\n\n\n\n<p>The UI change is subtle, but it already feels slightly more comfortable after a day of use.</p>\n\n\n\n<h2>Block Scaffolding for Developers</h2>\n\n\n\n<img />Initial JavaScript file for an auto-created block plugin.\n\n\n\n<p>For developers who want to jump-start a new block plugin, the Gutenberg team <a href=\"https://www.npmjs.com/package/create-wordpress-block\">released an official script</a> for getting started. By running the <code>npm init @wordpress/block</code> command, the script will install and run you through setting up a custom block. The script creates an entire plugin folder, including the necessary PHP, CSS, and JavaScript files.</p>\n\n\n\n<p>This script is ideal for building single-block plugins, which will eventually be exposed via the official WordPress block directory. Because it creates an entire plugin, it is probably not the best route for creating new blocks within an existing plugin.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 06 Feb 2020 21:06:59 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:25;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:76:\"Post Status: Syed Balkhi on Awesome Motive’s acquisition of All In One SEO\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"https://poststatus.com/?p=76000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"https://poststatus.com/syed-balkhi-on-awesome-motives-acquisition-of-all-in-one-seo/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:31030:\"<p>Syed Balkhi joins me to discuss the acquisition of AIO SEO.</p>\n\n\n\n<p>All in One SEO is one of the most widely used plugins in the WordPress ecosystem, with more than two million installs.</p>\n\n\n\n<p>In the <a href=\"https://semperplugins.com/all-in-one-seo-is-now-part-of-the-awesome-motive-family/\">announcement post</a>, Syed says the entire All in One SEO team is joining Awesome Motive, aside from founder Michael Torbert:</p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Aside from new ownership change, it’s business as usual. You can continue to use the plugin that you love without any interruptions.</p><p>With the exception of Michael, the entire All in One SEO team joined Awesome Motive. This means that you are still being supported by the same talented people.</p><p>On top of that, we have added more team members from Awesome Motive who will be working on the All in One SEO project, including me.</p><p>In a near future release, you will see a small plugin design refresh in the WordPress admin area.</p><p>With our experience and a dedicated team, we will be adding several new features and improvements to the All in One SEO WordPress plugin in the near future.</p></blockquote>\n\n\n\n\n\n\n\n<p><strong>Some of the questions he answers:</strong></p>\n\n\n\n<ul><li>So who is your target customer with All in One SEO?</li><li>How is the model structured? You’re directing strategy… is there a partner you\'re working with?</li><li>How does your vision for AIO SEO compare to what you see in Yoast SEO?</li><li>How do you envision the free/premium divide?</li><li>What are the first three things you plan to do?</li><li>How did the conversation with Michael start? Did you approach him? Did he approach you? Tell me a story.</li><li>How far do you think you can scale this business model?</li><li>What do you think about the consolidation we’re seeing in the plugin ecosystem — the consolidation you’re a major player in?</li></ul>\n\n\n\n<p><strong>Links:</strong></p>\n\n\n\n<ul><li><a href=\"https://awesomemotive.com/\">Awesome Motive</a></li><li><a href=\"https://wordpress.org/plugins/all-in-one-seo-pack/\">AIO SEO on WP.org</a></li><li><a href=\"https://semperplugins.com/all-in-one-seo-is-now-part-of-the-awesome-motive-family/\">Acquisition announcement</a></li></ul>\n\n\n\n<h3>Full Transcript</h3>\n\n\n\n<div class=\"transcript\">\n<p>Transcribed by https://otter.ai</p>\n\n\n\n<p><strong>Brian Krogsgard 0:02 </strong><br />This episode of the Draft podcast is brought to you by Jilt. Jilt is email marketing built for eCommerce stores. Go to jilt.com to try it today. I know that Jilt is an awesome product because I work on it every single week. And I get to see it up close and personal. Jilt has amazing integrations for WooCommerce, Shopify, and ads so no matter what platform you\'re building your eCommerce site on, it will work for you. It\'s built specifically for eCommerce with extremely powerful segmentation options for you to set up automations to work for you while you sleep. And you can do your manual email marketing through our broadcasts feature in Jilt. It\'s a great tool. I know you\'ll love it. Try it today. Go to Jilt.com. And thanks to Jilt for being a Post Status partner. Hello and welcome to the Draft podcast. My name is Brian Krogsgard. I\'m with Syed Balkhi. Hey Syed. </p>\n\n\n\n<p><strong>Syed Balkhi 0:55</strong><br />Hey man, how are you? </p>\n\n\n\n<p><strong>Brian Krogsgard 0:56</strong><br />I\'m doing great. So you know like you Guys have news coming out all the time. And you\'ve got another plugin that you\'ve put under the automotive umbrella. And it\'s all in one SEO. So first off just congrats on the acquisition of a really long-running popular plugin.</p>\n\n\n\n<p><strong>Syed Balkhi 1:18 </strong><br /> Thank you. Thank you.</p>\n\n\n\n<p><strong>Brian Krogsgard 1:20 </strong><br /> So let\'s start with what attracted you to all in one SEO as the type of plugin that you were interested in.</p>\n\n\n\n<p><strong>Syed Balkhi 1:29 </strong><br /> So when I started a web beginner I was I started with all in one SEO, I\'ve had a lot of respect for the plugin in industry. I believe it you know, it is one of the tools that are essential for a website owner. And it is something that our users have continued to, to build. If you haven\'t checked out the WP begin to engage Facebook group, this question comes up a lot I did a, I did a video about it and people were asking, like, you know, when are you going to build a SEO plugin that is beginner-friendly. And, you know, it\'s just keeps coming up over and over every year if you\'ve been able to build one product, what would it be? And SEO keeps coming upset. We tried to make a deal happen. And you know, I approached several authors and this was the one that we ended up going with.</p>\n\n\n\n<p><strong>Brian Krogsgard 2:25 </strong><br /> So you say, you know, people from the dopey beginner groups were the ones that initiated this conversation. So who is your target customer with a plugin like this?</p>\n\n\n\n<p><strong>Syed Balkhi 2:38 </strong><br /> Small business owners like you know, DIY website owners, I would say is there is a target market you know, we try to stay away from the super-advanced super Dev audience, we want to help small business owners so our goal at awesome motive is to you know, help small businesses go and compete with the big guys. And that is something that we continue with all of our products.</p>\n\n\n\n<p><strong>Brian Krogsgard 3:00 </strong><br /> So obviously the I guess I would say the market leader in this genre has been Yoast SEO for years. If I remember the correlation of how the usage worked out all in one, SEO was the most popular plugin for a really long time in the SEO market, and then Yost took over that spot. What\'s the comparison that you see in Yost? I mean, I think you and Yost divock are friendly and the team at Yost, how does how to your efforts here? You know, like, how does it differ from Yoast? Is Yost an advanced plugin? Like what makes you most advanced versus like the beginner features that you envision? All in one Seo? That\'s the stuff that I don\'t quite know how to nail down in my mind.</p>\n\n\n\n<p><strong>Syed Balkhi 3:45 </strong><br /> For sure, for sure. Yeah. So I mean, I\'m friends of yours. Of course, I told. I told Yost about, about the field before he went public. So it doesn\'t affect our friendship. I think you know, in any market you have multiple players, right? They have their own unique sets of features and divisions that they carry forward. And I know Yost has a vision that he is moving forward with. My, my goal is to really focused on two things, one, reliability, and the second is to be results-focused. And that the second one is definitely a primary thing I want a plugin, that is results focus on, you know, almost every SEO plugin, when you look at it in the market, and there\'s some newcomers that are that have entered the market as well. They kind of just help you set up and let you optimize some pages. And that\'s kind of it like there hasn\'t been any innovation, if you may, from a bigger picture point of view in the SEO plugin market in a while.</p>\n\n\n\n<p>And I want to change that.</p>\n\n\n\n<p><strong>Brian Krogsgard 4:56 </strong><br /> So talk to me about that. Because I know I know. I know Sayed Balkhi well enough to know he\'s got a plan. As soon as he has control, you\'ve got some things that you want to do. I have to admit, I haven\'t installed all in one SEO and I don\'t even know how long I don\'t know what it looks like, once you get working on it on the interior. What\'s it like today? And I guess, what are your big three things that you want to do? I know you got those mapped out?</p>\n\n\n\n<p><strong>Syed Balkhi 5:24 </strong><br /> Yeah, I mean, we have a very clear 12-month plan the three-year picture, I would say, you know, install it, just so you can see, you can have a before and after comparison, I think that you know that you can see the impact that we\'re, we\'re about to happen on this plugin. So, you know, over the years, like, I\'ve built a lot of internal tools that we just use, and like when you asked like, you know, what is the target market release me and I\'m like, I try to dog food pretty much all of our own products and I think that\'s, that\'s one of our secret sauces on how we make the best product. So I want to bring in a lot of the internal tools that we have, that we already have into a central plugin that we can control manage, and also, you know, share it with the WordPress community and in the small business community as well. I am also you know when you think about like a lot of my friends who are influencers somewhere, you know, meeting SEO experts as well they all have, you know, their own internal SEO tools that they\'ve built, we kind of shared that knowledge, we sometimes shared those scripts with each other. So we can kind of have an advantage and I want to bring that level the playing field. So we\'re going to be bringing a lot of those other tools in it so when it when you know when you think about the name all in one SEO, I think this is going to really become that. Without divulging too much of the you know, fine details, I think, think about it from that way it finally is true SEO suite for WordPress.</p>\n\n\n\n<p><strong>Brian Krogsgard 6:59 </strong><br />You mentioned how the way that people typically look at SEO and WordPress right now is you go to a single singular URL. So let\'s say it\'s a, you know, it\'s a page of, you know, the best WordPress host or whatever. And you optimize that page. So is what you\'re talking about more of how to figure out a site wide plan or overview, is that right?</p>\n\n\n\n<p><strong>Syed Balkhi 7:22 </strong><br />Exactly. So when you think about that, you know, a small business owner they come in and install the plugin then what what happens do they do the chase a light, a specific color, but what is that in regards to anyways? I want to I want to really help people discover new growth opportunities. So like SEO is not just some acronym. That doesn\'t mean anything new. Most people will be they everybody kind of has a vision, but everybody\'s lost. really making that easy, making people making easy to identifying opportunities, measure those opportunities and you know, doing a little bit More than just setting up an optimizing. Okay. Yeah.</p>\n\n\n\n<p><strong>Brian Krogsgard 8:03 </strong><br /> So, you know, when I think of small businesses, and when I talk to the friends that are, you know, they run small businesses like a dentist or something I usually start thinking about SEO in terms of local stuff or so what\'s the free and premium divide for you?</p>\n\n\n\n<p><strong>Syed Balkhi 8:20 </strong><br /> Yeah, there\'s gonna be a lot of premium features that we\'re going to add, of course, over the years, we\'re going to continue improving the tree offering, which is, you know, core of this plugin anyways. That\'s, that\'s, that\'s, that\'s where I think I\'ll pretty much stop at you know, there\'s gonna be a lot of cool tools that are going to come in that we\'re going to add in the premium version. There\'s also going to be a lot of really cool thing that we\'re going to add in the free version that we just haven\'t seen. Is this going to happen over the course of the next three months? No regular we\'re going to do some like small refreshes the three in the three month period, but the bigger picture and the big things are going to be rolled out over the, you know, 12 month period because we have to take our internal tools and then, you know, turn it into so it can be used by tuning people.</p>\n\n\n\n<p><strong>Brian Krogsgard 9:12 </strong><br /> <em>I\'m pretty biased towards Jilt. And it\'s with good reason. When I was considering to take on some part-time work to complement what I was doing with Post Status, I went straight to Skyverge and said, I think that Skyverge seems like a fantastic company to work for. And Jilt seems like a really exciting product to work on. Jilt is really the tool that you need to complement your eCommerce store. It\'s email marketing, but it\'s built specifically for eCommerce stores. So what\'s that mean in practice? Well, you can do your marketing outreach through a manual newsletter built into Jillson, some people don\'t even know that. That\'s done via the broadcast feature. But then there are the automation tools. jilt started out as an abandoned cart automation tool, but it\'s a lot more than that. Now, you can segment based on anything that\'s part of your historical store data. So if you will Want to email people just who purchased a product in a certain category, then you can do it. If you have an update for a product and you want to send an email to people who have purchased that historically, you can do it. If you want to send an email because people have spent a certain amount of money in their lifetime, and your store, you can do it. You can do so much with guilts Automation features, the segmentation data is extremely thorough, whether you\'re running a WooCommerce store, or a Shopify store or an ed d store, and you\'re not using jilt, then, quite frankly, you\'re giving up potential revenue. Try jilt today, go to jilt.com. I know you\'ll love it. </em><br /><br />How did the conversation with Michael start then? Did you approach him? Did he approach you? Tell me a story around the process of acquiring a plugin especially one was such a huge user base. And I guess there\'s a lot of implications when someone new takes over one of the most popular plugins in the plugin repo.</p>\n\n\n\n<p><strong>Syed Balkhi 10:59 </strong><br /> Absolutely. So, you know, I think I mentioned to you, you this came back from the WP beginner communities after I did the web kind of census survey, which happened at the beginning of the year, I start getting all sorts of data from the audience and from survey responses and start analyzing. And I reached out to, to Michael, as I started the conversation, you know, it started from discussing of what does this look like, you know, does this look like us partnering together and running that does it look like us taking a full hundred percent stake into the business then, you know, Michael walks from Italy, you know, there was, like, a lot of conversation that, you know, started with things like maybe March, so we didn\'t close the deal until January 3. So it takes you know, it\'s like think about it when this is something that you have been doing for 10 plus years this is your baby. It\'s an emotional process. It\'s a yes, it\'s a very emotional process. It\'s not an easy decision to make, and I\'m not you know that. I think the things that made it easy or easier to make things you know a little bit smoother was that I\'ve known Michael for a long time, right. Michael has been in the WordPress ecosystem. This was the original WordPress SEO plugin. I\'ve had numerous occasions where I hang out with Michael, at the WordPress community summit, the first-ever … network in Raleigh several times. I actually flew out to Raleigh to hang out with Michael to kind of share our vision because you know, for both of us, the most important part is users and the community. And, you know, we were in you know, we were lying there. So that\'s like that\'s, that\'s really a nutshell what happened in the nine-month period, right? Of course legal comes in Ba ba ba ba ba that\'s normal of any deal, boring stuff.</p>\n\n\n\n<p><strong>Brian Krogsgard 13:02 </strong><br />You can have it all settled, I guess and still have several months left on Enter before it actually, you know, get signed and is ready to go.</p>\n\n\n\n<p><strong>Syed Balkhi 13:12 </strong><br /> Right. And especially with my travel schedule, it kind of made things a little difficult, right? Because we\'re growing and then I you know, I have certain like level commitments already like that that are planned six months plus in advance always. So it becomes a little tricky. So we wanted to do face to deal in December, but it kind of went in by the January.</p>\n\n\n\n<p><strong>Brian Krogsgard 13:35 </strong><br /> Yeah. So the, you know, I\'ve seen you do this a couple times now where you acquire another business and obviously you don\'t acquire something unless you see potential growth in it. So you see growth in this product. However, I would say this product may be different than some of the others whereas where, you know, it was at the top of the game for a while and then it had a you know, maybe it grew WordPress a little bit, but it wasn\'t the market leader there were there was growth and other plugins in the sector, significantly higher than all in one, SEO is growth. Whereas some tools that you started, you were the growth plugin, like WP forms was a fresh plugin, you know, brand new, or you acquire one that is on a high growth trajectory. So this one\'s a little bit different than that. So how do you view the business model? And then how do you think that you can continue to scale this business model that there\'s so many products under the automotive umbrella these days?</p>\n\n\n\n<p><strong>Syed Balkhi 14:33 </strong><br /> You know, I think the important part is that you that you highlighted is almost every plugin grows with WordPress. You know, when I started using WordPress in 2006, I don\'t recall the exact number of how big WordPress was, but it wasn\'t 35% of the web.</p>\n\n\n\n<p><strong>Brian Krogsgard 14:52 </strong><br /> Right? If I did a post on this, I think it was in 2010. And we weren\'t 8% of the web yet, so 20,006 it was probably like 1% Maybe 2% of the web, right?</p>\n\n\n\n<p><strong>Syed Balkhi 15:02 </strong><br /> So, So when you think about this right I\'m very bullish on WordPress. I really believe in WordPress, I even posted a story about like my cab driver using WordPress and learn from the … Uber driver and I was like, wow, this is crazy like you could get picked up from the Atlanta airport. So the, you know, the business model really is, you know, anytime you build an ecosystem, you rely on the ecosystem. I think the WordPress ecosystem has a lot of growth happening right now. And users are always looking for so you know, whether it be just because we have WP forms and needed it is the best hands down. WordPress form plugin doesn\'t mean people don\'t use others. Right. So I don\'t look for Oh, is this is this plugin necessarily growing or not? I think this is a plugin with a very loyal user base. Good, you know framework I haven\'t had a lot of sentimental values, you know, tied to all them on SEO because this was a plugin I started using, you know, and when I launched WP beginner, I think for a long time I was the de facto maybe an official doc for this because I would share my configuration and people would just come and copy and paste that into the chat back and forth. Michael and Steve, you know, who\'s been with all the one for 10 years, he actually joined us a motive. That\'s pretty, pretty awesome. But we also had a lot of sentimental values for this. And I\'ve learned a ton from Michael who\'s been very generous mean in the early days of the WordPress ecosystem. So I think there\'s a lot we can do in terms of the growth side of the plugin for sure.</p>\n\n\n\n<p><strong>Brian Krogsgard 16:49 </strong><br /> As an aside, you mentioned in the announcement posts that Michael is not joining awesome motive, it sounds like he\'s gonna go find out what he wants to do next, but the rest of the Anyone that was working on all in one SEO is actually going to become an automotive employee.</p>\n\n\n\n<p><strong>Syed Balkhi 17:05 </strong><br /> Absolutely. that\'s already been done yet our goal whenever we make an acquisition, are you in a position or you know, one of the automotive core values people first and we always take care of that first.</p>\n\n\n\n<p><strong>Brian Krogsgard 17:15 </strong><br /> So you\'ve got WP forms monster inside see prod webmail, SMTP raffle press. And you know, now we\'re putting all in one SEO as kind of primary product things. You\'ve got some other stuff too. If people go to automotive com, they can see everything that your team is working on. But what about this scale side of this? So we talked actually last week I don\'t know if you probably didn\'t listen to it. We talked last week about back when you showed me your schedule blocking and you know, we\'re talking about trying to manage multiple projects and you\'re the kind of the key to this to me, in our space, because there\'s so many things that you\'re paying personal attention to, but you\'ve created ways to where, you know, you don\'t have to be there. You\'re your vessel You add but like, Is there a ceiling for how you can scale like is it 10 products? Is it 15 or 20? what\'s this business model for you?</p>\n\n\n\n<p><strong>Syed Balkhi 18:11 </strong><br /> I wish I knew what the number was, I\'ve tentatively put it at 30? I think it is one of the things that you know that like I never do anything alone, right? There\'s like I\'ve worked like my secret against it\'s not such a big secret is I work with really really awesome partners, really talented people. You know, Thomas Griffin, who leads OptinMonster and TrustPulse, you know, products. Jared Atchison who leads WP Forms and SMTP. These guys are phenomenal leaders right. Chris Christoff leading Monster Insights, phenomenal leader and they all have their own strengths. Right and we what makes us work really well together is how we compliment each other. So you know with John Turner in SeedProd and RafflePress, right, that he brings a whole new set of values to Awesome Motive and what we\'re looking to do over the next 10 years. So, you know, when when we decided to acquire all in one SEO we looked for, you know, who would that personally because Michael was not going to be coming on board. And, of course, like, this is it. This is something I\'m really passionate about. And I know a lot about this industry. I wanted to make sure that there\'s somebody else who\'s really, really talented who can lead and Benjamin Rojas, I don\'t know, I don\'t know if you know him or not in the WordPress ecosystem. He\'s a phenomenal developer had had several other products in the EBD ecosystem that he sold to Pippin when you know, they did the market consolidation, their position. He\'s been working in the OptinMonster team for I believe, like four years, three, four years, and so He\'s actually going to be leading this division and department call and Seo? Of course, I\'m going to be I\'m very involved that, you know, I\'m not involved in OptinMonster day today, but you know, I\'ve been for two years. Same thing with WP Forms, that division is run by Jared, Christoff, you know, my stream says pretty much online, so I\'m going to be very involved in it. So like, while we have a lot going on, I\'m not liking every single thing all the time. It\'s not it\'s not humanly possible. You see my time blocks, right? So these things move around around every quarter.</p>\n\n\n\n<p><strong>Brian Krogsgard 20:34 </strong><br /> Okay, so you are bringing in Benjamin he\'s going to be the Christoff or the Acheson version of your partner? Your — almost like an implementation partner — whereas you\'re the strategic partner?</p>\n\n\n\n<p><strong>Syed Balkhi 20:49 </strong><br /> Yeah, absolutely. I— you know, we could call it the integrator role that you know, GM …</p>\n\n\n\n<p>So yeah, Ben, Ben is awesome. And I\'ve had a pleasure working with him for last years. And he just continues to impress me, is literally like two and a half, three people into one. And you get to that pretty much about like, you know, Christoff, you\'ve seen the energy that he brings in Jared and Thomas, John,…</p>\n\n\n\n<p><strong>Brian Krogsgard 21:23 </strong><br /> It seems like everybody, do you think this is a pattern of just the WordPress ecosystem? or part of the way you\'ve made these partnership decisions? Everybody that has played that role internally for you as a developer? Do you think is that strategic or just circumstance?</p>\n\n\n\n<p><strong>Syed Balkhi 21:40 </strong><br /> I think it\'s a circumstantial, more so than not, I don\'t believe that, you know, this role has to go to a developer. I think this role has to go to somebody who understands product and building products. So you know my extent of development, I —</p>\n\n\n\n<p><strong>Brian Krogsgard 22:02 </strong><br /> It\'s more than you let on but no, you —</p>\n\n\n\n<p>Syed Balkhi 22:08 <br /> I don\'t think you have to be a developer you have to be — you have to understand the products and more importantly understand the problem you\'re solving and being able to improvise at, you know, at a, at a fast scale and being able to solve problems faster than other people. I think that\'s — that\'s what I look for, more so than anything.</p>\n\n\n\n<p><strong>Brian Krogsgard 22:29 </strong><br /> All right, I want to finish up.</p>\n\n\n\n<p>I want to get your take on the consolidation that we\'re seeing in the\n plugin ecosystem is something I\'ve been talking about. I think since \n2017. We\'ve seen that playing out in hosting business, we\'ve seen it of \ncourse, that\'s kind of par for the course in the landscape of broader \nhosting. We\'re really seeing it ramp up in terms of plugins in the \nWordPress space. You You\'re one of the big players in that consolidation\n process, but there are others too. There\'s some people Whether they\'re \npublic yet or not, that are you know bundling up plugins and they\'re \ncoming at it with a strategy to take advantage of this market. So what \nare your What are your thoughts about consolidation and where we are \nkind of in I guess the market cycle of WordPress plugin businesses</p>\n\n\n\n<p><strong>Syed Balkhi 23:18 </strong><br /> think they in an important thing to look at is not just the consolidation part of WordPress but scale that new plugins are coming and being introduced. Right. So it\'s not it\'s it would be not fair to look at the market just from one angle because there\'s so much growth happening with a new plugins being added and when the market is growing at that scale consolidation becomes natural. And this just shows that WordPress is not in its infancy. anymore right when you because they are players. Better. That is certain sides enough to be able to have this kind of conversation. This was, you know, the consolidation doesn\'t always happen for monetary reasons, sometimes, you know, you\'ve been doing this for you have a plugin that you\'ve been building for like, seven, eight years, maybe you just want to move on. Right? So I don\'t necessarily, you know, that\'s just natural now that WordPress has been around for so long, then that\'s just a natural transition of people\'s lives. That\'s happening from an ecosystem point of view. Just the growth is phenomenal. When you look at the new plugins being added all the Gutenberg bought collection plugins that are being added, you know, and all of them are getting installs. There\'s not like, you know, there\'s one or two or three that just kind of own the market, every single one of them is getting itself. You know, you there\'s like, just because like we launched web form doesn\'t mean there hasn\'t been new contact or plugins. I mean, it says, I think that\'s just a natural phase of any ecosystem. And it means great things for the user, like the users of WordPress are going to benefit the most out of it. Because it shows that there\'s truly legitimate resources being put into building products and it\'s not just, you know, one person, you know, doing this as a side hustle. And there\'s nothing wrong with that there\'s a lot of great plugins come out of solid there are some really good ones that are still you know, somebody\'s side hustling and just crushing it right in the market. So I think it just it\'s just good It shows that businesses can use you know, WordPress plugin, and reliably knowing that they\'re this is not going to be disappeared is not just going to be discontinued. So, I think that I\'m very bullish on the WordPress market, and I have been for the last 10 years of running WP Beginner.</p>\n\n\n\n<p><strong>Brian Krogsgard 25:48 </strong><br />Awesome. And you think this consolidation will probably continue on as a natural part of our ecosystem?</p>\n\n\n\n<p><strong>Syed Balkhi 25:55 </strong><br /> Yeah, I mean, absolutely.</p>\n\n\n\n<p>That\'s just natural for any system whether you\'re in WordPress, or you\'re in landscaping, or pool cleaning,</p>\n\n\n\n<p><strong>Brian Krogsgard 26:06 </strong><br /> Maybe the difference from here on out will be that we\'ll start to see larger ones. And maybe I don\'t know if you have an opinion on that. But I think that\'s my gut feeling. You mentioned something like you get to a stage and, you know, some people are looking to exit and some people now have the resources to be able to make those acquisitions. So as time goes on that discrepancy between the big, you know, the people that are big enough now to where, let\'s say, I don\'t know, a million-dollar acquisition is in their wheelhouse, whereas five years ago, that was totally impossible for them to even consider as that becomes more and more the type of thing that is possible for a company to do will naturally see more of it. Would you agree with that?</p>\n\n\n\n<p><strong>Syed Balkhi 26:49 </strong><br /> I think they you know, what I would like to see is, you know, more of this happening, right because this just further validates the industry in itself. I think it is happening, right, you know, have it happening, whether it\'s public or not public, right. I know several players that are that are in the market. And in terms of big, I think that\'s just reality, right? You lay outside looking in big is not always what you see. Yeah, we\'re all small and big and not what you think. I think that it\'s just relative. Right. So to the individual perspective.</p>\n\n\n\n<p><strong>Brian Krogsgard 27:27 </strong><br /> All right. So that\'s all I really have for you. I just wanted to chat with you about this acquisition and get your take on it. Is there anything that you want to either leaf people, whether they\'re an all in one SEO user, or if it\'s somebody in the post s audience question for me, the floor is yours.</p>\n\n\n\n<p><strong>Syed Balkhi 27:45 </strong><br /> No, you know, I always appreciate the work that you\'re doing and really excited to see Cory on board with post status. I just wanna say thank you, you know, to the community for the continued support of automotive our suite of products. We, we always strive to do better and serve our users. And I just hope to continue to earn everybody\'s trust for years to come.</p>\n\n\n\n<p><strong>Brian Krogsgard 28:08 </strong><br /> Awesome. I appreciate it. Thanks for joining us and we will talk to everybody soon. Bye.</p>\n\n\n\n<p>Transcribed by https://otter.ai<br />\n</p>\n\n</div>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 06 Feb 2020 19:14:19 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Brian Krogsgard\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:26;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"WPTavern: Key Takeaways From the First ‘Future of Themes’ Meeting\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96997\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:171:\"https://wptavern.com/key-takeaways-from-the-first-future-of-themes-meeting?utm_source=rss&utm_medium=rss&utm_campaign=key-takeaways-from-the-first-future-of-themes-meeting\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:10639:\"<p>There are few clear answers.</p>\n\n\n\n<p>As members of the <a href=\"https://wptavern.com/join-the-future-of-wordpress-themes-conversation-theme-review-team-to-hold-biweekly-discussions\">core design, editor, and theme review teams joined</a> for the <a href=\"https://make.wordpress.org/themes/2020/02/03/block-based-themes-meeting-agenda-for-february-5/\">inaugural biweekly meeting</a> that may decide the fate, at least in part, of WordPress themes, it became clear that there is no structured game plan. There are many ideas. There are several moving pieces. There are components and teams and ideas that must all coalesce and build something that has never been done before in WordPress.</p>\n\n\n\n<p>There is room for both excitement and concern.</p>\n\n\n\n<p>It is not necessarily a bad thing to be in an early experimental stage. However, WordPress is a mature product. It <em>feels</em> like there should be something more concrete about the future of one of its most integral parts — themes.</p>\n\n\n\n<p>That is what these meetings are for. They are about building bridges between various teams and making some decisions. One of the problems going forward will be cutting through the noise.</p>\n\n\n\n<p><strong>Takeaway #1:</strong> there are still more questions than there are answers.</p>\n\n\n\n<h2>Moving Forward With Block-Based Themes</h2>\n\n\n\n<p>If there is one thing that almost feels like a foregone conclusion it is that we are transitioning into a future where themes will be built entirely of blocks. Even the meeting was dubbed the “Block-Based Themes Meeting,” despite <a href=\"https://make.wordpress.org/themes/2020/01/29/new-bi-weekly-block-based-themes-meeting/#comment-43993\">some pushback</a> that such a meeting name was biased.</p>\n\n\n\n<p>This is no surprise. Block-based themes are where we are going. The real question is how that will work and what level of control theme authors will ultimately have over their creations.</p>\n\n\n\n<p>Kjell Reigstad, a design director for Automattic, kicked off the meeting with an introduction of block-based themes and what the meeting would cover. “As most of you probably know, Gutenberg is in the process of <a href=\"https://make.wordpress.org/core/2019/09/05/defining-content-block-areas/\">expanding beyond the editor</a>,” he said. “As we’ve already seen, Gutenberg allows for a great deal of user-customization inside of post and page content. It allows any user to create custom layouts all by themselves, and style adjustments too. These will all usually be retained even after a user switches themes.”</p>\n\n\n\n<p>Full-site editing seeks to bring blocks to the entire site, which is traditionally the domain of themes. “By turning elements like the header and footer into block areas, users will have the flexibility to place any sort of content wherever they want,” said Reigstad. “It allows for a lot of creativity! They’ll theoretically be able to click and edit their header in place, or change their sites entire color scheme without needing to jump into an entirely separate interface.”</p>\n\n\n\n<p><strong>Takeaway #2:</strong> block-based themes are happening.</p>\n\n\n\n<h2>The Definition of Block-Based Themes</h2>\n\n\n\n<div class=\"wp-block-embed__wrapper\">\n\n</div>Live Demo Q&A from <a href=\"https://gutenbergtimes.com/theme-templates-full-site-editing-experience-enrique-piqueras/\">The Gutenberg Times</a>.\n\n\n\n<p>After a quick introduction of how the meeting would work, Jeff Ong, designer at Automattic, filled in the details of how block-based themes work. Currently, such themes are experimental and must be activated by ticking the full-site editing (FSE) checkbox via the Gutenberg plugin’s Experiments settings screen.</p>\n\n\n\n<p>“Once you’ve activated this FSE experiment option, a few major changes will occur in how WordPress behaves,” said Ong. “WordPress will look for HTML templates inside of a block-templates directory of your theme, instead of using the PHP templates, to determine how your site will appear.”</p>\n\n\n\n<p>This was not a new concept to the people present. Most have explored the <a href=\"https://wptavern.com/initial-documentation-for-block-based-wordpress-themes-proposed\">initial documentation for block-based themes</a> over the past two months.</p>\n\n\n\n<p>This part of the meeting was more about providing information. The following are key links for further exploration of full-site editing and block-based themes:</p>\n\n\n\n<ul><li><a href=\"https://github.com/WordPress/gutenberg/projects/35\">Full-Site Editing Project</a></li><li><a href=\"https://github.com/WordPress/gutenberg/issues?utf8=%E2%9C%93&q=label%3A%22New+Block%22+label%3A%22%5BFeature%5D+Full+Site+Editing%22+\">Full-Site Editing Tickets</a></li><li><a href=\"https://github.com/WordPress/theme-experiments\">Theme Experiments Repository</a></li><li><a href=\"https://developer.wordpress.org/block-editor/developers/themes/block-based-themes/\">Block-Based Themes Documentation</a></li></ul>\n\n\n\n<h2>Global Styles Are a Part of the Process</h2>\n\n\n\n<img />Example mockup from the primary <a href=\"https://github.com/WordPress/gutenberg/issues/19255\">global styles ticket</a>.\n\n\n\n<p>Tammy Lister, experience designer at Automattic, introduced <a href=\"https://github.com/WordPress/gutenberg/projects/40\">global styles</a>, a feature coming to the Gutenberg plugin and eventually core WordPress. She described global styles as being at the “what goes into the cake” stage, meaning the team is still deciding what the feature will entail.</p>\n\n\n\n<p>“So what are global styles?” Lister began. “In short, it’s style you can apply across your site right there in the browser. Pretty neat! Think of it as a kit full of component tools you can activate and take advantage of. Tried, tested and ready to go. It’s your decorating kit to get your site space just the way you want it.”</p>\n\n\n\n<p>At the moment, the baseline for the “kit” includes text, background, and primary colors in which themes can set the defaults. The baseline would also include typographical settings for changing the font size, scale, and alignment.</p>\n\n\n\n<p>“However, is that enough?” asked Lister. “This is currently a big question. There needs to be exploration on what are common things needed and what needs to be available.”</p>\n\n\n\n<p>Another argument for the biggest question award would be whether global styles are a necessary feature for core WordPress at all. With the possibility that users can directly manipulate templates in the WordPress admin, adding styles to the mix may make some theme authors feel like they will be permanently sitting in the back seat.</p>\n\n\n\n<p>Lister made it clear that global styles should not go too far. “These are tools available in the editor, so addressing what is needed or not is key, over allowing everything and creating a complicated experience,” she said. “A personal point I’m thinking about here is how when I had a crowded art box I could never find that ‘one pencil’ I wanted, we want to avoid that.”</p>\n\n\n\n<p><strong>Takeaway #3:</strong> End-users will likely be able to set global styles from the WordPress admin. For many, this level of power will be a good thing. For theme authors who build hyper-detailed designs, they may be cringing at the thought.</p>\n\n\n\n<h2>Open-Ended Questions Going Forward</h2>\n\n\n\n<p><em>When will block templates and global styles land?</em> The rough timeline for block-based themes is for it to remain experimental through mid-year and have something basic in place as we close 2020. Global styles are likely to land this year, but there is no definite date yet.</p>\n\n\n\n<p>Global styles could easily land in the next several months. It has a tighter scope than themes made of HTML block templates. Given the point that block-based themes are currently at and the unanswered questions about how the system will work, its time frame may be optimistic. The scope touches almost everything in WordPress to some degree, at least anything that ends up on the front end of the site.</p>\n\n\n\n<p>Everything about themes will change. How theme authors approach design will likely move toward styling on the component/block level. Blocks will go into sidebars as widgets are slowly replaced. Even theme options may be a thing of the past. “Personally, I don’t think the customizer will disappear immediately, but I do think it’s clear that many of its current duties won’t be necessary in this Gutenbergy future,” said Reigstad.</p>\n\n\n\n<p>One question on many theme authors’ minds is what sort of quality control they will have over their theme if users are handed so much power to change things. </p>\n\n\n\n<p>One proposal in the meeting was to allow theme authors to lock down certain templates so that users could not mess up the design by moving parts (e.g., a meticulously-crafted header and nav menu template that works across browsers and screen sizes). There is not yet an open ticket for this possibility, but some theme authors will need to have a level of control over this for certain designs to work.</p>\n\n\n\n<p>Ending the meeting on a high note, Ari Stathopoulos, a representative from the theme review team, gave his final thoughts. “Themes are not going away,” he said. “They may change, completely transform in many ways. The tools we’re currently using and the way we’re currently building themes is not the way themes will be built next year. But they will still exist, and the new way is neither better nor worse. It’s just different. If we embrace that and open up our imagination, there’s lots of amazing things we — as theme authors — can build.”</p>\n\n\n\n<p>I am cautiously optimistic that things will work out in the end. I’m excited about the idea of end-users being given tools to build out the websites of their dreams. I’m concerned, along with many theme authors I have chatted with, about what the role of theme designer will be in a year.</p>\n\n\n\n<p>At the moment, I imagine a major split in types of themes: block-based vs. traditional with perhaps some block elements. Only time will tell whether this becomes an insurmountable rift or whether there is a place for both concepts.</p>\n\n\n\n<p><strong>Takeaway #4:</strong> it’s still far too early to come to any solid conclusions about what the future holds.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 05 Feb 2020 21:08:59 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:27;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:92:\"WPTavern: Guteblock Joins the Block Collection Plugin Arena With an Initial 12 Custom Blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96944\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:229:\"https://wptavern.com/guteblock-joins-the-block-collection-plugin-arena-with-an-initial-12-custom-blocks?utm_source=rss&utm_medium=rss&utm_campaign=guteblock-joins-the-block-collection-plugin-arena-with-an-initial-12-custom-blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6780:\"<p>Last week, London-based digital marketing agency Sweans Technologies released <a href=\"https://wordpress.org/plugins/guteblock/\">Guteblock</a>, its new block collection plugin. Currently, the plugin boasts 12 custom blocks. The company plans to add more and has big plans for the plugin’s future.</p>\n\n\n\n<p>While the team earns no points for originality in plugin naming, they are nevertheless throwing their hat into the ring of ever-growing block collection plugins alongside the likes of <a href=\"https://wptavern.com/array-launches-free-gutenberg-ready-atomic-blocks-theme-on-wordpress-org\">Atomic Blocks</a>, <a href=\"https://wptavern.com/coblocks-1-9-5-merges-block-gallery-plugin-into-collection-adds-new-form-block\">CoBlocks</a>, and <a href=\"https://wptavern.com/kioken-blocks-the-new-street-fighter-inspired-block-collection-that-is-taking-aim-at-page-builders\">Kioken Blocks</a>. There is already steep competition in this arena, but there is also a lot of space for growth.</p>\n\n\n\n<p>“WordPress bets high on Gutenberg editor and the block styles,” said Ajay Thomas, CEO of Sweans. “With the introduction of blocks, WordPress allows greater user control over the page-designing process beyond what the theme can handle. For the upcoming block directory, we believe that blocks will be the third integral part of WordPress after plugins and themes.”</p>\n\n\n\n<p>The plugin’s team has put together the following video to show installation and usage examples:</p>\n\n\n\n<div class=\"wp-block-embed__wrapper\">\n\n</div>\n\n\n\n<h2>Plugin Blocks</h2>\n\n\n\n<p>Guteblock is still a little rough around the edges in comparison to more mature block library plugins. Some things were confusing, such as some block color options not using the theme-defined colors. The drop cap block felt like it could have simply been added as extra settings to WordPress’ paragraph block.</p>\n\n\n\n<p>The container block currently does nothing but group elements. At the moment, it is a step down from WordPress’ existing group block. Thomas explained that the team wanted to develop other blocks before fleshing it out. “The main features we will add to the container block are custom background settings, which include color, customizable gradient, an image with parallax effect, video, customizable SVG and other features including shadow, border-radius, etc.,” he said.</p>\n\n\n\n<p>Of its library of 12 blocks, it has some interesting blocks that will come in handy, such as the number box block, which allows users to add columns of numbered boxes. The notification block is also useful for adding a bold warning, note, or similar message.</p>\n\n\n\n<img />Number Box block from the Guteblock plugin.\n\n\n\n<p>The post grid block is one of the nicest blocks in the collection. It lets users create a grid of posts, showcasing the featured image, post title, and optional excerpt. It has settings to control the post count, number of columns, and font sizes.</p>\n\n\n\n<img />Post Grid block from the Guteblock plugin.\n\n\n\n<p>The biggest downside to the post grid block at the moment is that it relies on the <code>post-thumbnail</code> size for featured images, which may make them look stretched and distorted on the front end. In the future, it would help if the user could select their preferred featured image size.</p>\n\n\n\n<p>The plugin includes a social sharing block. Currently, it adds sharing links for Facebook, Twitter, LinkedIn, Pinterest, and Reddit. Each social network can be enabled or disabled individually. The plugin also includes round, square, and modern block styles.</p>\n\n\n\n<img />Social Sharing block from the Guteblock plugin.\n\n\n\n<p>A social sharing block will likely be more useful when WordPress moves toward <a href=\"https://wptavern.com/initial-documentation-for-block-based-wordpress-themes-proposed\">block-based themes</a>. Controlling this at the post level instead of globally is unnecessary work except in some edge cases where a user wants social sharing only on a limited number of posts or pages.</p>\n\n\n\n<p>Thomas believes the team members and author profiles blocks are the most useful blocks. “One of the extremely important features of team members block is that users can highlight one block separately by changing the background color, font color, etc. and drag and drop members to reorganize, he said. “Regarding the author profile block, our block will fetch the author’s name, bio, and image and display there. Users can modify the same if needed.”</p>\n\n\n\n<h2>Upcoming Blocks and a Premium Version</h2>\n\n\n\n<p>At the moment, Guteblock is a free plugin. However, Sweans plans to launch a commercial version in the future. The company did not provide an exact date of launch but said it will happen shortly. It is also unclear what the pricing model will look like.</p>\n\n\n\n<p>“This will be mainly a more customizable plugin with some other blocks such as Amazon link builder, events and shows, a premium slider, etc.,” said Thomas. He stressed that the free version will have at least 34 blocks down the road.</p>\n\n\n\n<p>The plugin’s development team is currently working on two primary blocks to include in the premium edition. “The first block will help Amazon affiliates search for their products in the Amazon catalog, access real-time price and availability information, and effortlessly create links in your posts to products on Amazon.com using the Amazon Product Advertising API,” said Thomas. “The second block is for adding event details in a post or page. You can show the time, date, venue, and the details of the event, and this can be directly added to your desktop/mobile calendar with one click.”</p>\n\n\n\n<p>Along with work toward their commercial version, the development team is preparing to add 16 extra blocks to their free version. This update will include blocks for Google Maps, video, grids, advanced columns, newsletters, pricing tables, and more. They will also provide alternative versions of some core blocks, such as blockquotes and buttons.</p>\n\n\n\n<p>The company plans to dip its toes into the <a href=\"https://wptavern.com/version-1-prototype-of-the-wordpress-admin-block-directory-announced\">upcoming block directory</a> too. “We are planning to release some very useful and unique blocks into the block directory and will maintain its excellence and effectiveness,” said Thomas. “But, at the same time, we will improve our plugin’s collection to make them stand out from the rest as we are updating them regularly to give the finest user experience.” It will be interesting to see if the block collection plugin or the individual blocks perform better.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 04 Feb 2020 19:53:44 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:28;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:66:\"Post Status: Working on multiple things, and working with partners\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"https://poststatus.com/?p=75833\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:54:\"https://poststatus.com/working-with-business-partners/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:47497:\"<p>A lot of folks in the WordPress economy, whether employed with a side hustle or self-employed, manage multiple things. Also, many of us work with partners, or are interested in partnerships.</p>\n\n\n\n<p>Cory has long worked with partners, and we\'re now running Post Status as partners. Also, we are both working on several projects.</p>\n\n\n\n<p>In this episode of Draft, we talk about how to balance multiple things, how we try and structure our weeks, and some things to consider when working with partners.</p>\n\n\n\n\n\n\n\n<h3>Show links</h3>\n\n\n\n<ul><li><a href=\"https://kolbe.com\">Kolbe</a></li><li><a href=\"https://www.gallup.com/cliftonstrengths/en/strengthsfinder.aspx\">Strengthsfinder</a></li><li><a href=\"https://waitbutwhy.com/2013/11/how-to-beat-procrastination.html\">Wait But Why</a></li></ul>\n\n\n\n<h3>Sponsor: Pagely</h3>\n\n\n\n<p><a href=\"https://pagely.com/\">Pagely</a> offers best-in-class managed WordPress hosting, powered by Amazon\'s Cloud, the Internet’s most reliable infrastructure. Pagely helps big brands scale WordPress. Their new platform <a href=\"https://northstack.com/\">NorthStack</a> is a completely serverless solution for managed application hosting. Thank you to <a href=\"https://pagely.com/\">Pagely</a> for being a Post Status partner!</p>\n\n\n\n<h3>Full Transcript</h3>\n\n\n\n<div class=\"transcript\">\n\n<p>Transcribed by https://otter.ai</p>\n\n<p><strong>Brian Krogsgard 0:05 </strong><br /> This episode of Post Status Draft is brought to you by Pagely\'s best in class WordPress managed hosting. They help big brands scale. And it\'s really the place you want to be. If your website is a mission-critical site, they have an extremely flexible tech stack to help you accomplish your goals with your website. And they have the three things that they really like to focus on: Number one, flexibility. Number two, scalability. And number three, reliability. What I think occasionally in the years that I\'ve hosted my main website PostStatus.com on Pagely, that\'s what I keep in mind myself — I know I can do the things I want to do. It\'s not overly opinionated. It\'s highly scalable, and it\'s reliable. I never worry about my WordPress going down because it\'s on Pagely. Go to pagely.com to check it out. Thanks so much to Pagely for being a Post Status partner, and welcome to Post Status Draft. My name is Brian Krogsgard. I\'m here with my partner for Post Status, Cory Miller. Hey, Cory.</p>\n\n\n\n<p><strong>Cory Miller 1:07 </strong><br /> Hey, Brian.</p>\n\n\n\n<p><strong>Brian Krogsgard 1:09 </strong><br /> Alright, official podcast.</p>\n\n\n\n<p>It\'s our second podcast. Every, every trend starts with two, right? Yep. So we have a couple of topics that are highly relevant to us that we want to discuss today. And number one is juggling multiple things. We\'re both doing so so we\'re going to talk about the process of it and some of the things we\'ve tried to instill in our own habits and otherwise. And then the second thing is the process of working with a partner because when juggling several things, often the choice would be to have a partner in crime as you do. So obviously, this is highly relative to our, our own situations, with post status and then each of us are, you know, Post Status as our common plate but we each have other plates that were spinning So that\'s what we want to discuss and iron out today. You know, I\'m thinking of who\'s our listener who\'s, who\'s listening to this and thinking, I\'m interested. And you know, one type of person sticks out to me in particular, which is a, like a plugin or product developer, someone that\'s got a WordPress product and maybe it\'s not their full-time gig yet or maybe they\'re balancing the product side with doing some freelance work. Why don\'t we jump back to the first time you had to start balancing something and go from there so like, what have you learned since you you know since you started doing full-time WordPress back in 2008 or so? Was I themes paying the bills right out of the gate, or how did that work?</p>\n\n\n\n<p><strong>Cory Miller 2:49 </strong><br /> Yeah, I think it was paying the bills right out the gate, but I\'ve kind of notorious mine. People that have worked with me to be a plate spinner anyway, I kind of relish In the place multiple things keep me engaged. And so, but I woke up you know, couple weeks ago post that this is one of five projects I\'ve got going right now and back into being a plate spinner again but and iThemes Yeah, I spend a lot of plates in the first year, of course, we had full time, you know, I had money to be able to kind of get started and then we try to get revenue in the first month as best we could and be self-sustainable. But uh, for that year, I tried to only spend one plate and that was just I themes, but on the project plate for products, it was just trying to iterate on themes and stuff, but the year, a year or two prior, I was doing the same thing we\'re doing now which is balancing a full-time gig with stuff on the side, in my freelance business just happened to be, you know, it worked out but I was also I don\'t know, 13-14 years younger and I can power through until midnight or one now it\'s like I\'m going to bed at night.</p>\n\n\n\n<p><strong>Brian Krogsgard 4:07 </strong><br /> Yeah, definitely makes a difference I\'ve said on this podcast and elsewhere many times that my I used to call it my tended to time. So 10 pm to 2 am was my window where typically my wife was in bed before I had kids. And I was a night owl, so I would get stuff done. And that was how I maintained my side hustles while I had full-time jobs, and I can\'t do that anymore, like just physically, my I can\'t do that now. And, you know, if I have to get some stuff done late at night, I might be able to put in an hour or so. But I run out of steam like if I\'m going to do something else. It has to be something replenishing or balancing my work efforts, like reading a book or something that\'s not by, you know, fingers to keyboard type of activity.</p>\n\n\n\n<p><strong>Cory Miller 4:59 </strong><br /> I know a lot I know most probably of our community can relate to all this as burning the midnight oil, so to speak. And then now as I\'ve gotten older it\'s like, it\'s just not going to work. And you and I both have young kids. So when I get home, it\'s hard to like, I can\'t pull up my computer one, I\'ve got a kid sitting in my lap. And, you know, wanting to know what I\'m dead. I\'m like, I\'m trying to get something done.</p>\n\n\n\n<p><strong>Brian Krogsgard 5:25 </strong><br /> If I\'m, if my two-year-old is here, he will literally just make every effort to just slam the spacebar. He\'s like, that\'s the biggest thing that\'s on that board that you, you know, put your fingers on and he\'s just like, I gotta get on that, you know. I can\'t, I can\'t really work with them awake. What that means for us is that we\'re juggling things and we\'re not like inventing new hours in the day where we\'re figuring out how do we juggle within our standard, our standard day. So how do you physically process this and terms of playing And execution?</p>\n\n\n\n<p><strong>Cory Miller 6:03 </strong><br /> Gosh, you know, I put the five projects like in December, I thought I have four, this is all one and then something happened and I was like, okay, there\'s a fifth can\'t turn down. And I realized real quickly like, okay, I don\'t want to get into old bad ruts. I knew I had to get organized new posters is a priority for me, for us, for our family, too. And I\'ve got a lot of other projects kind of spinning, but I had to get really organized and go, okay, you know, I\'m going to need help at some point. So I actually hired a virtual assistant. A couple of weeks ago, I don\'t even know if I told you that run. But yeah, you mentioned to me Yeah. How to virtual assistant because I had a longtime executive assistant at it. Named Patty color, Painkiller, excuse kill. And I was like, I\'ve got to find figure that out. So I hired a virtual assistant and starting to delegate trying to delegate things to her to help me chase down some things but there\'s so much like, she can\'t go to the bank and sign, you know, a bank account for me. So I\'m trying to be strategic about it. And then now you know you and I both said we\'re in a different stage now. So we got young kids, work, work-life balance, if that\'s even a thing work-life alignment is a thing for me. But I don\'t know if I want to be working. After six o\'clock, I need to devote that time to my kiddos, and I know you do too. So I\'ve got to really prioritize I think Jason freed said it best is in one of his books or podcasts or something a long time ago that constraints particularly time constraints are such a good thing. I\'m like, Yes, absolutely. You know, when I saw those names and people, you know, have their opinions about where they think my financial future is. But honestly, when everything is an option, everything sucks. And I think constraints. I can\'t believe I\'m saying this, but constraints are good. In certain situations, everything is an option. And I\'ve kind of taken the mindset from Jason freed that, you know, having kids is good because it gives me some boundaries, or at least that need to be setting boundaries to not repeat bad habits that I did over 10 years. And I think,</p>\n\n\n\n<p><strong>Brian Krogsgard 8:19 </strong><br /> yeah, so you\'re saying constraints in terms of what you choose to work on. And that\'s interesting. For me, I kind of know what I\'m working on now. Like, I made those decisions. And, you know, I\'m contracting a significant chunk of my week with sky verge, working the majority of the rest of that with post status, and then I have this one thing, and this is where I really had to make my biggest decision, which is on the like, crypto side of things where I had huge community following and stuff. I had to say, I\'m going to establish scope on what\'s achievable within that project, and really limit myself self to, to what I know I can do well and efficiently. So for that, it really meant narrowing it all the way down to just like a podcast. So I do a podcast in that space. And now I know like, I\'m not going to spend more than, you know, x hours in the week on that because I\'ve established scope for that project. And then it\'s deciding, okay, well, where, where\'s the differentiator between, you know, being productive with my time and relying on teammates, like in our scenario, that was one of the big things selling half a post at us. It\'s not just Oh, great. There\'s a little bit of money now that I get to bring in which I\'m obviously thankful for. But it\'s also to say, Okay, if I treat this as part-time and you treat this as part-time, we have two part-time contractors, will you put all four of us together we\'re combining multiple people\'s skills, and the end result is better than me as a full time or upon myself could have ever done in the first place. So I feel like That\'s a really effective use of part-time efforts and allows me to juggle multiple things and in my opinion, put out a better product on the thing that I was trying to do alone. So that was a big part of it for me is defining the scope and identifying how can I make something better while spending less time on it?</p>\n\n\n\n<p><strong>Cory Miller 10:22 </strong><br /> Yeah, I think what has been for me is prioritization of like, I can\'t, I can\'t goof off. I\'ve been here in my little office from, you know, 830 to five roughly and it\'s straight through and it\'s good. It\'s engaging senior wanted to level off at some point. But there is a focusing power, like I\'ve got to be very good about prioritizing what my time is, particularly with juggling some projects like you do. I\'m thankful that our partnership we\'re in the same time zone and roughly on the same hours, work hours. So that\'s really good. My partner, Rebecca Gill, another project. She\'s in Eastern Time Zone. I always have to kind of convert a little bit on that. So,</p>\n\n\n\n<p><strong>Brian Krogsgard 11:04 </strong><br /> and then really hard for our friends who have partners or whatnot that are six hours or 10 hours apart, that the offset that you create in your communication cycle forces your projects to go slower.</p>\n\n\n\n<p><strong>Cory Miller 11:16 </strong><br /> We were very deliberate about when we took on our Portugal team and iThemes and because they were six hours ahead of us, and knowing there\'s going to be a lag and man that just slows things down when you\'re trying to ship product. So it\'s, it\'s, you know, I\'m definitely thankful we\'re in the same time zone and even Rebecca and I are just an hour apart, but still, it\'s like she\'s already started her day, you know, I might get an email at 630 in the morning, and I\'m just kind of getting around and it\'s like, oh, man, her days getting going now.</p>\n\n\n\n<p><strong>Brian Krogsgard 11:47 </strong><br /> Yeah, she\'s full force. I\'m ready.</p>\n\n\n\n<p><strong>Cory Miller 11:48 </strong><br /> Yeah. So but again, I think it is the constraint is the prioritization. Like today I just thought, Okay, well, you know, one thing I\'ve done is have specific For the first time, probably in my career in about 12 years, I am blocking time out of my, my calendar for recurring meetings to that never done before, but I have to do it and I have to get better at time prioritization to and so even getting the newsletter out today, for instance, I was like, Okay, I got to think about this better because I need to block it out a time, reverse engineer, whatever, we\'re going to get the newsletter out, and then block out time when you guys aren\'t waiting on me for something. So we make sure you get out a good product.</p>\n\n\n\n<p>Brian Krogsgard 12:31 <br /> Yeah. Discipline it. Yeah, it certainly is. And the first person that I saw doing this really effectively They showed me their calendar, they talked to me about how they balance was actually cited baki and, you know, a lot of our listeners will know through awesome motive. He\'s got his hands in five different products at any given time, and incredible amounts of other businesses as well like he does it to an extremely He\'s a robot. He\'s a yes. But he is a time blocking master like I, he showed me his calendar and it\'s colour-coordinated, it\'s day by day. And it\'s broken into, you know, a two hour or four-hour block, 30-minute block. And he\'s got every day of every week assigned to a thing. And it\'s like, here\'s a half-day that goes towards working with Jared on WP forums or a half-day working towards OptinMonster. You know, it may change depending on week by week but he knows before he starts this week, essentially where he\'s spending the every like work hour of that week, he\'s designed his workouts and he\'s designed his, you know, it\'s like, if there\'s family time or travel during the normal workweek like it\'s built-in there too. And I was inspired by that I could not mimic it like I tried it for a little bit and it was too structured for my discipline like his discipline level is just beyond mine. Yeah. But it did give me a framework for saying, Okay, well I have my focus, like Mondays we have a lot of meetings with sky verge. And that\'s like, basically a sky verge only day aside, aside from, if something that really needs urgency from post status comes along. And then it just allows me to structure my days and say, This is my big thing today. It\'s my big thing this other day, this is where I want the majority of my time in my hour spent and I\'ve actually started tracking my hours. And I\'ve been evolving that I\'ve always hated time tracking any job where they like, you know, focused on that. I was always like, Look, I don\'t want to this, you know, like, negotiated my way out of it. And now, I\'m embracing it, but it\'s more for my personal accountability than anything else because I want to know, like, Okay, well, it was I actually spending these hours of these days. On the things that I planned, of course, it helps me like for, you know, for a contract job that helps if you\'re paid hourly. But even for something like what we\'re doing, I had a partnership line item on my time tracker. And I was tracking generally, like, if we got sidetracked, you know, or like, we had a meeting, I would track it. And then if we had, you know, something, especially where it was in a zone that was supposed to be geared towards something else, I wanted to know, like, how far off of my routine Am I getting? And it\'s this intro week, accountability process. So you kind of have an idea of like, oh, man, I\'ve spent more hours over here and I need to be over there. And it\'s been really good accountability for me to better audit my time so that I can then more effectively move forward and be knowledgeable about the way I\'m approaching it. And I\'m not succeeding, like if I say, Okay, well, I want to spend 25 hours over here. 15 over here and two over there like it doesn\'t always work that way. But it allows me to have a target and audit my effectiveness against that target and you really learn a lot when you start doing that.</p>\n\n\n\n<p><strong>Cory Miller 16:15 </strong><br /> Yeah, I go back to the side comment and I\'m joking when I say robot kit but his worth it work ethic i is unparalleled and never seen anything like it maybe my dad who\'s now should be retired for the second time and working 60 hours a week-long gas industry but said is a maniac. But he\'s also I think it the thought about that was like it\'s how we\'re all kind of wired, like, I\'ve had so many people over the years they know I juggle things, spin plates and go Why would you do that? Like tell them wired I mean, and I used to go Why do you only have one project that sounds boring. And so we had this telephone realize to each his own like wired in different ways and have a lot to do that, having said that, you said the word discipline, it\'s some it\'s a word I\'ve been trying to kind of reintroduce into my life. Consistency is another big word. So I\'ve gotten more organized and, and want to line things up where I\'m not dropping balls for sure. And I\'m mixing metaphors here. But, you know, I play doesn\'t drop. But they\'re all important to me. They\'re engaging and I think that makes me me, you know, if we were all carbon copy of each other, it\'d be a bland world and, and all that. So I think to each his own for sure. But I think you\'re talking about something we\'re talking about something that a lot of people go through, they want to strike out on the entrepreneurial adventure, and but they\'re balancing a day job and then I can potentially family. I have a couple of business friends here in Oklahoma City that their entrepreneur story started with. I started my business when my child was six months old. Like, I can\'t imagine that you know, I kind of say, I think it was in kindergarten when we had our first kids had our kids so like, it was to the point where that one that little baby had kind of graduated and was under adult supervision. And then I could kind of turn my time. Now on this season to toe, it\'s just very drastically different. And so, man, I just admire the stories of people that juggle so much, particularly with family while starting this crazy job. This crazy gig we have come entrepreneurship. I, you know, if entrepreneurship was easy, by the way, everybody would do it. Because think about the freedom, the lifestyle you\'re having to live as an entrepreneur, but it comes with a heavy cost. Just talking to a dear friend of mine that I\'ve known for a long time entrepreneur and comparing stories and him saying he\'s had a rough couple of years and going in my part was to say to encourage to go I\'m going to be in your seat at some point. Mukherjee that like this thing, this thing we do called entrepreneurship is just not meant for everybody. And it\'s just a tough thing, but it\'s really thrilling for me to come would say, join you in something that\'s already started, by the way. So that makes this project. They\'re all exciting to me. But this is different in that I can help take something really, really good and make it even better. Where starting new projects. Oh, that\'s that\'s a ton of work, man.</p>\n\n\n\n<p>There\'s a different kind of grind. And they\'re like, what did two years of post as before the club, you know? Yeah, well, that grind of getting the thing off the ground like business takes time.</p>\n\n\n\n<p><strong>Brian Krogsgard 19:45 </strong><br /> One of the things that I think plays into this idea of structure and being able to juggle different things, a lot of it does come down to personality. And for me, you know, I\'ve always achieved a lot So it\'s not it\'s there\'s a difference to me between what I\'m about to describe and like if it\'s laziness or something for me, it\'s not laziness. I have no threat of saying, Oh, I work from home or I don\'t have a, you know, nine to five job. So I\'m going to sit on the couch at my house. That\'s never my personality. But I do procrastinate in my own way, and wait, but why.com is a great website that it\'s called, has a long series from 2013 called how procrastinators procrastinate, and it\'s like the brain of a procrastinator. And what he really breaks it down to is this intimidation of long tasks that makes a procrastinator put that off, and how you can kind of beat that and how to beat procrastination or the way he describes it is he says effective planning turns a daunting item, say like writing a book or launching a website or something big and turning it into a series of small clear, manageable tasks. When you do that, you\'re making something that sounds big he calls he says a remarkable glorious achievement is just what a long series of unremarkable and glorious tasks looks like from far away. So if you break things down, if you have this type of mentality where you can see the short, short term finish line, and turn it into a to-do list or you know a task, then that\'s no big deal. It\'s like, okay, boom, knock out that test, boom, knocked down that task. And then all of a sudden, you\'ve done lots of things that add up to be this really big, more glorious thing of accomplishing your goal. And I\'ve found that I have got to structure my day to day that way. And I\'ve really embraced note-taking but it\'s kind of a hybrid between notetaking and to-do list stuff, where I take notes of like, okay, what\'s my, what\'s my main jam, like what I have to capture today? Sometimes it\'s an idea and some times it\'s deliverable, and then turning it into these to-do lists that I accomplish inside that week. And then you add that in weekend and week out and hitting those to-do items. That\'s when the real changes and effects start to take place for me.</p>\n\n\n\n<p><strong>Cory Miller 22:14 </strong><br /> Yeah, well, no, I completed my master\'s degree. When I was in my late 20s. I went back to school, and the staff there at that college in the adult program said, How do you eat an elephant? One bite at a time. And, you know, I\'ve used that a lot with teams, helping coach teams that I\'ve led, and others is this big task that you have breaking it up into small parts. And then I think there\'s something to be said of, I think it\'s James clear. The author, prolific blogger that talks about, you know, consistency, like if you\'re going to write a best selling book, it\'s, you know, break it down if it\'s 50,000 words is 500 words a day. For X amount of months kind of thing. Now, I don\'t know what to believe I have that discipline in me to show up every day and just write 500 words a day. And but I believe that if you do that you will show up, you know, an X amount of months with something. And this is the harder pill for me to swallow sometimes, just again, how I\'m wired. I\'m not trying to make excuses, but just saying it\'s, it\'s not an easy task. Some people make it look easy, but the reality is, you\'re probably wired in a different way.</p>\n\n\n\n<p><strong>Brian Krogsgard 23:30 </strong><br /> One of the things I learned from Pagely was that the price of hosting or the expensive hosting is really a relative thing. What Pagely might be able to do for $1,000 might end up costing three to 5000. At hosts that don\'t do these large setups all the time. I called our chatted rather with the CEO of Pagely, Joshua Strebel, several years ago and said, Hey, we\'re comparing options between Pagely and some of the other options in the market for really high scale websites. And what I realized was that on an apples-to-apples comparison, I was getting more with Pagely for less money. Now granted, we\'re talking about hosting for $1,000 a month, but so it\'s expensive for a website. But when a website was being quoted from other providers for $3,000 Plus, I was really getting excellent service from Pagely, for the price. If you have websites where you really rely on your website provider, being reliable, have excellent human support. I can\'t remember the last time it took longer than I don\'t know an hour for like a real answer to a support question, not an auto-answer, but someone that was, you know, taking a technical look at my issue. And getting back to me for about some question. I have almost always a question of my own fault. Not to do with my actual hosting plan, but where I just needed help. Pagely has plans for everybody. Whether it\'s that thousand dollar type of VPS or $200 for five sites, that\'s what their small VPS instance sets up for you. It\'s all built on AWS, they\'ve really fine-tuned it really, really well over the years. It\'s an excellent service go to Pagely.com to try Pagely today, let a little post that essentially. And they\'ve been a longtime partner, good friends of the show, and Post Status, and I can\'t recommend them enough. I trust my own websites to Pagely, go to Pagely.com. Thanks to Pagely for being a Post Status partner.</p>\n\n\n<p>One of the things you had me do when we were just trying to figure out would we make good partners was an assessment through Colby, calm kayo LP calm, and that was stuck with me. You had me do a couple of them which I thought was fun across the board. And just the fact that you wanted me to do that told me a lot about the type of partner you could be you know, like the way your mind works first. is mine. The Colby one I thought was interesting because it gave me an understanding of how I work. You have an understanding of how you work based on your assessment profile. And then it tells you Okay, well because you have this and you have this, you YouTube may have conflict in this way. Or you may have a really nice jelling in this way, and why you talk about how that kind of fits into this. So if I\'m talking about my, I need these, you know, big pictures fine. But then if you just say, take the big picture, go write a book, I\'m in trouble. But if you say take the big picture and go write some like thousand-word articles on like, okay, I can accomplish this. So, take this assessment, how you blend that and turn it into an effective partnership.</p>\n\n\n\n<p><strong>Cory Miller 26:46 </strong><br /> So my belief is whether it\'s a team or a partner is to leverage your their unique strengths and experiences that I probably don\'t have or if we overlap, there\'s unique this in there and so it\'s Specifically with our partnership, and we did these discovery tools, and I think was two years strengthsfinder from Gallup was the one, we can put these in the show notes. It gives you your top five strengths. And then so let me unpack that. So Strengths Finder is one that I had to do because I kind of wanted to see verify probably what I already thought about what your unique strengths were and what you believe that they are. And real quickly with that, I can go there\'s overlap, but there are differences. And that\'s why I like one of yours, I think is analytical. And that shines brightly, everything post at us. Like I told you years ago, what I always found value was your insight and analysis of everything that was breaking. Like I wanted. I might not agree with you every single time but I was like, No, I want a different perspective. And that\'s something I knew ahead of time, but it helped me just kind of really identify that. So the street corner does that with teams with partnerships, whatever. And by the way, that joke was I thought you\'re gonna say this But when my wife and I first met I had to do these two and she was like what the heck you\'re you have to take a test today you to see if I\'m, you know, married. Now she\'s a big fan. But Colby is really interesting because it\'s how you instinctively take action. And we started with Strengths Finder and then we evolved into Colby because I wanted to see how you instinctively took action. So this four modes factfinder, which is, you know, a high fat fighter which you happen to be is very I mean, it lends to everything you\'ve done, which is analytical research, I mean, dive deep into an area of a middle road factor under which is I want the essential truth. And the three other areas are quickstart. Most entrepreneurs, many entrepreneurs, I should say are quickstarts Hi, quickstarts. I\'m a high quickstart The other one is the blue one, which is follow through and it\'s not like you can\'t ever fall through but it\'s step by step. mode of action. If you have a problem, I\'m going to figure out step one, step two, step three, step four, the yellow is implementation. People behind that are the ones like mad Danner who are amazing with their hands and like woodworking and different things or whatever, like very high implementers, are. And then we also want to focus found from you is that we had, we had compatible things where I knew we could work really well together, but I knew there was also willing sounds like you\'re a medium quickstart which you and I could ideate all day and not get anything done. So that was the thing we talked about, you already recognized it. factfinder is great because we\'re kind of in that mode, where we\'re not in what Colby calls conflict, but we\'re low in the blue, which is step-by-step plan. We\'re kind of find the shortcuts, bandaid it together, put it together and do that. So we talked about that actively. You already recognize that but I helped us talk through, okay, our similarities can also be our weaknesses. We need someone to kind of help us. And I know David and Dan really help us with some of those things that we might go, man, let us we\'ll do it at the last minute.</p>\n\n\n\n<p><strong>Brian Krogsgard 30:10 </strong><br /> And just being cognizant of that, as we go about our day to day in partnership, you know, it allows me to say, Okay, I need to think I need to be sure and know, like, here\'s our plan, we came up with our plan, we\'ve got these ideas and the follow-through component or the, you know, the take it to execution side of things. It\'s like, I have to make sure that we both understand what to do, where to go and bring people along to help us accomplish that. And so far, I think that\'s been effective. And sometimes that\'s tooling you know like it\'s one thing if we have our all our conversations and slack and we have these pages of notes, in our note keeping apps and we, you know, collect our thoughts, but then it\'s another to say, Okay, well, let\'s put it on a schedule and let\'s set a date for When we\'re going to launch this thing, and let\'s have our plan of action for, you know, who\'s responsible for what, and put deadlines on that across the way. And to me that tooling side of things, which could be as simple as base camp or whatever, is my way of introducing accountability to an area where we both identified kind of on the same side of the spectrum, which is, in that in that particular instance, it\'s kind of the kind where it\'s like, ours has its own benefits, like the way we sit. But you really need that person that\'s like, the big long spreadsheet, project manager, very type a type of person to help rein us in, when we could end up down a whole bunch of different rabbit holes. You know, Id aiding the next two years of what post status is going to be and it\'s like, well, someone\'s got to do what we\'re going to do in the next two weeks or the next two months and yeah, so that gives us that accountability there.</p>\n\n\n\n<p><strong>Cory Miller 31:57 </strong><br /> Well, we\'re supposed to record this podcast six hours. ago, I think. And we had, you know, part of that was we had thought we still were so new in our partnership and trying to get some things done at post that is that we need to have the time. But we had deliberately two weeks ago, set this date to record and then now we\'re six hours later recording it. But I know we\'ll get to those types of things. But it\'s that, you know, we could wear that. I think you and I are kind of wired to be the squirrel. You know, movie idea. Okay, let\'s face it. We\'ve talked about that. And we both have, I think helped each other rein it in on that, like, hold on. This is first that second, this third, right? Yep, yep. Yep. Let\'s go back to that because it\'s really fun to dream. It\'s really fun to ideate and think about cool stuff, especially as quickstarts and the Colby kind of mantra. So, but there needs to be somebody that also says, Okay, let\'s stop dreaming now. Let\'s go do</p>\n\n\n\n<p><strong>Brian Krogsgard 32:58 </strong><br /> Yeah, and I think been proud of how we\'ve so far been able to do that. And we realize it\'s important. And I think maybe one of the things that has allowed us to do it is, when we first started the partnership, we, and you really helped me outline this. And it\'s like, what are our goals? For the business for the partnership, where we want to be a year, two years and three years? And therefore we say, Okay, if this thing is effective in January next January, what have we accomplished? And we said, okay, we want you know, certain things, it\'s a number of subscribers or it\'s a number of page views or a number of members or a degree of like member satisfaction, like things that you want to strike and then it\'s how do you plan to accomplish that and keep that as your goal, how many dollars you need to make a day if your dollar goal for the year is this? And that was really helpful for me to put all that in context.</p>\n\n\n\n<p><strong>Cory Miller 34:00 </strong><br /> So one other thing I did, I think I told you this either as I\'ve had a coach for a year and a half now a personal coach. Fantastic. name is Kelly. We came into this and she was like, Okay, got five projects, what do you need for me? And I was like, here\'s what I think I need me to go weekly. And what I don\'t want to do, my virtual assistant helps me take certain tasks that I need to just create my time, you know, to do other things. My coach is okay, here\'s the deal. I\'m highly invested in my time, my money, my energy and all these projects, and they\'ve got to make progress. I\'ve got to move the needle. That is the most impactful things. So what we do now is each week we do a 30-minute laser call. And I talked to the big issues, I think through the projects, and I go, can we post those this week? We need this. And what and she helps me get clarity on that before by the way. I have my partner calls like with you. We knew our calls on Friday to do my call with Rebecca on Wednesday. My partner Jeff on Monday. So I\'m like, man, there\'s too much stuff going on, I\'ve got to have that kind of clarity. And she\'s helped me rehearse and get ready for because like, for instance, I try hard not to ping you. Because I know there\'s a bucket of time, there\'s a bucket of energy that probably is owned mostly by Erica and your two kiddos. And I want to be really careful what I withdraw from that. So. So she\'s helped me go in, I looked over the last 30 days. So every week is a 30-minute call to kind of get ready and make sure I\'m on task for all the projects. The last meeting, which I just had this week, is a one hour kind of look back over the last 30 days, and then they look forward to next Thursday. So make sure I\'m keeping progress with all the critical projects going on. And that\'s just another level of optimizing for. There\'s a lot on the line for me. There\'s a lot of love for you and my other partners and so I want to make sure we\'re focused and making the most progress, we can For all of these so that we can say, high five and go, this is this, these were the best times. What resonated with me for you, Brian is you said for years, you know, Kevin did it by yourself, I Exodus ran into your burnout that post like it was the first sentence burned out. And I was like me and I can resonate with that. And one of the compelling things that he said to me as I said, I don\'t want to do this alone. Again, I could, I could sell this, I could do this and just leave. But I just really don\'t want to do it alone. And that I told you then resonates with a lot of social entrepreneurs. It\'s tough doing it by yourself. I had aside amazing psychic command, enter and I think to help me not do it alone. And then a group of us were friends, WordPress, none of WordPress helped me over the years. But man, that\'s something that you can mention too, is how a partner or a team or somebody that can come alongside you is so powerful.</p>\n\n\n\n<p><strong>Brian Krogsgard 36:55 </strong><br /> Yeah, there\'s two things there applies to both of these. I guess. A lot of people, you know, they dream when they\'re in a normal nine to five job. They\'re like, Okay, well, I have so much more upside potential or so much more opportunity for freedom and all these things if I go out on my, on my own, and work on this thing and turn my hobby into my business or turn my side gig into a full-time gig, and I think it takes several years potentially, of doing that before you oftentimes for and maybe it\'s for certain personality types that then they say, Okay, this has some real benefits, but there are some real drawdowns to that I need to consider and for me, okay, I love the freedom. I love the upside potential. But at the same time, I liked working with people and I liked bouncing things off teammates, and that was an important thing for me to figure out how can I recapture and I think a lot of people that might be listening to this talking about juggling multiple things, working with a partner, maybe they\'ve all kind of landed on that. So now, there\'s this kind of fundamental balance there, where when you\'re juggling multiple things, none of them is necessarily such a security blanket or a safety that is the same as a full-time job. So this balance is how do you spend time in the places where you can make money, yet none of them are probably sufficient relative to what you could make it a full-time job. Like, say, if you were making $100,000 and a full-time job while your main side hustle, it, maybe it\'s making $50,000 and your other side hustles making, you know, another $50,000? Well, you\'re making $100,000 total, but it requires this balance between the two of them. In our situation, you have partners so like my needs from the business, do they align well with your needs from the business from a revenue standpoint, there\'s so much balance and inertia. So you have to balance like, okay, I want to work with people. I want to have this freedom. But there\'s all this balance. that\'s required there and I would be curious if you have any kind of final tips to find the sweet spot while you\'re doing that.</p>\n\n\n\n<p><strong>Cory Miller 39:09 </strong><br /> Yeah, so you know for years I said it\'s a sidekick it\'s it\'s the Matt Danner, it\'s someone that just is doesn\'t have as has compatible strings to you. And but you\'re not strong in the same area where you can kind of divide and conquer. And so I\'ve honestly thought about it as a work spouse, you know, to Bandy that. That phrase around a little bit, but I mean, there\'s an element to that work spouse, like having someone you can confide in. And I bet you there are entrepreneurs and founders solopreneurs listening to this today. That is like, in the spot you were and by the way, when I struck out, it\'s been a year ago this week, I\'m back on my own. I didn\'t want to do it alone. I wanted to do with other people, and I found some great people. One of them being you and Do it together and collaborate. So, but I think, you know, somebody goes, why don\'t we give away equity I get that then finally struggle psychic, a workout spouse that feels ownership that you could give some rewards if they need it. But find that person that is the end to your Yang. We missed that. And then secondarily, I\'ll tell you, I know the work psychic work spouse type thing is hard. And the partnership conversation is hard. But I\'ll tell you and this is something you\'re not been talking about. Small groups of like-minded people on the same path with the same values have been life-saving and changing for me. So I\'ve been in one group for nine years now. 10 years almost. I\'ve helped start to more. We\'re talking about trying to get that kind of group. people in the room to rub elbows that get it they understand the story. So I always get the joke. Most of us don\'t know. Your parents don\'t know what they we do. Living Dead still thinks I just upgrade the computer somehow. But you know, having a group of people that just get you, know you, not talk you\'ve got some dear friends you lean on, you meet with weekly even as the same can be those kinds of compatriots that like, you can let your guard down and, and share like today sucks. And I\'ve tried to be that for people and also clean to those that are like vulnerable and genuine and authentic and are willing to let the guard down the shields down, take the mask off all that kind of stuff and go Hey, not everything is rosy. So, you know the two things is one is finding someone in the business that can work with it, that just gets it. That\'s a hard one I know. Second is to find a group of people that are on the same path as you then share life and go deep and it doesn\'t always have to be personal or a business. It can be personal, some of the most endearing moments I\'ve had with my friends. That I count as brothers and sisters. I mean, like they are family to me. If something were to happen to me, they\'d be the first people at my house scene if Lindsay and the kids were okay. But finding that group of people and you and I\'ve been talking about this, how do we do that through post tennis community to pull in our amazing community of founders, entrepreneurs, and give that type of like, being in the room together and sharing that stuff that it\'s the high fives, and it\'s the hugs that you need when things are just bad. So that\'d be my two takeaways.</p>\n\n\n\n<p><strong>Brian Krogsgard 42:35 </strong><br /> How about yourself? That\'s really good on and I think that\'s, I\'ll leave it there from a partner perspective. I\'ll jump back to the juggling things and just get my final. My final comparison maybe so I\'m thinking, Okay, well for you know, somebody that\'s somewhat technical or works in the web industry at minimum. All right. So if I gave you the challenge to say, hey, this website\'s slow, we need to speed it up. Well, if the first thing you would want to know is, where is it slow? Why\'s that slow and cut audit that process. And I think that that was the biggest thing that I had to come to the terms with, which was if I\'m going to juggle multiple things I need to know, where\'s my time going? I don\'t know how many times I had these weeks where the week goes by much less the day and it\'s like, okay, I had stuff I wanted to accomplish. I know I didn\'t accomplish everything on my list. But when I look back, I felt busy. But the results weren\'t there. What happened? And that is dangerous. Because you\'re not auditing. You\'re not knowing where your energy actually went. So that you can iterate and improve. It doesn\'t mean you have to be perfect. It doesn\'t mean you have to have like every hour tracked. But I think if you\'re going to make your website faster and more efficient, the first thing to do is to identify what are the processes that are slowing it down right now what is like what are the pivot points The what are the bottlenecks? Where\'s my time being consumed? And where, when I look at that, if I say I\'m spending 10 hours a week on phone calls, or if I\'m spending 10 hours a week, you know, in support, okay, what\'s the value of the time that I\'m spending there? And the best thing to do in juggling those multiple things is to try to find the difference makers in that time and spend more time on the difference makers and find out how to bring someone else in a contract or the or offload it to your partner if they\'re really good at it, and getting them to do those things. You\'ve told me I don\'t even know how many times since, you know, we started talking about talks about you know, managing support, which is pretty light with post status, but you were like, I don\'t want you in support, like get out of there. And I\'m like, okay, that\'s okay, that makes sense. But we still need to take care of support, but it starts by identifying how much time am I spending in that type of communication and Therefore, how can I effectively bring someone else on to take that task or put it in a certain bucket like I\'m going to do support every Monday and every Thursday or something like that. And that way, it\'s not kind of floating along with me the whole time. And that\'s what I found most effective in terms of auditing, and improving my personal processes to be able to juggle multiple things, which is an ongoing battle and ongoing struggle, but one that I\'ve certainly seen progress on, especially since I started self-auditing where I was spending my time</p>\n\n\n\n<p><strong>Cory Miller 45:38 </strong><br /> Yeah, that\'s really good. In my calendar if it\'s on my calendar, so I can get done. I don\'t do the time blocking like said this, but for mostly, but man I live by that calendar and I\'ve had to start trying to bracket time for certain things. But I think the audit is so good. Always be optimizing. You know, because again, We, you know, in this project have very limited time and energy. And so we put our best into it, but I want to prioritize that time and then optimize for bugs like, Okay, are we spend too much time here too. We, you know, and I think that kind of review helps us make good decisions to and going, Okay, this is the new here. This is the morning side, like the dashboard says, overheat or something, you know, we can go in and go Okay, well, how do we collaboratively figure this out?</p>\n\n\n\n<p><strong>Brian Krogsgard 46:31 </strong><br /> Yeah. Well, let\'s optimize this podcast a bit and leave it there. Thanks, everybody, for joining us. Thanks, Corey, for chatting with me. This was obviously relevant for us and these are always self-reflective, we\'ll be able to think back on what we said here and how we can do better from here. I hope that it helps you as well. I hope everybody has a great week and we go to post that comm slash club and sign up if you haven\'t already. Corey and I spent the majority of our time figuring out how to make the club better and more appealing to people that are already members and would consider being members. So if you\'re not opposed to as club member, you\'re going to miss out. So go to PostStatus.com/Club and sign up and we\'ll talk to you soon. Bye-bye.</p>\n\n<p>Transcribed by https://otter.ai</p>\n\n</div>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 04 Feb 2020 01:13:05 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Brian Krogsgard\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:29;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:86:\"WPTavern: Ahmad Awais Launches Script to Automatically Deploy WordPress Plugin Updates\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96942\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:217:\"https://wptavern.com/ahmad-awais-launches-script-to-automatically-deploy-wordpress-plugin-updates?utm_source=rss&utm_medium=rss&utm_campaign=ahmad-awais-launches-script-to-automatically-deploy-wordpress-plugin-updates\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6426:\"<p>Today, Ahmad Awais <a href=\"https://github.com/ahmadawais/wp-continuous-deployment\">launched WP Continuous Deployment</a>, a continuous deployment pipeline for updating plugins hosted on WordPress.org via GitHub actions. It is a Node.js-based CLI script that simplifies the process of keeping plugins updated. Developers only need to type out a single line in their terminal or command prompt. Other than setting up a couple of secret keys on GitHub, the script handles everything in just a few moments.</p>\n\n\n\n<p>“We live in the age of agile workflows,” wrote Awais in the <a href=\"https://ahmadawais.com/wp-continuous-deployment/\">project announcement</a>. “Developers only want to <code>git commit && git push</code> and expect their products to be deployed globally…It’s been a minute since I worked on a WordPress project, but for the last year or so, I’ve been fantasizing about a git-based plugin deployments workflow that will allow me to get away from those old SVN repositories finally.”</p>\n\n\n\n<p>On November 14, GitHub <a href=\"https://github.blog/2019-11-14-powering-community-led-innovation-with-github-actions/\">announced it was rolling out GitHub Actions</a>. Actions are a way for developers to automate workflows from their Git repositories. Developers can share, fork, and reuse them across projects. A few days later, <a href=\"https://wptavern.com/10up-releases-github-actions-for-simplifying-wordpress-plugin-deployment\">10up launched two GitHub actions</a> for WordPress plugin developers. These Actions are the basis for WP Continuous Deployment.</p>\n\n\n\n<p>10up’s <a href=\"https://github.com/marketplace/actions/wordpress-plugin-deploy\">WordPress Plugin Deploy</a> Action handles deploying plugin updates directly to the WordPress plugin directory. The <a href=\"https://github.com/marketplace/actions/wordpress-plugin-readme-assets-update\">WordPress.org Plugin Readme/Assets Update</a> Action handles committing changes to a plugin’s readme or assets. The WP Continuous Deployment script automatically adds both and sets up appropriate GitHub workflow files for each.</p>\n\n\n\n<p>“What I hope to accomplish with WP Continuous Deployment is make it easy for any developer to use the GitHub Actions built by 10up and others and help migrate to this new workflow with a pinch of automation,” said Awais. “Without WP Continuous Deployment, migrating to GitHub Actions for deploying WordPress plugins is a task that requires knowledge of how GitHub Actions work, what files you have to create, what secrets are, and where to put them. We lose a great number of developers that are unable to figure out this step — due to a bulky and dry operational experience.”</p>\n\n\n\n<p>The workflow for many WordPress developers today runs directly through Git, primarily with repositories hosted on GitHub. Often, developers expect any committed code to automatically deploy to the places it should go, such as production websites. </p>\n\n\n\n<p>The WordPress plugin directory system, which relies on SVN instead of Git, can sometimes be a bottleneck in team workflows. Some teams even have developers who have never used SVN in their careers. It makes sense for teams to use a single system. Doing so leads to fewer bugs and requires fewer resources to train people on a dying version control system.</p>\n\n\n\n<p>“We’re not doing anyone a favor by keeping SVN around,” said Awais. “Projects are hiring hundreds of open source developers to make it easy for the developers’ community to interact with their projects. Whereas WordPress — that once held that edge — has started to lag behind by making it hard and impractical to get started with WordPress development. Go pick 100 random students for universities all over the world and ask them to start an open-source project. You’ll be amazed by the majority of them choosing to start with Git and MIT license. And, here in the WordPress community, we ask people to use SVN. That’s impractical and inaccessible for a majority of developers today.”</p>\n\n\n\n<p>Awais said that GitHub Actions have allowed his team to shed a lot of dead weight. He originally did not make his GitHub Actions open source because they were specific to his use cases. After trimming the code down, he realized they were not any different from the Actions that 10up had already released.</p>\n\n\n\n<p>“I see dealing with SVN as a DevOps task,” he said. “Something web developers should not be concerned with in 2020. Web developers want to build websites. They want to use Git to do that. With JAMstack, everyone has become accustomed to the idea of pushing a git commit and getting the new build/release. That’s why I built WP Continuous Deployment.”</p>\n\n\n\n<h2>Set up in 1, 2…</h2>\n\n\n\n<img />Running the setup process for WP Continuous Deployment\n\n\n\n<p>When I originally tested 10up’s GitHub Actions last year, there was a small learning curve. I had to figure out what those new workflow files were for and whether I needed to change things. It was not an overly complicated process, but there was a moment of confusion or two.</p>\n\n\n\n<p>What Awais’ script does is take those two GitHub Actions one step further and automate nearly all of the setup.</p>\n\n\n\n<p>Developers must have Node.js installed on their computer to run the script, which is fairly common today. With a single command of <code>npx wp-continuous-deployment</code>, the script is installed. It then prompts you to enter your WordPress.org plugin slug to set everything up. Once done, you merely need to create a couple of secret keys on your GitHub repository.</p>\n\n\n\n<p>Awais wanted to automate the entire process. However, GitHub does not yet have an API for creating secret keys. Until that happens, it is the only manual step required.</p>\n\n\n\n<p>Within two minutes of choosing which repository I wanted to test the script on, I had everything in place and ready to go. Now, I just need to find some time to actually write code for some of my numerous plugins so I can truly put this script to the test. Thus far, things are looking good.</p>\n\n\n\n<p>It may finally be possible for me to purge everything related to SVN from my life. That would be a welcome change. <code>#lifegoals</code></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 03 Feb 2020 21:23:49 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:30;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"WordPress.org blog: The Month in WordPress: January 2020\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8316\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/news/2020/02/the-month-in-wordpress-january-2020/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5941:\"<p>Following an action-packed December, 2020 is off to a fine start with some new releases and announcements. Read on to find out what happened in the WordPress project in January.</p>\n\n\n\n<hr class=\"wp-block-separator\" />\n\n\n\n<h2>Release of Gutenberg 7.2 & 7.3</h2>\n\n\n\n<p><a href=\"https://make.wordpress.org/core/2020/01/09/whats-new-in-gutenberg-8-january/\">Gutenberg 7.2</a>, the first Gutenberg release of 2020, was deployed on January 8th and included over 180 pull requests from more than 56 contributors. This was followed soon after by <a href=\"https://make.wordpress.org/core/2020/01/22/whats-new-in-gutenberg-22-january/\">Gutenberg 7.3</a>. New features include a new Buttons block, support in adding links to Media & Text block images, improvements to the Navigation and Gallery blocks, performance improvements, and accessibility enhancements. These releases also included many additional enhancements, fixes, new APIs, documentation, and more.</p>\n\n\n\n<p>Want to get involved in building Gutenberg? Follow <a href=\"https://make.wordpress.org/core/\">the Core team blog</a>, contribute to <a href=\"https://github.com/WordPress/gutenberg/\">Gutenberg on GitHub</a>, and join the #core-editor channel in <a href=\"https://make.wordpress.org/chat/\">the Making WordPress Slack group</a>.</p>\n\n\n\n<h2>Proposal for an XML Sitemaps Feature Plugin</h2>\n\n\n\n<p>In June last year, a team of contributors <a href=\"https://make.wordpress.org/core/2019/06/12/xml-sitemaps-feature-project-proposal/\">proposed</a> a feature plugin that would bring standardized XML sitemaps to WordPress Core. Since then, the team has been working to bring this to reality and <a href=\"https://make.wordpress.org/core/2020/01/27/feature-plugin-xml-sitemaps/\">have now published a working plugin</a> to demonstrate this new capability.</p>\n\n\n\n<p>The plugin is still in development, but the included features already provide much-needed functionality from which all WordPress sites can benefit. You can install the plugin from your WordPress dashboard or <a href=\"https://wordpress.org/plugins/core-sitemaps/\">download it here</a>.</p>\n\n\n\n<p>Want to get involved in bringing this feature to Core? Follow <a href=\"https://make.wordpress.org/core/\">the Core team blog</a>, report any issues you find <a href=\"https://github.com/GoogleChromeLabs/wp-sitemaps/issues\">on GitHub</a>, and join the #core channel in <a href=\"https://make.wordpress.org/chat/\">the Making WordPress Slack group</a>.</p>\n\n\n\n<h2>A New Block-Based Themes Meeting</h2>\n\n\n\n<p>The Theme Review Team has <a href=\"https://make.wordpress.org/themes/2020/01/29/new-bi-weekly-block-based-themes-meeting/\">announced</a> that they will be holding bi-weekly meetings in the #themereview channel focused on discussing block-based themes. If you are interested in discussing themes within the context of Gutenberg’s full-site editing framework, this will be the place to do so! The first meeting will be held on Wednesday, February 5, at 16:00 UTC.</p>\n\n\n\n<p>Want to get involved with the Theme Review Team or <a href=\"https://make.wordpress.org/themes/handbook/get-involved/become-a-reviewer/\">become a reviewer</a>? Follow <a href=\"https://make.wordpress.org/themes/\">their blog</a>, and join the #themereview channel in <a href=\"https://make.wordpress.org/chat/\">the Making WordPress Slack group</a>.</p>\n\n\n\n<hr class=\"wp-block-separator\" />\n\n\n\n<h2>Further Reading</h2>\n\n\n\n<ul><li>The Core team has started work on WordPress 5.4 and kicked off their planning with <a href=\"https://make.wordpress.org/core/2020/01/14/wordpress-5-4-planning-roundup/\">a summary post</a>. You can follow all the v5.4 updates by watching <a href=\"https://make.wordpress.org/core/tag/5-4/\">the version tag</a> on the Core team blog.</li><li>The inaugural <a href=\"https://2020.asia.wordcamp.org/\">WordCamp Asia</a> event is taking place in February. This will be the largest WordPress event in the region, bringing together around 1,500 WordPress enthusiasts from around the world.</li><li>Two WordPress community leaders, <a href=\"https://profiles.wordpress.org/chanthaboune/\" class=\"mention\"><span class=\"mentions-prefix\">@</span>chanthaboune</a> and <a href=\"https://profiles.wordpress.org/andreamiddleton/\" class=\"mention\"><span class=\"mentions-prefix\">@</span>andreamiddleton</a>, <a href=\"https://wordpress.org/news/2020/01/wordpress-leaders-nominated-for-cmx-awards/\">were nominated for CMX awards</a> due to their work on the WordPress project, with <a href=\"https://profiles.wordpress.org/andreamiddleton/\" class=\"mention\"><span class=\"mentions-prefix\">@</span>andreamiddleton</a> winning the award for Executive Leader of a Community Team.</li><li><a href=\"https://make.wordpress.org/core/2020/01/29/lazy-loading-images-in-wordpress-core/\">A feature plugin has been proposed</a> that introduces lazy-loading images to WordPress Core, which will be a huge step forward in improving performance all across the web.</li><li>The Core team has put together <a href=\"https://make.wordpress.org/core/handbook/tutorials/faq-for-new-contributors/\">an extensive and informative FAQ</a> to help new contributors get involved in contributing to the project.</li><li>One key priority for Gutenberg is the ability to control the block editor. There are already a number of APIs that control the experience, but there is a lack of consistency and missing APIs. <a href=\"https://make.wordpress.org/core/2020/01/23/controlling-the-block-editor/\">A method to address this</a> has been proposed.</li><li>The Design team <a href=\"https://make.wordpress.org/design/2020/01/24/gutenberg-phase-2-friday-design-update-43/\">published detailed information</a> on the recent design improvements in Gutenberg.</li></ul>\n\n\n\n<p><em>Have a story that we should include in the next “Month in WordPress” post? Please </em><a href=\"https://make.wordpress.org/community/month-in-wordpress-submissions/\"><em>submit it here</em></a><em>.</em></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 03 Feb 2020 09:54:06 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Angela Jin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:31;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:106:\"WPTavern: Join the Future of WordPress Themes Conversation: Theme Review Team to Hold Biweekly Discussions\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96885\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:255:\"https://wptavern.com/join-the-future-of-wordpress-themes-conversation-theme-review-team-to-hold-biweekly-discussions?utm_source=rss&utm_medium=rss&utm_campaign=join-the-future-of-wordpress-themes-conversation-theme-review-team-to-hold-biweekly-discussions\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4418:\"<p class=\"has-drop-cap\">In collaboration with the core design and editor teams, the WordPress theme review team will begin <a href=\"https://make.wordpress.org/themes/2020/01/29/new-bi-weekly-block-based-themes-meeting/\">hosting biweekly (fortnightly) meetings</a> on the future of themes. The meetings will be held every other Wednesday on the <a href=\"https://wordpress.slack.com/messages/themereview/\">#themereview WordPress Slack channel</a> at 16:00 UTC. The first meeting is on February 5.</p>\n\n\n\n<p>Phase 2 of the Gutenberg project is about tackling site customization. This covers everything from turning sidebars into block containers to redefining how themes will work in a block-based system in the coming years. The latter is a huge unanswered question. There are several ideas on how themes should be handled.</p>\n\n\n\n<p>Kjell Reigstad, a design director for Automattic, proposed the meeting as a step toward answering the future-of-themes question. “The main thing I’d like to accomplish is to build up regular cross-team communication around the theme plus full-site editing work,” he said. “There are so many potential changes on the horizon, and we really need perspective from both the Gutenberg folks and theme authors. I know it’s difficult to keep up with all the development happening, and I thought this dedicated meeting would be a great place to stay up to date and share ideas on a regular basis.”</p>\n\n\n\n<p>Currently, the agenda for the first meeting is still open but should be posted next week. Anyone who wants to participate or make sure an idea sees discussion, should let the team know in the <a href=\"https://make.wordpress.org/themes/2020/01/29/new-bi-weekly-block-based-themes-meeting/\">announcement post’s</a> comments.</p>\n\n\n\n<p>“I’d initially like to try and get everyone on the same page in terms of what’s happening already on the Gutenberg front,” said Reigstad. “So for instance, the experimental block-based themes implementation and the global styles work. We’ll likely go over those a little bit, share links and updates, and then pivot into some discussion questions.”</p>\n\n\n\n<p>Bringing in the theme review team is imperative for a smooth transition into whatever themes eventually become. “There’s already a lot of full-site editing work going on, and there are already experimental reference documents for block-based themes,” said Reigstad earlier this week in the team’s regular meeting. “It’s important for the TRT and the theme community to keep up to date on this work, and to develop a clear communication loop with the Gutenberg teams.”</p>\n\n\n\n<p>There is some concern that the concept of full, block-based themes will simply be railroaded into core WordPress, regardless of feedback. Not all members of the theme review team or theme authors are supportive of the idea.</p>\n\n\n\n<p>Theme reviewer Joy Reynolds pointed out in the announcement’s comments that using the phrase “block-based themes” in the meeting title shows bias in favor of themes made of blocks. “Why is the current Full Site Editing code outside the scope of the Customizer?” she asked. “What is the goal? Is it even something that makes sense for themes? Don’t we need a merge proposal? Or even a consensus on design before forcing these changes into core and having meetings about using experimental code as if it’s the only choice?”</p>\n\n\n\n<p>These are questions that will certainly come up in the meeting.</p>\n\n\n\n<p>Block-based themes already feel like a foregone conclusion. The initial code is currently in the Gutenberg plugin, albeit as an experimental feature. There is already <a href=\"https://wptavern.com/initial-documentation-for-block-based-wordpress-themes-proposed\">documentation for building such themes</a>. There is a core <a href=\"https://wptavern.com/get-involved-with-block-based-wordpress-theme-experiments\">theme experiments repository</a> Everything seems to be moving full-steam ahead in that direction.</p>\n\n\n\n<p>Whatever direction themes end up going, the meeting will at least offer an opportunity for the community to add their input. For success, the editor, design, and theme review team members will need to find some common ground to begin their discussions.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 31 Jan 2020 20:49:54 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:32;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:57:\"WPTavern: Native Lazy Loading Support Coming to WordPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96875\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:159:\"https://wptavern.com/native-lazy-loading-support-coming-to-wordpress?utm_source=rss&utm_medium=rss&utm_campaign=native-lazy-loading-support-coming-to-wordpress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4789:\"<p class=\"has-drop-cap\">It seems to be the week for dropping news of WordPress feature plugins. Felix Arntz, WordPress core committer and developer programs engineer at Google, announced a <a href=\"https://make.wordpress.org/core/2020/01/29/lazy-loading-images-in-wordpress-core/\">plan to push a lazy loading feature</a> to the platform. If testing goes well, this feature could land in WordPress 5.4 in March.</p>\n\n\n\n<p>The concept of lazy loading allows a webpage to render without loading certain resources until they are needed. This leads to faster page loads and saves data on the visitor’s end. Lazy loading is particularly useful when rendering images on the web. </p>\n\n\n\n<p>The opposite of lazy loading is called <em>eager</em> loading, which loads everything in bulk. By default, this is how all images are loaded on the web. This often leads to poor performance on image-heavy webpages where many of the images are not in the site visitor’s viewport when first viewing the page.</p>\n\n\n\n<p>For many years, various JavaScript libraries have handled this feature but not always to success. A native solution is slowly making its way into browsers. Native lazy loading works by adding a <code>loading</code> attribute to an <code><img></code> or <code><iframe></code> element. Browsers can then decide how to load a resource based on the value of the attribute. Currently, <a href=\"https://caniuse.com/#feat=loading-lazy-attr\">Chrome, Edge, and Opera</a> all handle the loading attribute. Once the attribute officially makes it into the <a href=\"https://github.com/whatwg/html/pull/3752\">HTML specification</a>, the feature should be a standard that all browsers support.</p>\n\n\n\n<blockquote><p> Adopting the new loading attribute is a great chance for WordPress to lead the way for a faster web overall. </p><cite> Felix Arntz</cite></blockquote>\n\n\n\n<p>The new <a href=\"https://wordpress.org/plugins/wp-lazy-loading/\">Lazy Loading feature plugin</a> is now available in the WordPress plugin directory. The plugin relies only on native browser support and does not add extra JavaScript. The implementation adds a loading attribute to images in post content, excerpts, comments, text widgets, avatars, and instances of using core WordPress image functions. By default, the plugin sets all images to load lazily rather than eagerly.</p>\n\n\n\n<p>It is refreshing to see the continued work by core contributors on more robust image solutions. Along with WordPress 5.3’s <a href=\"https://wptavern.com/wordpress-5-3-improves-large-image-handling\">large image size handling</a>, both features will lead to a generally faster web. With more users loading high-quality images via mobile phones over the past few years, it has only exacerbated the problem of a slow web. That is why it imperative that WordPress continually push for image optimization.</p>\n\n\n\n<p>“With WordPress enabling native lazy-loading by default, it would significantly impact performance and user experience for millions of sites, without requiring any technical knowledge or even awareness of lazy-loading as a concept,” wrote Arntz in the announcement post. “Adopting the new loading attribute is a great chance for WordPress to lead the way for a faster web overall.”</p>\n\n\n\n<p>Arntz and a team of engineers originally <a href=\"https://wptavern.com/google-releases-native-lazyload-plugin-for-wordpress\">released a native lazy loading plugin</a> in September 2019. This was shortly after <a href=\"https://wptavern.com/chrome-76-adds-native-lazy-loading-wordpress-contributors-continue-discussion-regarding-core-support\">Google brought the “loading” attribute</a> feature to version 76 of its Chrome browser. The Native Lazyload plugin currently has over 7,000 installations.</p>\n\n\n\n<h2>How This Affects Existing Plugins</h2>\n\n\n\n<p>Because not all web browsers support the loading attribute, users may not want to automatically drop their current plugins when the feature lands in WordPress. Users may choose to support browsers without native lazy loading for a while</p>\n\n\n\n<p>The proposed code within the Lazy Loading plugin attempts to detect whether the <code>loading</code> attribute exists on an image before applying it. This means the code should play nicely with existing plugins and avoid conflicts in most cases.</p>\n\n\n\n<p>Developers of plugins that handle lazy loading need to start testing their plugins and updating them for WordPress 5.4. Follow the <a href=\"https://core.trac.wordpress.org/ticket/44427\">Lazy Loading API ticket</a> on core Trac to stay updated on when the feature lands and the <a href=\"https://github.com/WordPress/wp-lazy-loading\">GitHub repository</a> for contributing to its development.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 30 Jan 2020 20:22:45 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:33;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"WPTavern: XML Sitemaps Feature Plugin Open for Testing and Feedback\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96800\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:179:\"https://wptavern.com/xml-sitemaps-feature-plugin-open-for-testing-and-feedback?utm_source=rss&utm_medium=rss&utm_campaign=xml-sitemaps-feature-plugin-open-for-testing-and-feedback\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6492:\"<p>Thierry Muller, a Developer Relations Program Manager at Google, and several contributors posted an <a href=\"https://make.wordpress.org/core/2020/01/27/feature-plugin-xml-sitemaps/\">update on the XML sitemaps feature</a> that may land in WordPress this year. After seven months of development, the team has made the <a href=\"https://github.com/GoogleChromeLabs/wp-sitemaps\">XML Sitemaps feature plugin</a> available on GitHub. It is currently open for testing and feedback. The plugin should also be available in the WordPress plugin directory by next week.</p>\n\n\n\n<p class=\"has-background has-gray-100-background-color is-style-default bg-gray-100\"><strong>Update (January 31, 2020):</strong> The <a href=\"https://wordpress.org/plugins/core-sitemaps/\">Core Sitemaps feature plugin</a> is now available in the WordPress plugin repository.</p>\n\n\n\n<p>The project aims to ship a basic version of an XML sitemaps feature to all WordPress installations. It will also offer an API for plugin developers to manipulate. Therefore, sitemap plugins would not automatically disappear. Instead, plugins would offer users various options on how their sitemaps work.</p>\n\n\n\n<p>A team created by Google, Yoast, and other contributors <a href=\"https://wptavern.com/developers-at-yoast-and-google-collaborate-on-proposal-to-add-xml-sitemaps-to-wordpress-core\">originally proposed XML sitemaps as a core WordPress feature</a> in June 2019. Traditionally, WordPress has left this feature to plugins to implement, and many have filled this role over the years. However, several other major content management systems ship with sitemaps as part of their core codebase.</p>\n\n\n\n<p>Many praised the initiative, such as WordPress project lead Matt Mullenweg. “This makes a lot of sense, looking forward to seeing the v1 of this in core and for it to evolve in future releases and cement WordPress’ well-deserved reputation of being the best CMS for SEO,” he said.</p>\n\n\n\n<p>However, several people questioned whether WordPress should ship with XML sitemaps. Some were worried about performance and others felt like the feature should remain in plugins.</p>\n\n\n\n<p>“At a high level, expanding the number of WordPress sites with Sitemaps ultimately speeds up content discoverability by search engines and re-crawl fresher content flagged by the lastmod date faster than a scheduled bot would,” Muller said of the primary reasons the feature belongs in core.</p>\n\n\n\n<p>WordPress users may see this feature arrive in major update this year. “Ambitiously [version] 5.4,” said Muller of the release goal. “Realistically 5.5.”</p>\n\n\n\n<p>The feature plugin currently indexes the following URLs for a site:</p>\n\n\n\n<ul><li>Homepage</li><li>Blog posts page (if not the homepage)</li><li>Posts and pages</li><li>Categories and tags</li><li>Custom post types</li><li>Custom taxonomies</li><li>Users/Authors</li></ul>\n\n\n\n<p>Custom post types and taxonomies are registered only if they are public. There is also a filter hook available to change which post types, taxonomies, and users are indexed. Ideally, WordPress would provide a registration flag for post types and taxonomies.</p>\n\n\n\n<h2>Solving the Performance Issues</h2>\n\n\n\n<p>One of the primary concerns with the initial proposal is how well a core sitemaps feature would perform and scale, particularly on larger sites. Without a full caching solution built into core, it presented some hurdles for the team.</p>\n\n\n\n<p>“Solving the performance issue is not trivial, and we have looked into various solutions,” said Muller. “We believe that we landed on a solution that doesn’t need full caching and will still be scalable.”</p>\n\n\n\n<p>For performance, there are two primary challenges:</p>\n\n\n\n<ul><li>The number of URLs per page.</li><li>The <code>lastmod</code> date in the <code>index.xml</code> file.</li></ul>\n\n\n\n<p>“Addressing the number of URLs per page is fairly trivial,” said Muller. “While sitemaps can have up to 50,000 URLs per sitemap, we found that capping it at 2,000 is acceptable from a performance perspective and totally acceptable from a search engine perspective.” The team decided to stick with a default of 2,000 URLs per sitemap and to provide a filter hook for plugins to alter if necessary.</p>\n\n\n\n<p>Finding a solution for the <code>lastmod</code> date was not as easy. “We believe we found a good balance, which will be scalable and doesn’t open the can of worms that full caching exposes us to,” said Muller.</p>\n\n\n\n<p>The solution the team implemented involved scheduling a cron task that runs twice daily (the frequency can be filtered by plugins). The cron job fetches the <code>lastmod</code> dates of each sitemap and stores them in the options table, which essentially works as a light caching solution.</p>\n\n\n\n<p>“Relying on cron should be stable enough for small to medium websites,” said Muller. “Enterprise websites usually have server cron set up to more regularly ping WP Cron instead of relying on website visitors to trigger it. In fact, most managed hosting providers have that for all plans.”</p>\n\n\n\n<p>If the team’s initial implementation is not well-rounded enough, they have been researching an alternative implementation that uses custom post types to store and update sitemap data. Two open GitHub tickets further explore performance that developers may want to check out: <a href=\"https://github.com/GoogleChromeLabs/wp-sitemaps/issues/1\">Issue #1</a> and <a href=\"https://github.com/GoogleChromeLabs/wp-sitemaps/issues/39\">Issue #39</a>.</p>\n\n\n\n<h2>What Happens to Sites With Existing Sitemaps?</h2>\n\n\n\n<p>One question that remains unanswered is what happens when a user updates to WordPress 5.4/5.5 and already has a sitemap. There are likely millions of WordPress sites that are running a plugin or have some sort of sitemap solution in place. </p>\n\n\n\n<p>“This is a question which we haven’t quite solved,” said Muller. “It is important to work with plugin authors, and in an ideal world, all plugins providing advanced sitemaps solutions would extend the core API. We would love to get feedback from the community on that one.”</p>\n\n\n\n<p>WordPress must take care to avoid any major conflicts or indexing errors, or at least alleviate issues for the users who may be unaware of this upcoming feature.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 29 Jan 2020 20:37:36 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:34;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"WPTavern: Emoji Conbini and the Case for a Block Enhancements Directory\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96802\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:187:\"https://wptavern.com/emoji-conbini-and-the-case-for-a-block-enhancements-directory?utm_source=rss&utm_medium=rss&utm_campaign=emoji-conbini-and-the-case-for-a-block-enhancements-directory\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:8193:\"<p>In December of 2019, Nick Hamze, the owner of <a href=\"https://sortabrilliant.com/\">Sorta Brilliant</a>, quietly launched <a href=\"https://block.garden/\">Block Garden</a> with a proposal for plugin authors to build block-based plugins off concepts, called <em><a href=\"https://block.garden/seeds/\">seeds</a></em>, from his site. He has since written extensively on the block editor and has shared a multitude of ideas, many of which are <em>sorta brilliant</em>.</p>\n\n\n\n<p>It is easy to be drawn in by Hamze’s unabashed love for blocks. In a post titled “<a href=\"https://block.garden/not-busy/\">You aren’t busy, you’re just not excited</a>,” Hamze challenges developers to build something, anything and not worry about it being perfect or becoming an earth-shattering product. “The purpose of Block Garden is to get you excited about blocks,” he wrote in the post. “To make you so excited about blocks that you’ll make the time to bring them to life. The community needs you more than you realize. I honestly believe that every person has at least one block in them. If I can get you to create that first block, I know you’ll be hooked for life.”</p>\n\n\n\n<p>He has created a space for those who genuinely love the block editor. Block Garden is reminiscent of some of the early WordPress blogs where normal, everyday end-users shared their love of the platform. It is refreshingly optimistic. It is block geekdom at its finest. <em>And, I kind of love it.</em></p>\n\n\n\n<p>Hamze put out a <a href=\"https://block.garden/block-builder/\">job posting for block developers</a> earlier this month. Several developers answered the call. “I can’t code but I have ideas and cash that I’m investing into blocks, mostly to keep the boredom at bay that is slowly killing me,” he said. “We are making some really fun blocks together. This is just the tip of the iceberg.”</p>\n\n\n\n<p>In a few short weeks, Hamze and his co-authors have released multiple block-related plugins through his Sorta Brilliant brand that are now available on the WordPress plugin directory:</p>\n\n\n\n<ul><li><a href=\"https://wordpress.org/plugins/post-script/\">P.S.</a> – A container block for grouping blocks into a popover.</li><li><a href=\"https://wordpress.org/plugins/streamshare/\">StreamShare for Twitch</a> – Embed Twitch content into the block editor.</li><li><a href=\"https://wordpress.org/plugins/ghstwrtr/\">Ghostwriter</a> – Adds a heading block style that types out the text on the front end, <em>Ghostwriter</em> style (for you fans of the ’90s TV series).</li><li><a href=\"https://wordpress.org/plugins/ubiquitous-blocks/\">Ubiquitous Blocks</a> – Exposes the Reusable Blocks admin screen and allows users to automatically add them to posts.</li></ul>\n\n\n\n<h2>Emoji Conbini</h2>\n\n\n\n<img />Inserting an emoji with the Emoji Conbini plugin.\n\n\n\n<p>In collaboration with George Mamadashvili, Hamze’s latest release is the <a href=\"https://wordpress.org/plugins/emoji-conbini/\">Emoji Conbini</a> plugin. It adds an emoji inserter to the block editor toolbar.</p>\n\n\n\n<p>Emoji Conbini utilizes the <a href=\"https://github.com/missive/emoji-mart\">Emoji Mart</a> library, which offers a Slack-like emoji picker. When the picker is open, the user merely needs to choose their preferred emoji. Users can also search for a specific emoji.</p>\n\n\n\n<p>Hamze was aware of the <a href=\"https://wordpress.org/plugins/emoji-autocomplete-gutenberg/\">Emoji Autocomplete Gutenberg</a> plugin before commissioning his emoji plugin for the block editor. “I loved how easy it made adding emoji but I didn’t like the UI,” he said. “It seemed like you had to know what emoji you wanted to add and relied on keyboard shortcuts, which I don’t think everyone is comfortable with.”</p>\n\n\n\n<p>The problem with both emoji plugins is that they insert the WordPress-based emoji image directly into the editor instead of the emoji character. By default, WordPress will automatically convert emoji characters to images on the front end. For the average user, this is likely a non-issue. However, some users prefer to use the browser-based emoji and disable the images that core outputs. Both emoji plugins remove this possibility. They also remove the possibility of using a different emoji image library.</p>\n\n\n\n<p>“To be honest, I’m not really a fan of the browser versions, but I’m willing to consider anything if there is a demand for it,” said Hamze of the possibility of simply inserting the emoji character. “To me, getting version 1 out there is the most important, and if anything needs to be changed, people will let me know.”</p>\n\n\n\n<p>The term “conbini” initially drew me to the plugin, which is the name given to Japanese convenient stores 🏪. If you have never been to one, they are like stepping into another world (<em>almost everything in Japan seems otherworldly to this smalltown guy from the southern U.S.</em>).</p>\n\n\n\n<p>“I love everything from Japan,” said Hamze. “The music, anime, the tech. I bid on items on Yahoo Japan daily as I love surrounding myself with cool stuff from Japan. I’ve only been to Japan once, but it was magical. I especially loved going to conbini. My favorite thing to get there was rice balls from Lawsons.”</p>\n\n\n\n<p>The plugin name also plays into Hamze’s goals with Sorta Brilliant and Block Garden. While many other plugins are offering full packages for blocks, he is dropping smaller, <em>convenient</em> extensions to the block editor. Emoji Conbini shows that there is perhaps a market for add-ons that are block-related but not necessarily blocks, or at least some people are thinking about it.</p>\n\n\n\n<h2>Discovering Block Extensions</h2>\n\n\n\n<p>In his post “<a href=\"https://block.garden/more-than-just-blocks/\">The block directory needs more than just blocks</a>,” Hamze argues that one of the largest hurdles for block-related plugins is discoverability. He further argues the block directory is too tightly focused on individual blocks, proposing a “block enhancements” category as a solution.</p>\n\n\n\n<p>For Emoji Conbini, 10up’s <a href=\"https://wptavern.com/inserting-special-characters-into-the-block-editor\">Insert Special Characters</a>, ThemeIsle’s <a href=\"https://wordpress.org/plugins/blocks-css/\">Blocks CSS</a>, and other plugins that extend the block editor, there is no way for users to discover these plugins without specifically searching for them. These are useful plugins that could help sell the block editor to users who are on the fence.</p>\n\n\n\n<p>There is an unknown number of possibilities for enhancements to the block editor. This sub-category of block-editor plugins does not seem to get the attention that is going toward blocks. However, in some cases, they can be far more useful for everyday writing than the numerous blocks in development.</p>\n\n\n\n<p>Hamze’s initial idea proposes an enhancements category for the <a href=\"https://wptavern.com/version-1-prototype-of-the-wordpress-admin-block-directory-announced\">upcoming block directory</a>, but that has problems. For one, the block directory will be directly tied to the block inserter in a future version of WordPress. Plus, these types of plugins are not actual blocks. However, the concept of making block enhancements more visible to users is a necessary part of the puzzle. For the block editor’s continued success, WordPress needs to expose its users to a wider world of possibilities than simply installing another block.</p>\n\n\n\n<p>Now is the time to start thinking about exposure for plugins that enhance the block editor. Eventually, these types of plugins may need to be further grouped into editor toolbar (e.g., character inserters), block options (e.g., extra settings for existing blocks), and other categories. I suspect that we are only now glimpsing a future where users will be asking how to find not just blocks but block editor extensions.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 28 Jan 2020 20:54:15 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:35;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"WPTavern: Swift Control Replaces WordPress Toolbar With Custom Access Panel\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96787\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:86:\"https://wptavern.com/swift-control-replaces-wordpress-toolbar-with-custom-access-panel\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5397:\"<img />Swift Control expanded panel on the site front end.\n\n\n\n<p>David Vongries, creator of the <a href=\"https://wordpress.org/themes/page-builder-framework\">Page Builder Framework</a> theme, launched the <a href=\"https://wordpress.org/plugins/swift-control/\">Swift Control plugin</a> last week. The plugin is billed as a replacement for the core WordPress toolbar (admin bar). It allows site owners to customize the front-end control panel’s appearance and what links are displayed.</p>\n\n\n\n<p>Swift Control adds a new button on the front end of any site the plugin is active on. When clicked, the button expands to open the full array of button-like links to various admin screens. By default, the links point to the dashboard, edit screen for the current post, and the customizer.</p>\n\n\n\n<p>On the whole, the default functionality is not much different from the normal toolbar. The selling point for this plugin is its customizability. For users who want more control over admin access links from the front end, the plugin is a nice option.</p>\n\n\n\n<p>Vongries said the plugin made it easier for his customers to work with than the WordPress toolbar. He had wanted to release it as a standalone plugin for others to use over the years. However, he lacked the time and resources to put the release together.</p>\n\n\n\n<p>“We built this for our multisite network around 3 years ago to make it easier for our customers to navigate and access the key areas of their website,” said Vongries. “We actually ended up using this — what was back then just a couple pieces of custom code — on all of our client websites. I got so used to it, I’m using it on my own sites as well.”</p>\n\n\n\n<p>The plugin is simple to use and does its job well. For the moment, the largest downside is that the front-end controls are always positioned in the middle of the left side of the screen. This means it is not a one-size-fits-all solution. “We’ve actually planned to provide some position options so you can align the panel to the left, right, top-left, top-right and so on,” said Vongries. “That’s on the roadmap as well as some different styling options for the panel.” Both the positioning and styling options are planned for the free version of the plugin.</p>\n\n\n\n<p>It would also be nice to see some mobile-specific options for the control panel. An option to move it to a different location on smaller screens would be helpful so that the buttons do not inadvertently cover content. Adding an option to disable it completely on mobile may also be worth considering.</p>\n\n\n\n<p>The positioning is the only <em>potential</em> downside of an otherwise well-made plugin. Because it is being actively worked on, it may be a non-issue in future versions (<em>I’m currently running version 1.2.1</em>).</p>\n\n\n\n<h2>Customize the Swift Control Panel</h2>\n\n\n\n<img />Swift Control plugin settings screen.\n\n\n\n<p>The beauty of Swift Control is in its options for customizing what buttons appear in the front-end panel. By default, the free version of the plugin contains seven “widgets” (what the plugin calls its buttons/links):</p>\n\n\n\n<ul><li>Dashboard</li><li>Edit {Post Type}</li><li>Customize</li><li>New Post</li><li>New Page</li><li>Themes</li><li>Plugins</li></ul>\n\n\n\n<p>Users can drag and drop these widgets wherever they prefer in the control panel. Each widget has its own options. By clicking the edit button, users can change both the icon and title for the widget. Users can also decide whether links should open in a new browser tab.</p>\n\n\n\n<p><a href=\"https://wpswiftcontrol.com/\">Swift Control Pro</a>, the commercial version of the plugin, kicks customization up a notch. Besides the widgets available in the free version, it adds widgets for custom post types, launches the editor for page builders (Elementor, Brizy, Divi or Beaver Builder), supports WooCommerce, and adds a logout widget. Users can also create custom buttons.</p>\n\n\n\n<p>Both the free and pro versions offer additional settings. Users can customize each of the colors used in the control panel so that it matches their site. Other settings are switches to enable or disable features, such as turning off the WordPress toolbar.</p>\n\n\n\n<p>The following video shows how Swift Control Pro works (the free version is essentially the same but does not have the pro widgets):</p>\n\n\n\n<div class=\"wp-block-embed__wrapper\">\n\n</div>\n\n\n\n<h2>Future Plugin Plans</h2>\n\n\n\n<p>Besides new positioning options, Vongries said they are working on an import and export feature. Ideally, this would allow users to keep their settings from test environments or when copying to new sites. It could also be interesting in use on multisite.</p>\n\n\n\n<p>“One of the other features we’re going to work on next is the ability to show controls based on user roles,” said Vongries. “This will require us to change the UI of the widgets though, and we haven’t yet decided on what they should look like.” Currently, the team is exploring various ideas with the UI for such a feature, such as creating an expanding section for access to advanced widget settings.</p>\n\n\n\n<p>The first order of business is bringing in more users and getting feedback, which should help steer the future direction of the plugin.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 27 Jan 2020 19:46:41 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:36;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"WordPress.org blog: People of WordPress: Robert Cheleuka\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://wordpress.org/news/?p=8300\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/news/2020/01/people-of-wordpress-robert-cheleuka/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7036:\"<p><em>You’ve probably heard that WordPress is open-source software, and may know that it’s created and run by volunteers. WordPress enthusiasts share many examples of how WordPress changed people’s lives for the better. This monthly series shares some of those lesser-known, amazing stories.</em></p>\n\n\n\n<h2><strong>Meet Robert Cheleuka</strong></h2>\n\n\n\n<p>Robert is a self-taught graphic and motion designer turned web designer (and aspiring web developer) from Malawi, Africa. Over the years, he has grown fond of WordPress and has become a loyal user. Still, the journey is rough.</p>\n\n\n\n<img src=\"https://i2.wp.com/wordpress.org/news/files/2020/01/DSC08818.jpg?resize=632%2C790&ssl=1\" alt=\"Robert Cheleuka\" class=\"wp-image-8303\" />Robert Cheleuka\n\n\n\n<h3><strong>Malawi</strong></h3>\n\n\n\n<p>Malawi is one of the poorest countries in the world. A tiny landlocked country with a population of 17 million, it’s largely rural and still considered a developing country. The average entry-level monthly pay for most skilled jobs is about $110. If you’re employed full-time in the creative industry and if you’re very lucky, you might be able to earn more than that. Employees earning more than $300 a month are rare to non-existent.</p>\n\n\n\n<p>Robert has been a freelance graphic designer since about 2011. He started by doing gigs from his dorm in college and from home. Earnings from his freelance jobs increased his interest in entrepreneurship and he started to consider starting his own creative agency.</p>\n\n\n\n<h3><strong>How Robert was introduced to WordPress</strong></h3>\n\n\n\n<p>Robert first came into contact with WordPress in 2014 when he and a friend started a local tech blog. Before that, all he knew was basic, outdated HTML from high school and some knowledge of Adobe Dreamweaver. They decided to use WordPress, and their new blog looked like it came from the future. They used a theme from the repo and got such positive feedback from the blog they decided to open a content and media publishing agency.</p>\n\n\n\n<p>While they got a few web redesign jobs thanks to the exposure the blog brought, they lacked the administrative and business skills needed and ended up going their separate ways. Then in his first real job after college Robert finally took it upon himself to learn the ins and outs of WordPress. He learned how to install WordPress on a server and did some research on customizing themes. </p>\n\n\n\n<p>With that knowledge alone he got his first web design clients and started earning nearly as much as he did at his job. Robert soon realized that free WordPress themes would only take him so far, especially with his limited code skills.</p>\n\n\n\n<p>Because in Malawi only people who travel abroad have access to credit cards, paying for premium themes was impossible. Like many WordPress designers in developing countries, Robert turned to using pirated themes instead. He knew that was both unsafe and unethical, and decided to learn how to code. Knowing how to build themes from scratch would surely help him rise above the competition. </p>\n\n\n\n<img src=\"https://i1.wp.com/wordpress.org/news/files/2020/01/20180905_1971270886435744_8835917058488139776_n.jpg?fit=632%2C632&ssl=1\" alt=\"\" class=\"wp-image-8304\" />\n\n\n\n<h3><strong>The WordPress community from Robert’s perspective</strong></h3>\n\n\n\n<p>Robert doesn’t have a lot of interaction with the WordPress community. Although he would search for solutions from blogs about WordPress he had never actually talked to or asked anyone from the community for a solution. </p>\n\n\n\n<p>Robert believes that this isolation is the result of a glass ceiling — the WordPress community is partially online and partially in-person, but there isn’t a local group in Malawi. And because Malawi, like many other developing nations, lacks a way to pay online many can’t access premium support, online learning, or most other types of professional development. No matter how welcoming the people of WordPress might be, it can still feel like it mostly belongs to those with enough privilege to conduct business on the internet.</p>\n\n\n\n<h3><strong>WordPress & inclusion</strong></h3>\n\n\n\n<p>As most freelancers know, it’s really hard to learn while you also still need to earn. Add pitching to clients and shipping graphic design projects… there are only so many hours in a day.</p>\n\n\n\n<p>Robert didn’t have a programming background and had always been more of a creative person. In order to grow as a web designer/developer, he needed to learn PHP. Again, without access to a credit card, that was complicated. Also, free coding training wasn’t as widely available as it is now.</p>\n\n\n\n<p>Robert wishes that more developers would consider alternative ways for users who cannot pay for courses, themes, or plugins (whether that’s because of available infrastructure or otherwise). He wishes that WordPress tutors and developers would open up ways to accommodate aspiring learners in developing countries who cannot access plugins, courses, and themes, to be able to give back and to participate at another level.</p>\n\n\n\n<p>WordPress has allowed him to build an income he would have no other way of earning and it makes a huge difference. He believes sharing stories like his will hopefully make WordPress products and services become more universally available. In addition, he hopes that more aspiring, self-taught developers will find courage in reaching out to connect with others out there.</p>\n\n\n\n<h2><strong>Contributors</strong></h2>\n\n\n\n<p>Alison Rothwell (<a href=\"https://profiles.wordpress.org/wpfiddlybits/\" class=\"mention\"><span class=\"mentions-prefix\">@</span>wpfiddlybits</a>), Yvette Sonneveld (<a href=\"https://profiles.wordpress.org/yvettesonneveld/\" class=\"mention\"><span class=\"mentions-prefix\">@</span>yvettesonneveld</a>), Josepha Haden (<a href=\"https://profiles.wordpress.org/chanthaboune/\" class=\"mention\"><span class=\"mentions-prefix\">@</span>chanthaboune</a>), Siobhan Cunningham (<a href=\"https://profiles.wordpress.org/siobhanseija/\" class=\"mention\"><span class=\"mentions-prefix\">@</span>siobhanseija</a>), Topher DeRosia (<a href=\"https://profiles.wordpress.org/topher1kenobe/\" class=\"mention\"><span class=\"mentions-prefix\">@</span>topher1kenobe</a>)</p>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<img src=\"https://i1.wp.com/wordpress.org/news/files/2019/07/heropress_large_white_logo.jpg?resize=632%2C474&ssl=1\" alt=\"\" class=\"wp-image-7025\" />\n</div>\n\n\n\n<div class=\"wp-block-column\">\n<p> <em>This post is based on an article originally published on HeroPress.com, a community initiative created by <a href=\"https://profiles.wordpress.org/topher1kenobe/\">Topher DeRosia</a>. HeroPress highlights people in the WordPress community who have overcome barriers and whose stories would otherwise go unheard.</em> </p>\n</div>\n</div>\n\n\n\n<p> <em>Meet more WordPress community members over at </em><a href=\"https://heropress.com/\"><em>HeroPress.com</em></a><em>!</em> </p>\n\n\n\n<p><br /></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 25 Jan 2020 15:26:54 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Yvette Sonneveld\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:37;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:62:\"WPTavern: 10up Releases Autoshare for Twitter WordPress Plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96737\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:73:\"https://wptavern.com/10up-releases-autoshare-for-twitter-wordpress-plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3951:\"<p>On Tuesday, 10up <a href=\"https://10up.com/blog/2020/autoshare-for-twitter-wordpress-plugin/\">released its Autoshare for Twitter plugin</a>. The plugin is designed to automatically tweet blog posts as they are published. By default, it will send the post title, featured image, and link to Twitter. Users can also add a custom message. The <a href=\"https://wordpress.org/plugins/autoshare-for-twitter/\">plugin is available</a> in the WordPress plugin directory.</p>\n\n\n\n<p>If you threw a rock into a crowd of WordPress plugins, you would likely smack a social-networking extension. The WordPress plugin market is crowded with similar plugins, so it would make sense if this one flew under the radar. Plus, powerhouse plugins like Jetpack provide similar functionality, such as the <a href=\"https://jetpack.com/support/publicize/\">Jetpack Publicize feature</a>. Yet, with the prevalence of similar plugins, Autoshare for Twitter is worth checking out.</p>\n\n\n\n<p>Many similar plugins work with multiple social networks, but 10up’s plugin is designed specifically for sharing via Twitter. For users who only need a solution for that specific social network, it is a solid solution for version 1.0.</p>\n\n\n\n<p>10up originally built the plugin to provide the company’s clients more control and customization than they found in existing solutions. “Recognizing its widespread potential, we decided to follow our own best practices for managing open-source software by releasing it as a free plugin on the official WordPress plugin repository,” wrote Jeff Paul, Associate Director of Open Source Initiatives at 10up.</p>\n\n\n\n<p>The plugin works with both the block and classic editors. When in use with the block editor, it is added as part of the pre-publish check system as shown in the following screenshot:</p>\n\n\n\n<img />Pre-publish check for tweeting a post.\n\n\n\n<p>The custom message box tracks the number of characters so that users do not go over Twitter’s character count. The plugin also displays a message in the Status & Visibility panel to let users know if a post was shared on Twitter. </p>\n\n\n\n<p>Overall, the plugin does its job well (<em>sorry to folks who were bombarded with some test tweets earlier</em>). It would be nice to see similar one-off solutions that are specific to other social networks. I often find myself in need of such plugins without dealing with a full array of social networking options.</p>\n\n\n\n<p>The plugin is also <a href=\"https://github.com/10up/autoshare-for-twitter\">available on GitHub</a> for others to contribute. Currently, there are several open issues that would improve how the plugin works.</p>\n\n\n\n<h2>Setup Is Not User-Friendly</h2>\n\n\n\n<img />Settings page for Twitter credentials.\n\n\n\n<p>The biggest downside to the plugin is there are no links, no admin help tab, and no instructions on how to set up the Twitter Credentials on the plugin’s setting screen. The page simply has some text fields for things like an API Key, API Secret, and so on. These are not user-friendly terms, and will likely be confusing for many. Not to mention, similar plugins can connect users at the click of a button. For a plugin that does nearly everything else right, this is a missing piece of what would be a near-perfect release.</p>\n\n\n\n<p>The plugin is ideal for power users or developers who want to set up Twitter sharing for a client. In the current version of the plugin, users need to set up a <a href=\"https://developer.twitter.com/\">Twitter Developer account</a> and create a Twitter App. This generates the API keys and necessary tokens for using the plugin.</p>\n\n\n\n<p>The plugin does have an <a href=\"https://github.com/10up/autoshare-for-twitter/issues/57\">open ticket on GitHub</a> for a better onboarding process, which could solve this issue. Therefore, the team is aware of and actively working on making this smoother in a future version.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 24 Jan 2020 21:00:15 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:38;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:102:\"WPTavern: Gutenberg 7.3 Brings Navigation Block Colors, Block Collections API, and Dynamic Post Blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96706\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:111:\"https://wptavern.com/gutenberg-7-3-brings-navigation-block-colors-block-collections-api-and-dynamic-post-blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5495:\"<p>The Gutenberg team <a href=\"https://make.wordpress.org/core/2020/01/22/whats-new-in-gutenberg-22-january/\">announced version 7.3</a> of the plugin yesterday. This was the second release of the year, which included 159 contributions from 56 people. The major changes to the plugin include settings for changing the navigation block’s text and background colors, a new Block Collections API for developers, and placeholder blocks for post elements.</p>\n\n\n\n<p>One of the most significant changes with this release is the speed improvement for page load times and input events. Speed tests are done against posts with ~36,000 words and ~1,000 blocks. The team reduced total load time from 6.431 seconds in version 7.2 to 4.55 seconds in version 7.3. Input events saw larger improvements. Events in 7.3 take 33.8 milliseconds in comparison to 64.7 milliseconds in 7.2.</p>\n\n\n\n<p>Changes in Gutenberg 7.3 covered a wide range of areas in the plugin. The team added an <a href=\"https://github.com/WordPress/gutenberg/pull/18132\">experimental label function</a> for improving block accessibility. They corrected over a dozen bugs with editor navigation. They also introduced some new developer APIs such as a <a href=\"https://github.com/WordPress/gutenberg/pull/19317\">warning utility</a>, <a href=\"https://github.com/WordPress/gutenberg/pull/18495\">text component</a>, and <a href=\"https://github.com/WordPress/gutenberg/pull/17148\">image size control component</a>.</p>\n\n\n\n<p>Work toward full-site editing continued in this release. It is now possible to <a href=\"https://github.com/WordPress/gutenberg/pull/19203\">edit existing template part files</a>. The site editor can also <a href=\"https://github.com/WordPress/gutenberg/pull/19081\">load the front page block template</a>.</p>\n\n\n\n<h2>Navigation Block Colors</h2>\n\n\n\n<img />Selecting custom colors for the navigation block.\n\n\n\n<p>The existing Navigation block continues to improve with each release. Version 7.3 <a href=\"https://github.com/WordPress/gutenberg/pull/19108\">added new options</a> for setting the text color for all navigation items and background color for the entire navigation block.</p>\n\n\n\n<p>It is nice to see some work done toward providing users control over navigation colors. However, it is a far cry from what a good theme designer can do with the flexibility of plain ol’ CSS. Handling navigation colors is tricky because there is so much that is missing. Link colors also need hover and focus state changes. Some designs may need borders for links and border color changes for the various link states or even background color changes.</p>\n\n\n\n<p>Suffice it to say, I am still skeptical about how good the navigation block will be when it is time to move onto full-site editing, especially in comparison to the fine-tuned control that a theme author would normally have.</p>\n\n\n\n<h2>Dynamic Post Element Blocks</h2>\n\n\n\n<img />Post element placeholder blocks.\n\n\n\n<p>In previous releases, the Gutenberg team dropped post title and post content blocks. These are placeholder blocks that will dynamically output the title and content for posts. The long-term goal is for these blocks to be used along with full-site editing, which will allow users to manipulate how everything on their sites is output, including posts.</p>\n\n\n\n<p>Gutenberg 7.3 introduced three new placeholder blocks for post elements:</p>\n\n\n\n<ul><li><a href=\"https://github.com/WordPress/gutenberg/pull/19576\">Post author block</a></li><li><a href=\"https://github.com/WordPress/gutenberg/pull/19578\">Post date block</a></li><li><a href=\"https://github.com/WordPress/gutenberg/pull/19579\">Post excerpt block</a></li></ul>\n\n\n\n<p>This still represents early work toward full-site editing. Eventually, Gutenberg will need to turn nearly every important template tag into a block to get full coverage of what is currently possible with PHP.</p>\n\n\n\n<p>To test these features, you must enable “Full Site Editing” via the Gutenberg > Experiments screen in the WordPress admin.</p>\n\n\n\n<h2>Block Collections API for Developers</h2>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>registerBlockCollection( \'super-duper\', {\n title: \'Super Duper\',\n icon: ( <SVG xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><Path d=\"M11 5v7H9.5C7.6 12 6 10.4 6 8.5S7.6 5 9.5 5H11m8-2H9.5C6.5 3 4 5.5 4 8.5S6.5 14 9.5 14H11v7h2V5h2v16h2V5h2V3z\" /></SVG> ),\n} );</code></pre>\n\n\n\n<p>A new Block Collections API was added to version 7.3 for plugin developers. Instead of registering a block category and adding blocks to specific categories, plugin developers can register a collection based on the namespace for their blocks.</p>\n\n\n\n<p>For instance, suppose you develop a plugin with a collection of blocks. Each block is under the namespace <code>super-duper</code>. When you register a block collection with the <code>super-duper</code> namespace, all of the blocks would be automatically registered to your custom block collection. This seems to be a smarter way to handle groups of blocks than the existing category system. </p>\n\n\n\n<p>Right now, collections work the same way as categories within the UI. However, it does open collections to other possibilities in the future.</p>\n\n\n\n<p>Blocks can still be registered to a specific category that makes the most sense for the individual block. However, by registering collections, an avenue exists for finding all blocks coming from a single source.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 23 Jan 2020 21:17:44 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:39;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:45:\"HeroPress: Thinking Outside the WordPress Box\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://heropress.com/?post_type=heropress-essays&p=3054\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:142:\"https://heropress.com/essays/thinking-outside-the-wordpress-box/#utm_source=rss&utm_medium=rss&utm_campaign=thinking-outside-the-wordpress-box\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7186:\"<img width=\"960\" height=\"480\" src=\"https://s20094.pcdn.co/wp-content/uploads/2021/01/012320-min.jpg\" class=\"attachment-large size-large wp-post-image\" alt=\"Pull Quote: I feel that we’ve only scratched the surface of what WordPress can be.\" /><p>Most people, when they discover WordPress, start on the challenging and rewarding path of developing themes, plugins and similar products. I decided to think outside the box.</p>\n<p>My name is Alexander, and my WordPress journey began in 2009. I’m from Chisinau, Republic of Moldova. I originally discovered WordPress while looking for a content management system for one of my projects. Intrigued by how it worked, I started like many others do — learning how WordPress works through developing WordPress websites.</p>\n<p>I started using what I knew to provide development services on freelance platforms. For the next decade, I mostly concentrated on the lesser known, yet still critically important parts of WordPress: particularly security and search engine optimization.</p>\n<p>For many people building up a freelance business in the WordPress world, these are the parts that are important to do, but are often thought of as secondary to deeper development. Theme and plugin authors in particular, get the lion’s share of the spotlight when it comes to WordPress development.</p>\n<h3>Speed and Sophistication</h3>\n<p>I soon learned that after a decade of polishing my skills, that what the world needed wasn’t more WordPress theme developers or plugin authors. What it needed were people who could take care of the kinds of tasks that seemed simple on the surface (like protecting a WordPress site from hackers or optimizing it for search engines), yet were very involved and continued to get more complex over time.</p>\n<p>Contrary to popular belief, you can’t just install a plugin or two and think your site is secure or well-optimized for Google and other sites. Sure, there are plugins which can help the process, but when disaster strikes and your site gets hacked, or you find that your site is loading sluggishly compared to your competition, or worse, your site disappears from the search rankings — you know you need help, and FAST.</p>\n<h3>A Dandy Idea!</h3>\n<p>In 2019 I decided to turn my love for WordPress into full-time work through <a href=\"https://wpdandy.com\">WPDandy</a>. Rather than marketing myself strictly as a WordPress developer or theme designer (although I also do development and design work from time to time), I decided to think outside the box and offer the kinds of services I knew that people needed, but didn’t know how much they needed them, until it was too late!</p>\n<p>Through WPDandy, I focused on WordPress maintenance, management and support services. These include but are not limited to: <b>WordPress speed improvements</b>, <b>security</b>,<b> search engine optimization</b>, <b>backups, etc.</b></p>\n<h3>How WPDandy Has Changed My Life</h3>\n<p>WPDandy has changed my life in many ways. It has enabled me to enjoy the freedom and flexibility of working for myself, doing something that I love. Today, I lead a team of highly professional and passionate WordPress developers from around the world.</p>\n<p>Through my online work, I’m able to help clients reach their business and personal goals, and grow their WordPress sites without worrying about keeping everything up to date (which can be a full-time job in itself, especially if there are multiple sites to run!). My company allows me to help others, and that brings me immense satisfaction!</p>\n<h3>Contributing to the Future of WordPress</h3>\n<p>Although I’m immensely proud of what I’ve built with WPDandy as well as thankful to all of the clients who helped me to discover and master the art and science of WordPress, I felt like I also owed something to the WordPress community itself.</p>\n<p>That’s why I’ve also signed on to be a WordPress contributor. I routinely offer suggestions, advice and share code that can help make managing and maintaining WordPress easier, as well as keep it more secure and less vulnerable to hacking and suspicious attacks.</p>\n<p>Beyond that, I’m overjoyed to be a WordCamp speaker as well. I love sharing knowledge with others and collaborating with like minds on powerful new ideas that can help shape WordPress and make it even better than before.</p>\n<h3>Shaping the Future of Content Management</h3>\n<p>It continues to amaze me how what once started as a small, ordinary blogging platform has blossomed into an absolute content management powerhouse. WordPress can become so many things: an e-commerce storefront, a message board, a membership site, and of course a blog. But I feel that, by and large, we’ve only scratched the surface of what WordPress can be.</p>\n<p>I look forward to continuing to be able to provide outstanding WordPress development, maintenance and management services for all of the many iterations of WordPress that exist and will be created in the future. It’s going to be an exciting ride, and I can’t wait to see what’s next.</p>\n<div class=\"rtsocial-container rtsocial-container-align-right rtsocial-horizontal\"><div class=\"rtsocial-twitter-horizontal\"><div class=\"rtsocial-twitter-horizontal-button\"><a title=\"Tweet: Thinking Outside the WordPress Box\" class=\"rtsocial-twitter-button\" href=\"https://twitter.com/share?text=Thinking%20Outside%20the%20WordPress%20Box&via=heropress&url=https%3A%2F%2Fheropress.com%2Fessays%2Fthinking-outside-the-wordpress-box%2F\" rel=\"nofollow\" target=\"_blank\"></a></div></div><div class=\"rtsocial-fb-horizontal fb-light\"><div class=\"rtsocial-fb-horizontal-button\"><a title=\"Like: Thinking Outside the WordPress Box\" class=\"rtsocial-fb-button rtsocial-fb-like-light\" href=\"https://www.facebook.com/sharer.php?u=https%3A%2F%2Fheropress.com%2Fessays%2Fthinking-outside-the-wordpress-box%2F\" rel=\"nofollow\" target=\"_blank\"></a></div></div><div class=\"rtsocial-linkedin-horizontal\"><div class=\"rtsocial-linkedin-horizontal-button\"><a class=\"rtsocial-linkedin-button\" href=\"https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fheropress.com%2Fessays%2Fthinking-outside-the-wordpress-box%2F&title=Thinking+Outside+the+WordPress+Box\" rel=\"nofollow\" target=\"_blank\" title=\"Share: Thinking Outside the WordPress Box\"></a></div></div><div class=\"rtsocial-pinterest-horizontal\"><div class=\"rtsocial-pinterest-horizontal-button\"><a class=\"rtsocial-pinterest-button\" href=\"https://pinterest.com/pin/create/button/?url=https://heropress.com/essays/thinking-outside-the-wordpress-box/&media=https://heropress.com/wp-content/uploads/2021/01/012320-min-150x150.jpg&description=Thinking Outside the WordPress Box\" rel=\"nofollow\" target=\"_blank\" title=\"Pin: Thinking Outside the WordPress Box\"></a></div></div><a rel=\"nofollow\" class=\"perma-link\" href=\"https://heropress.com/essays/thinking-outside-the-wordpress-box/\" title=\"Thinking Outside the WordPress Box\"></a></div><p>The post <a rel=\"nofollow\" href=\"https://heropress.com/essays/thinking-outside-the-wordpress-box/\">Thinking Outside the WordPress Box</a> appeared first on <a rel=\"nofollow\" href=\"https://heropress.com\">HeroPress</a>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 23 Jan 2020 18:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Alexander Covtun\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:40;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"WPTavern: GiveWP Plugin Users Raised Over $100 Million in Donations in 2019\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96639\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:85:\"https://wptavern.com/givewp-plugin-users-raised-over-100-million-in-donations-in-2019\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5667:\"<img />\n\n\n\n<p><a href=\"https://wordpress.org/plugins/give/\">GiveWP plugin</a> users raised $106 million in donations in 2019. This is the first time donation amounts have crossed the $100 million threshold in a year. Matt Cromwell, GiveWP’s COO, made the <a href=\"https://www.facebook.com/photo.php?fbid=10219125809314580\">announcement on Facebook</a> last week. This is a jump from the $88 million and $41 million raised in 2018 and 2017, respectively.</p>\n\n\n\n<p>“I’m constantly amazed at what we’ve been able to accomplish at GiveWP,” said Cromwell. “The team continues to excel as experts in their fields, the platform itself continues to improve and become even more top-notch. But this number we observed recently really puts the rubber to the road.”</p>\n\n\n\n<p>The $106 million is not an exact total in donations users have gained in their fundraising campaigns. It only represents the numbers by users who are using PayPal or Stripe. “Both PayPal and Stripe provide partner programs where platforms like GiveWP get a small percentage of each processing fee,” said Cromwell. “This isn’t an additional amount, it’s money the processor will take either way, but shares with us because we help them generate more business.” The partners programs rely on transparency in reporting, which is how GiveWP can see the total donations made through those payment processors. “In order for us to know that they are paying us appropriately, they need to provide us with numbers to see how much revenue was processed through our platform.”</p>\n\n\n\n<p>Both PayPal Standard and Stripe are supported in the free version of the GiveWP plugin, which makes them the go-to choices of payment gateways for end-users. “Authorize.net is the next largest,” said Cromwell. “But Authorize is maybe a tenth of the number of users as either PayPal or Stripe (rough estimate).” Without data from the other processors, it’s impossible to know the total donation numbers, which would be higher than the amount the team is aware of.</p>\n\n\n\n<p>GiveWP currently has over 70,000 active installations, many of which power the donation system on small sites. The plugin is also used for large non-profit organizations such as <a href=\"https://lifewater.org/\">Lifewater</a>, a Christian-based organization that brings clean water to families living in poverty around the world; <a href=\"https://liberomagazine.com/\">Libero Magazine</a>, a Vancouver-based mental health magazine and community; and <a href=\"https://www.lovebutton.org/\">Love Button</a>, an organization that promotes a culture of love and aims to inspire humans to act with kindness.</p>\n\n\n\n<h2>From the Past to the Future</h2>\n\n\n\n<p>Impress, the company behind the plugin, <a href=\"https://wptavern.com/give-a-new-free-donations-plugin-for-wordpress\">launched GiveWP</a> in 2015 to “Democratize Generosity.” The goal was to provide non-profits and other causes the ability to launch campaigns without going through the middle-man of crowd-funding sites, which can sometimes carry a hefty fee. Handling all of this within WordPress provided a more robust and customizable solution that put site owners in control of how they ran their fundraising efforts.</p>\n\n\n\n<p>It was a bold move to build to launch in a crowded market of existing donation plugins and add-ons for major eCommerce plugins. Thus far, the venture has turned out well. However, the GiveWP team is not looking to slow down.</p>\n\n\n\n<p>“Honestly, from a plugin/development perspective it feels like we’ve learned everything new all over again,” said Cromwell of the journey thus far. “The things that we felt were the biggest strengths of the platform still are strong, but also now are technical debt that we’re working to revamp to continue to carry GiveWP strong into the future. Our form builder leveled up a lot when we built our own settings API (for example), but now in a post-Gutenberg era, it feels like it needs a more visual refresh. Doing that well with backward compatibility is a serious challenge.”</p>\n\n\n\n<p>The team feels like much of their early success was by targeting the WordPress community. “That’s playing ‘inside baseball,\'” he said. “Getting into the broader WP community and then additionally into the NPO community is where our challenge is now. So we’re flexing new muscles in marketing.”</p>\n\n\n\n<p>The original partners had to pick up new skills over the past four years. They had to learn how to switch gears from simply being owners and workers to managing individual teams. “We’re so proud of our team that it’s become one of our biggest strengths as a company,” said Cromwell. “Now getting from 20 employees (where we’re at now) to 50 will be an even bigger challenge.”</p>\n\n\n\n<p>The GiveWP team does not plan to focus solely on the WordPress ecosystem. They want to branch out and see where new avenues for growth will take them.</p>\n\n\n\n<p>“While WordPress having 35% internet market share is a big deal, there’s still more market outside WordPress than inside,” said Cromwell. “So for the growth and strength of our company we are now building out a new fundraising SaaS which we’re excited to launch this calendar year.”</p>\n\n\n\n<p>If the team manages to launch a successful SaaS product on the GiveWP platform, this year’s $106 million in fundraising could pale in comparison to 2020’s numbers and beyond.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 22 Jan 2020 21:19:06 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:41;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:101:\"WPTavern: GoDaddy’s ‘Go’ WordPress Theme Offers a Page-Building Experience via the Block Editor\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://wptavern.com/?p=96641\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:103:\"https://wptavern.com/godaddys-go-wordpress-theme-offers-a-page-building-experience-via-the-block-editor\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:8640:\"<img />\n\n\n\n<p>GoDaddy launched its <a href=\"https://wordpress.org/themes/go/\">Go WordPress theme</a> last week. It has been publicly available through its <a href=\"https://github.com/godaddy-wordpress/go\">GitHub repository</a> for several months, but the theme review team finally approved and set it live in the theme directory. Thus far, the theme has garnered 7,000 active installs and is likely to hit the popular list, given GoDaddy’s history of releasing popular themes. It also provides translations in 27 languages out of the box.</p>\n\n\n\n<p>Go is simple. After working with the theme through GoDaddy’s <a href=\"https://wptavern.com/inside-look-at-godaddys-onboarding-process-for-managed-wordpress-hosting\">managed hosting onboarding process</a> in October last year, I was admittedly a little disappointed this time around. The onboarding process made things almost too easy. I had a predesigned site without thinking about it. After installing and activating Go in my test environment, I couldn’t help but feel like it would take 100 times more work to recreate the magic I once basked in. I knew the power of the theme because I had been presented an ideal set of options that were preconfigured for me in the past. Without the configuration, the theme seemed a little less impressive.</p>\n\n\n\n<p>That’s the beauty of great marketing and onboarding. GoDaddy had already reeled me in.</p>\n\n\n\n<p>While the Go theme is simple, it is also powerful. A lot of that power is in its block styles. Instead of focusing on theme-specific features, the team behind the project poured their work into creating an experience that allows theme users to piece their sites together with the block editor. The theme is ideal for users who want to utilize the block editor as a page builder.</p>\n\n\n\n<p>The theme has a handful of customizer options that provide additional flexibility, but the main selling point is that it gets out of the way and lets the user do the designing. I suspect we will see many similar themes in the next year as theme authors come to grips with building themes in a block world. A large part of the market will want themes that are essentially open canvases for site owners to manipulate the output of their site via blocks.</p>\n\n\n\n<p>Go is also designed to work with WooCommerce, which is a large part of the company’s <a href=\"https://wptavern.com/godaddy-launches-ecommerce-hosting-plan-in-partnership-with-woocommerce\">eCommerce hosting service</a>. This integration should make it a nice option for small business owners.</p>\n\n\n\n<h2>CoBlocks Companion Recommended</h2>\n\n\n\n<img />Features block from the CoBlocks plugin.\n\n\n\n<p>The magic of Go is not in the theme itself. It’s in GoDaddy’s companion plugin <a href=\"https://wordpress.org/plugins/coblocks/\">CoBlocks</a>, which the company <a href=\"https://wptavern.com/godaddy-acquires-themebeans-coblocks-block-gallery-and-block-unit-tests\">acquired last year</a> in a deal with ThemeBeans. The plugin has soared from a mere 3,000 active installs to over 100,000 since.</p>\n\n\n\n<p>CoBlocks offers everything from accordions to maps, from logos to pricing tables, and a lot more in between. It covers a lot of ground that the core WordPress editor blocks do not cover.</p>\n\n\n\n<p>The Go theme is designed to go hand-in-hand with CoBlocks (<em>can we get GoDaddy to just go ahead and rename the plugin to <strong>Go</strong>Blocks?</em>). The theme is meant to offer a page-building experience. Because GoDaddy owns both products, it makes sense they would offer one of the nicer integrations between the plugin and a theme.</p>\n\n\n\n<h2>Not Ideal for Blogging</h2>\n\n\n\n<img />A lot of whitespace between text and other blocks in posts.\n\n\n\n<p>The theme makes generous use of whitespace, but its overuse can often break the reading flow for blog posts. The flow from paragraph to paragraph is fine. However, the moment you drop an image, gallery, pull-quote, or one of many other blocks into the content, the theme adds an extra 140 pixels of whitespace above and below the block. It completely throws off the vertical rhythm of the post.</p>\n\n\n\n<p>Go also displays the full posts on the blog posts page instead of excerpts. There are few things I dislike more when it comes to blogs. Providing an option for users to choose between a full and summary view would be ideal.</p>\n\n\n\n<p>The theme does not claim to be well-suited to blogging. None of the demos for the theme show off a blog. If you’re looking for a theme to handle blogging with media mixed in the content, you will find better offerings elsewhere, such as the <a href=\"https://wptavern.com/blocksy-wordpress-theme-provides-a-solid-block-editor-experience\">Blocksy theme</a></p>\n\n\n\n<h2>Limited Yet Useful Theme Options</h2>\n\n\n\n<img />Design style and color scheme options in the customizer.\n\n\n\n<p>The theme adds five sections to the customizer:</p>\n\n\n\n<ul><li>Site Design</li><li>Header</li><li>Footer</li><li>Social</li><li>Site Settings</li></ul>\n\n\n\n<p>Within each section, Go provides a few basic options, most of which are related to colors and layout. The most useful options reside under the “Site Design” section. The theme presents a design style option that changes the theme’s fonts and colors. Currently, there are five design styles: traditional, modern, trendy, welcoming, and playful. Once a design style is selected, users can choose from four color schemes for that style. The design of this system is brilliant. It gives users choices without forcing them to become designers and handpick the perfect hex code for each color.</p>\n\n\n\n<p>Users who prefer to manage individual colors are not left out. The theme also provides options for overriding any of the colors from the chosen color scheme.</p>\n\n\n\n<p>I was disappointed that Go opted for creating individual options for various social networks instead of using a navigation menu. Using WordPress’ built-in nav menu system for social links has become the <em>de facto</em> standard in the last several years, which allows users to carry their social links from one theme to the next. Unfortunately, users are required to retype all of their links with this theme.</p>\n\n\n\n<p>The theme keeps does not go overboard with options but provides enough customizability to make the theme unique to the user.</p>\n\n\n\n<h2>How Does the Code Stack Up?</h2>\n\n\n\n<p>The theme offers a solid and well-documented codebase. There is not much PHP or JavaScript code, so there are few areas where it can go wrong. The theme’s strength is in its CSS.</p>\n\n\n\n<p>The theme templates were primarily HTML with PHP sprinkled in. For DIY users who like to hack away at theme templates, you should not find any surprises.</p>\n\n\n\n<h2>Final Thoughts</h2>\n\n\n\n<p>Users who want to customize every page of their site will likely enjoy this theme. It is well-suited for small business owners and others with small sites. It could work well for artists and others with portfolios as well.</p>\n\n\n\n<p>It does not fit with my personal taste because it does not cater to my blogging style, which is my primary interest in themes. However, I would not hesitate to recommend it to anyone who wants a ton of control over their site’s inner page design.</p>\n\n\n\n<p>The following is a list of the available demos. There is a lot that can be done in combination with the CoBlocks plugin, which you will want to use in combination with Go.</p>\n\n\n\n<p><strong>Demos with the CoBlocks plugin:</strong></p>\n\n\n\n<ul><li><a href=\"https://wpnux.godaddy.com/v2/?template=alder\">Alder</a></li><li><a href=\"https://wpnux.godaddy.com/v2/?template=ashby\">Ashby</a></li><li><a href=\"https://wpnux.godaddy.com/v2/?template=barista\">Barista</a></li><li><a href=\"https://wpnux.godaddy.com/v2/?template=bento\">Bento</a></li><li><a href=\"https://wpnux.godaddy.com/v2/?template=everett\">Everett</a></l
|