Make WordPress Core

Ticket #28673: 28673.3.diff

File 28673.3.diff, 54.2 KB (added by michalzuber, 8 years ago)

Fixed 28673.2.diff for patching by others

  • src/wp-admin/admin-ajax.php

     
    6060        'wp-remove-post-lock', 'dismiss-wp-pointer', 'upload-attachment', 'get-attachment',
    6161        'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor',
    6262        'send-attachment-to-editor', 'save-attachment-order', 'heartbeat', 'get-revision-diffs',
    63         'save-user-color-scheme', 'update-widget', 'query-themes', 'parse-embed', 'set-attachment-thumbnail'
     63        'save-user-color-scheme', 'update-widget', 'query-themes', 'query-plugins', 'parse-embed',
     64        'set-attachment-thumbnail'
    6465);
    6566
    6667// Register core Ajax calls.
     
    7374add_action( 'wp_ajax_nopriv_heartbeat', 'wp_ajax_nopriv_heartbeat', 1 );
    7475
    7576if ( is_user_logged_in() ) {
     77
    7678        /**
    7779         * Fires authenticated AJAX actions for logged-in users.
    7880         *
  • src/wp-admin/css/colors/_admin.scss

     
    434434        background: $highlight-color;
    435435}
    436436
    437 .theme-section.current,
    438 .theme-filter.current {
    439         border-bottom-color: $menu-background;
    440 }
    441 
    442 body.more-filters-opened .more-filters {
    443         color: $menu-text;
    444         background-color: $menu-background;
    445 }
    446 
    447 body.more-filters-opened .more-filters:before {
    448         color: $menu-text;
    449 }
    450 
    451 body.more-filters-opened .more-filters:hover,
    452 body.more-filters-opened .more-filters:focus {
    453         background-color: $menu-highlight-background;
    454         color: $menu-highlight-text;
    455 }
    456 
    457 body.more-filters-opened .more-filters:hover:before,
    458 body.more-filters-opened .more-filters:focus:before {
    459         color: $menu-highlight-text;
    460 }
    461 
    462437.theme-install-overlay .close-full-overlay:hover,
    463438.theme-install-overlay .close-full-overlay:focus,
    464439.theme-install-overlay .previous-theme:hover,
     
    469444        color: $menu-highlight-text;
    470445}
    471446
     447/* Filter */
     448
     449.wp-filter-link.current {
     450        border-bottom-color: $menu-background;
     451}
     452
     453body.show-filter-drawer {
     454        .wp-filter-drawer-toggle {
     455                background-color: $menu-background;
     456                color: $menu-text;
     457        }
     458        .wp-filter-drawer-toggle:before {
     459                color: $menu-text;
     460        }
     461        .wp-filter-drawer-toggle:hover,
     462        .wp-filter-drawer-toggle:focus {
     463                background-color: $menu-highlight-background;
     464                color: $menu-highlight-text;   
     465        }
     466        .wp-filter-drawer-toggle:hover:before,
     467        .wp-filter-drawer-toggle:focus:before {
     468                color: $menu-highlight-text;   
     469        }
     470}
     471
    472472/* Widgets */
    473473
    474474.widgets-chooser li.widgets-chooser-selected {
     
    529529        background: $menu-highlight-background;
    530530}
    531531
    532 .star-rating .star {
     532.star-rating .star,
     533.rating span:before {
    533534        color: $highlight-color;
    534535}
    535536
  • src/wp-admin/css/common.css

     
    627627        padding-right: 0;
    628628}
    629629
     630.wp-title-count {
     631        display: inline;
     632        padding: 4px 10px;
     633        -webkit-border-radius: 30px;
     634        border-radius: 30px;
     635        background: #777;
     636        font-size: 14px;
     637        font-weight: 600;
     638        color: #fff;
     639        position: relative;
     640        top: -3px;
     641        margin-left: 5px;
     642        margin-right: 20px;
     643}
     644
    630645.wp-dialog {
    631646        background-color: #fff;
    632647}
     
    18001815        margin: 6px 0 0;
    18011816}
    18021817
     1818.rating span:before {
     1819        content: "\f154";
     1820        display: inline-block;
     1821        -webkit-font-smoothing: antialiased;
     1822        font: normal 20px/1 'dashicons';
     1823        vertical-align: top;
     1824        color: #0074a2;
     1825}
     1826/* Half stars */
     1827.rating-10 span.one:before,
     1828.rating-30 span.two:before,
     1829.rating-50 span.three:before,
     1830.rating-70 span.four:before,
     1831.rating-90 span.five:before {
     1832        content: "\f459";
     1833}
     1834/* Full stars */
     1835.rating-20 span.one:before {
     1836        content: "\f155";
     1837}
     1838.rating-30 span.one:before,
     1839.rating-40 span.one:before,
     1840.rating-40 span.two:before {
     1841        content: "\f155";
     1842}
     1843.rating-50 span.one:before,
     1844.rating-50 span.two:before,
     1845.rating-60 span.one:before,
     1846.rating-60 span.two:before,
     1847.rating-60 span.three:before {
     1848        content: "\f155";
     1849}
     1850.rating-70 span.one:before,
     1851.rating-70 span.two:before,
     1852.rating-70 span.three:before,
     1853.rating-80 span.one:before,
     1854.rating-80 span.two:before,
     1855.rating-80 span.three:before,
     1856.rating-80 span.four:before {
     1857        content: "\f155";
     1858}
     1859.rating-90 span.one:before,
     1860.rating-90 span.two:before,
     1861.rating-90 span.three:before,
     1862.rating-90 span.four:before,
     1863.rating-100 span.one:before,
     1864.rating-100 span.two:before,
     1865.rating-100 span.three:before,
     1866.rating-100 span.four:before,
     1867.rating-100 span.five:before {
     1868        content: "\f155";
     1869}
     1870.rating .ratings {
     1871        display: inline;
     1872        margin-left: 10px;
     1873        line-height: 20px;
     1874        color: #999;
     1875}
     1876
    18031877/* Plugin install thickbox */
    18041878#plugin-information {
    18051879        background: #fcfcfc;
  • src/wp-admin/css/forms.css

     
    751751        margin: -3px 3px;
    752752}
    753753
     754/*------------------------------------------------------------------------------
     755  21.0 - Upload File
     756------------------------------------------------------------------------------*/
     757
     758.wp-upload-container {
     759        -webkit-box-sizing: border-box;
     760        -moz-box-sizing: border-box;
     761        box-sizing: border-box;
     762        margin: 0px 0 0;
     763        padding: 0;
     764        width: 100%;
     765        overflow: hidden;
     766        position: relative;
     767        top: 10px;
     768}
     769.wp-upload-container-hidden {
     770        display: none;
     771}
     772.wp-upload-container .wp-upload-form {
     773        background: #fafafa;
     774        border: 1px solid #e5e5e5;
     775        padding: 30px;
     776        margin: 30px auto;
     777        max-width: 380px;
     778}
     779.wp-upload-container .install-help {
     780        color: #999;
     781        font-size: 18px;
     782        font-style: normal;
     783        margin: 0;
     784        padding: 40px 0 0;
     785        text-align: center;
     786}
     787
     788body.show-upload-container .hide-on-upload,
     789body.show-upload-container .wp-upload-show {
     790        display: none;
     791}
     792body.show-upload-container .wp-upload-container-hidden {
     793        display: block;
     794}
     795
     796.wp-upload-hide {
     797        display: none;
     798}
     799body.show-upload-container .wp-upload-hide {
     800        display: inline;
     801}
     802
    754803/* =Media Queries
    755804-------------------------------------------------------------- */
    756805
     806@media only screen and (max-width: 1120px) {
     807        .wp-upload-container .wp-upload-form {
     808                margin: 20px 0;
     809                max-width: 100%;
     810        }
     811        .wp-upload-container .install-help {
     812                font-size: 15px;
     813                padding: 20px 0 0;
     814                text-align: left;
     815        }
     816}
     817
    757818@media screen and ( max-width: 782px ) {
    758819        /* Input Elements */
    759820        textarea {
  • src/wp-admin/css/list-tables.css

     
    12121212}
    12131213
    12141214/* Plugin card table view */
     1215
     1216.plugin-browser .plugins {
     1217        clear: both;
     1218        padding: 0 0 100px;
     1219}
     1220
    12151221.plugin-card {
    12161222        float: left;
    12171223        margin: 0 8px 16px;
     
    12191225        width: -webkit-calc( 50% - 8px );
    12201226        width: calc( 50% - 8px );
    12211227        background-color: #fff;
    1222         border: 1px solid #dedede;
     1228        border: 1px solid #e5e5e5;
     1229        -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);
     1230        box-shadow: 0 1px 1px rgba(0,0,0,0.04);
    12231231        -webkit-box-sizing: border-box;
    12241232        -moz-box-sizing: border-box;
    12251233        box-sizing: border-box;
    12261234}
    12271235
     1236.plugin-card .column-hidden {
     1237        display: none;
     1238}
     1239
     1240.plugin-card .column-visible {
     1241        display: block;
     1242}
     1243
     1244.plugin-card a {
     1245        text-decoration: none;
     1246}
     1247
    12281248@media screen and ( max-width: 782px ) {
    12291249        .plugin-card {
    12301250                margin-left: 0;
     
    12331253        }
    12341254}
    12351255
    1236 .plugin-card:nth-child(odd) {
     1256.plugins .plugin:nth-child(odd) .plugin-card {
    12371257        clear: both;
    12381258        margin-left: 0;
    12391259}
    12401260
    1241 .plugin-card:nth-child(even) {
     1261.plugins .plugin:nth-child(even) .plugin-card {
    12421262        margin-right: 0
    12431263}
    12441264
     
    12761296        clear: both;
    12771297        padding: 12px 20px;
    12781298        background-color: #fafafa;
    1279         border-top: 1px solid #dedede;
     1299        border-top: 1px solid #e5e5e5;
    12801300        overflow: hidden;
    12811301}
    12821302
    1283 .plugin-card-bottom .star-rating {
     1303.plugin-card-bottom .rating {
    12841304        display: inline;
     1305        margin-right: .35em;
    12851306}
     1307.plugin-card-bottom .rating span:before {
     1308        float: left;
     1309}
    12861310
    12871311.plugin-card .column-rating {
    12881312        line-height: 23px;
  • src/wp-admin/css/themes.css

     
    2525        margin-left: 20px;
    2626}
    2727
    28 .themes-php .wrap .theme-count,
    29 .theme-navigation .theme-count {
    30         color: #fff;
    31         -webkit-border-radius: 30px;
    32         border-radius: 30px;
    33         background: #777;
    34         font-size: 14px;
    35         padding: 4px 10px;
    36         font-weight: 600;
    37         margin-left: 5px;
    38         margin-right: 20px;
    39         position: relative;
    40         top: -3px;
    41 }
    42 
    43 .theme-navigation a {
    44         text-decoration:none;
    45 }
    46 
    4728/* Position admin messages */
    4829.themes-php div.updated,
    4930.themes-php div.error {
     
    5132        clear: both;
    5233}
    5334
     35/*
     36 * The search form
     37 */
     38.themes-php .wp-filter-search {
     39        position: relative;
     40        top: -2px;
     41        left: 20px;
     42        font-size: 16px;
     43        font-weight: 300;
     44        line-height: 1.5;
     45        width: 280px;
     46        margin: 0;
     47}
     48
    5449.themes-php div.updated a {
    5550        text-decoration: underline;
    5651}
     
    401396        z-index: 2;
    402397}
    403398
    404 /*
    405  * The search form
    406  */
    407 .themes-php .theme-search {
    408         position: relative;
    409         top: -2px;
    410         left: 20px;
    411         font-size: 16px;
    412         font-weight: 300;
    413         line-height: 1.5;
    414         width: 280px;
    415 }
    416 
    417399/**
    418400 * Theme Overlay
    419401 * Shown when clicking a theme
     
    10241006        .themes-php .wrap h2 {
    10251007                width: 100%;
    10261008        }
    1027 
    1028         .themes-php .theme-search {
     1009       
     1010        .themes-php .wp-filter-search {
    10291011                float: none;
    10301012                clear: both;
    10311013                left: 0;
     
    10881070        display: none !important;
    10891071}
    10901072
    1091 .theme-navigation {
    1092         background: #fff;
    1093         -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
    1094         box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
    1095         -webkit-box-sizing: border-box;
    1096         -moz-box-sizing: border-box;
    1097         box-sizing: border-box;
    1098         color: #555;
    1099         display: inline-block;
    1100         font-size: 13px;
    1101         margin: 20px 0 30px;
    1102         padding: 0 20px;
    1103         position: relative;
    1104         width: 100%;
    1105 }
    1106 .theme-install-php a.upload,
    1107 .theme-install-php a.browse-themes {
    1108         cursor: pointer;
    1109 }
    1110 .theme-install-php a.browse-themes,
    1111 .theme-install-php.show-upload-theme a.upload {
    1112         display: none;
    1113 }
    1114 .theme-install-php.show-upload-theme a.browse-themes {
    1115         display: inline;
    1116 }
    1117 .upload-theme {
    1118         -webkit-box-sizing: border-box;
    1119         -moz-box-sizing: border-box;
    1120         box-sizing: border-box;
    1121         display: none;
    1122         margin: 0px 0 0;
    1123         padding: 0;
    1124         width: 100%;
    1125         overflow: hidden;
    1126         position: relative;
    1127         top: 10px;
    1128 }
    1129 body.show-upload-theme .upload-theme {
    1130         display: block;
    1131 }
    1132 .upload-theme .wp-upload-form {
    1133         background: #fafafa;
    1134         border: 1px solid #e5e5e5;
    1135         padding: 30px;
    1136         margin: 30px auto;
    1137         max-width: 380px;
    1138 }
    1139 .upload-theme .install-help {
    1140         color: #999;
    1141         font-size: 18px;
    1142         font-style: normal;
    1143         margin: 0;
    1144         padding: 40px 0 0;
    1145         text-align: center;
    1146 }
    1147 body.show-upload-theme .upload-theme + .theme-navigation,
    1148 body.show-upload-theme .upload-theme + .theme-navigation + .theme-browser {
    1149         display: none;
    1150 }
    1151 .theme-navigation .theme-count {
    1152         margin-left: 0;
    1153         position: absolute;
    1154         top: 12px;
    1155 }
    1156 .theme-count + .theme-section {
    1157         margin-left: 60px;
    1158 }
    1159 .theme-section,
    1160 .theme-filter {
    1161         border-bottom: 4px solid #fff;
    1162         color: #666;
    1163         cursor: pointer;
    1164         display: inline-block;
    1165         margin: 0 10px;
    1166         padding: 15px 0;
    1167 }
    1168 .theme-section.current,
    1169 .theme-filter.current {
    1170         border-bottom: 4px solid #666;
    1171         color: #222;
    1172 }
    1173 .theme-top-filters {
    1174         display: inline-block;
    1175 }
    1176 .theme-navigation .more-filters {
    1177         color: #666;
    1178         cursor: pointer;
    1179         display: inline-block;
    1180         margin: 0 10px;
    1181         padding: 4px 6px;
    1182 }
    1183 body.more-filters-opened .more-filters {
    1184         background: #777;
    1185         -webkit-border-radius: 2px;
    1186         border-radius: 2px;
    1187         border: none;
    1188         color: #fff;
    1189 }
    1190 
    1191 body.more-filters-opened .more-filters:before {
    1192         color: #fff;
    1193 }
    1194 
    1195 body.more-filters-opened .more-filters:hover,
    1196 body.more-filters-opened .more-filters:focus {
    1197         background: rgb(46, 162, 204);
    1198 }
    1199 
    1200 .theme-install-php .theme-search {
    1201         position: absolute;
    1202         right: 10px;
    1203         top: 9px;
    1204         font-size: 16px;
    1205         font-weight: 300;
    1206         line-height: 1.5;
    1207         width: 280px;
    1208 }
    1209 .more-filters:before {
    1210         color: #777;
    1211         text-align: center;
    1212         margin: 0 5px 0 0;
    1213         content: "\f111";
    1214         display: inline-block;
    1215         width: 16px;
    1216         height: 16px;
    1217         -webkit-font-smoothing: antialiased;
    1218         font-size: 16px;
    1219         line-height: 1;
    1220         font-family: "dashicons";
    1221         text-decoration: inherit;
    1222         font-weight: normal;
    1223         font-style: normal;
    1224         vertical-align: top;
    1225         -webkit-transition: color .1s ease-in 0;
    1226         transition: color .1s ease-in 0;
    1227         text-align: center;
    1228 }
    1229 .more-filters.current:before {
    1230         color: #fff;
    1231 }
    1232 .more-filters-container {
    1233         display: none;
    1234         padding: 20px;
    1235         border-top: 1px solid #eee;
    1236         margin: 0 -20px;
    1237         background: #fafafa;
    1238 }
    1239 body.more-filters-opened .more-filters-container {
    1240         display: block;
    1241         overflow: hidden;
    1242 }
    1243 body.more-filters-opened .theme-section.current {
    1244         border-bottom: none;
    1245 }
    1246 body.more-filters-opened .theme-browser,
    1247 body.more-filters-opened.filters-applied.loading-themes .theme-browser {
    1248         display: none;
    1249 }
    1250 body.more-filters-opened.filters-applied .theme-browser {
    1251         display: block;
    1252 }
    1253 .more-filters-container .filters-group {
    1254         -webkit-box-sizing: border-box;
    1255         -moz-box-sizing: border-box;
    1256         box-sizing: border-box;
    1257         float: left;
    1258         width: 19%;
    1259         background: #fff;
    1260         margin: 0 1% 0 0;
    1261         border: 1px solid #e5e5e5;
    1262         -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);
    1263         box-shadow: 0 1px 1px rgba(0,0,0,0.04);
    1264         padding: 10px;
    1265 }
    1266 .more-filters-container .wide-filters-group {
    1267         width: 38%;
    1268 }
    1269 .more-filters-container .feature-name {
    1270         margin: 0;
    1271         position: relative;
    1272 }
    1273 .more-filters-container ol {
    1274         list-style-type: none;
    1275         margin: 20px 0 0;
    1276         font-size: 12px;
    1277 }
    1278 .more-filters-container li {
    1279         display: inline-block;
    1280         vertical-align: top;
    1281         list-style-type: none;
    1282         margin: 5px 0;
    1283         padding-right: 25px;
    1284         width: 160px;
    1285 }
    1286 .theme-navigation .more-filters-container .apply-filters {
    1287         margin: 0 0 20px;
    1288 }
    1289 .theme-navigation .more-filters-container .clear-filters {
    1290         display: none;
    1291         margin: 0 0 20px 10px;
    1292 }
    1293 .more-filters-container .apply-filters span {
    1294         display: inline-block;
    1295         font-size: 12px;
    1296         text-indent: 10px;
    1297         opacity: 0.8;
    1298 }
    1299 .more-filters-container .filtering-by {
    1300         display: none;
    1301         margin: 0;
    1302 }
    1303 .more-filters-container .filtering-by > span {
    1304         font-weight: 600;
    1305 }
    1306 .more-filters-container .filtering-by .tags {
    1307         display: inline;
    1308 }
    1309 .more-filters-container .filtering-by .tag {
    1310         background: #fff;
    1311         border: 1px solid #e5e5e5;
    1312         -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);
    1313         box-shadow: 0 1px 1px rgba(0,0,0,0.04);
    1314         font-size: 11px;
    1315         margin: 0 5px;
    1316         padding: 4px 8px;
    1317 }
    1318 .more-filters-container .filtering-by a {
    1319         margin-left: 10px;
    1320 }
    1321 body.filters-applied .more-filters-container .filters-group,
    1322 body.filters-applied .more-filters-container a.button,
    1323 body.filters-applied .more-filters-container br {
    1324         display: none !important;
    1325 }
    1326 body.filters-applied .more-filters-container .filtering-by {
    1327         display: block;
    1328 }
    1329 body.filters-applied .more-filters-container {
    1330         padding: 20px;
    1331 }
    1332 p.no-themes {
    1333         color: #999;
    1334         font-size: 18px;
    1335         font-style: normal;
    1336         margin: 0;
    1337         padding: 0;
    1338         text-align: center;
    1339         display: none;
    1340 }
    1341 body.no-results p.no-themes {
    1342         display: block;
    1343 }
    1344 body.show-upload-theme p.no-themes {
    1345         display: none !important;
    1346 }
    1347 
    1348 
    1349 .theme-install-php .add-new-theme {
    1350         display: none !important;
    1351 }
    1352 
    1353 @media only screen and (max-width: 1120px) {
    1354         .theme-install-php .theme-search {
    1355                 margin: 20px 0;
    1356                 position: static;
    1357                 width: 100%;
    1358         }
    1359         .more-filters-container {
    1360                 border-bottom: 1px solid #eee;
    1361         }
    1362         .upload-theme .wp-upload-form {
    1363                 margin: 20px 0;
    1364                 max-width: 100%;
    1365         }
    1366         .upload-theme .install-help {
    1367                 font-size: 15px;
    1368                 padding: 20px 0 0;
    1369                 text-align: left;
    1370         }
    1371         .more-filters-container .filters-group {
    1372                 margin-bottom: 0;
    1373                 margin-top: 5px;
    1374                 width: 100%;
    1375         }
    1376         .more-filters-container .filters-group li {
    1377                 margin: 10px 0;
    1378         }
    1379 }
    1380 
    1381 @media only screen and (max-width: 782px) {
    1382         .more-filters-container .filters-group {
    1383                 width: 100%;
    1384         }
    1385         .more-filters-container .filters-group li {
    1386                 width: 100%;
    1387         }
    1388 }
    1389 
    1390 .rating {
    1391         margin: 30px 0;
    1392 }
    1393 .rating span:before {
    1394         color: #e6b800;
    1395         content: "\f154";
    1396         display: inline-block;
    1397         -webkit-font-smoothing: antialiased;
    1398         font: normal 20px/1 'dashicons';
    1399         vertical-align: top;
    1400 }
    1401 /* Half stars */
    1402 .rating-10 span.one:before,
    1403 .rating-30 span.two:before,
    1404 .rating-50 span.three:before,
    1405 .rating-70 span.four:before,
    1406 .rating-90 span.five:before {
    1407         content: "\f459";
    1408 }
    1409 /* Full stars */
    1410 .rating-20 span.one:before {
    1411         content: "\f155";
    1412 }
    1413 .rating-30 span.one:before,
    1414 .rating-40 span.one:before,
    1415 .rating-40 span.two:before {
    1416         content: "\f155";
    1417 }
    1418 .rating-50 span.one:before,
    1419 .rating-50 span.two:before,
    1420 .rating-60 span.one:before,
    1421 .rating-60 span.two:before,
    1422 .rating-60 span.three:before {
    1423         content: "\f155";
    1424 }
    1425 .rating-70 span.one:before,
    1426 .rating-70 span.two:before,
    1427 .rating-70 span.three:before,
    1428 .rating-80 span.one:before,
    1429 .rating-80 span.two:before,
    1430 .rating-80 span.three:before,
    1431 .rating-80 span.four:before {
    1432         content: "\f155";
    1433 }
    1434 .rating-90 span.one:before,
    1435 .rating-90 span.two:before,
    1436 .rating-90 span.three:before,
    1437 .rating-90 span.four:before,
    1438 .rating-100 span.one:before,
    1439 .rating-100 span.two:before,
    1440 .rating-100 span.three:before,
    1441 .rating-100 span.four:before,
    1442 .rating-100 span.five:before {
    1443         content: "\f155";
    1444 }
    1445 .rating .ratings {
    1446         display: inline;
    1447         margin-left: 10px;
    1448         line-height: 20px;
    1449         color: #999;
    1450 }
    1451 .loading-themes .theme-browser,
    1452 .error .theme-browser {
    1453         display: none;
    1454 }
    1455 .loading-themes .spinner {
    1456         display: block;
    1457         margin: 40px auto 0;
    1458         float: none;
    1459 }
    1460 
    14611073/*------------------------------------------------------------------------------
    14621074  16.3 - Custom Header Screen
    14631075------------------------------------------------------------------------------*/
     
    16181230        overflow: auto;
    16191231}
    16201232
     1233.wp-full-overlay-sidebar .rating {
     1234        display: block;
     1235        margin: 30px 0;
     1236}
     1237.wp-full-overlay-sidebar .rating span:before {
     1238        color: #e6b800;
     1239}
     1240
    16211241/* Close & Navigation Links */
    16221242.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header {
    16231243        padding: 0;
  • src/wp-admin/css/wp-admin.css

     
    1212@import url(nav-menus.css);
    1313@import url(widgets.css);
    1414@import url(l10n.css);
     15@import url(filter.css);
  • src/wp-admin/includes/ajax-actions.php

     
    26052605}
    26062606
    26072607/**
     2608 * Ajax handler for getting plugins from plugins_api().
     2609 *
     2610 * @since 4.0.0
     2611 */
     2612function wp_ajax_query_plugins() {
     2613        global $plugins_allowedtags, $plugins_field_defaults;
     2614       
     2615        if ( ! current_user_can( 'install_plugins' ) ) {
     2616                wp_send_json_error();
     2617        }
     2618        $args = wp_parse_args( wp_unslash( $_REQUEST['request'] ), array(
     2619                'per_page' => 20,
     2620                'fields'   => $plugins_field_defaults
     2621        ) );
     2622
     2623        $old_filter = isset( $args['browse'] ) ? $args['browse'] : 'search';
     2624
     2625        /** This filter is documented in wp-admin/includes/class-wp-theme-install-list-table.php */
     2626        $args = apply_filters( 'install_plugins_table_api_args_' . $old_filter, $args );
     2627
     2628        require( ABSPATH . 'wp-admin/includes/plugin-install.php' ); // Needed for plugins_api
     2629       
     2630        $api = plugins_api( 'query_plugins', $args );
     2631
     2632        if ( is_wp_error( $api ) ) {
     2633                wp_send_json_error();
     2634        }
     2635
     2636        foreach ( $api->plugins as &$plugin ) {
     2637               
     2638                if ( version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $plugin->tested ) ), $plugin->tested, '>' ) ) {
     2639                        $plugin->compatibility = 'untested';
     2640                } else if ( version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $plugin->requires ) ), $plugin->requires, '<' ) ) {
     2641                        $plugin->compatibility = 'incompatible';
     2642                } else {
     2643                        $plugin->compatibility = 'compatible';
     2644                }
     2645               
     2646                $details_link   = self_admin_url( 'plugin-install.php?tab=plugin-information&amp;plugin=' . $plugin->slug .
     2647                                                                '&amp;TB_iframe=true&amp;width=830&amp;height=654' );
     2648                                                               
     2649                /**
     2650                 * Filter the details link for a plugin.
     2651                 *
     2652                 * @since 4.0.0
     2653                 *
     2654                 * @param string $details_link Link to view the current plugin's details.
     2655                 * @param array  $plugin       The plugin currently being listed.
     2656                 */
     2657                $plugin->detail_url = apply_filters( 'plugin_install_details_link', $details_link, (array) $plugin );
     2658               
     2659                $action_links = array();
     2660               
     2661                $name = strip_tags( $plugin->name . ' ' . $plugin->version );
     2662               
     2663                $status = install_plugin_install_status( $plugin );
     2664               
     2665                switch ( $status['status'] ) {
     2666                        case 'install':
     2667                                if ( $status['url'] ) {
     2668                                        $action_links[]  = '<a class="install-now button" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>';
     2669                                }
     2670
     2671                                break;
     2672                        case 'update_available':
     2673                                if ( $status['url'] ) {
     2674                                        $action_links[] = '<a class="button" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . __( 'Update Now' ) . '</a>';
     2675                                }
     2676
     2677                                break;
     2678                        case 'latest_installed':
     2679                        case 'newer_installed':
     2680                                $action_links[] = '<span class="button button-disabled" title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . _x( 'Installed', 'plugin' ) . '</span>';
     2681                                break;
     2682                }
     2683               
     2684                $action_links[] = '<a href="' . esc_attr( $details_link ) . '" class="thickbox" title="' .
     2685                                                                esc_attr( sprintf( __( 'More information about %s' ), $plugin->name ) ) . '">' . __( 'More Details' ) . '</a>';
     2686
     2687                /**
     2688                 * Filter the install action links for a plugin.
     2689                 *
     2690                 * @since 2.7.0
     2691                 *
     2692                 * @param array $action_links An array of plugin action hyperlinks. Defaults are links to Details and Install Now.
     2693                 * @param array $plugin       The plugin currently being listed.
     2694                 */
     2695                $plugin->action_links = apply_filters( 'plugin_install_action_links', $action_links, (array) $plugin );
     2696               
     2697                $plugin->name                                   = wp_kses( strip_tags( $plugin->name ), $plugins_allowedtags );
     2698                $plugin->author                                 = wp_kses( $plugin->author, $plugins_allowedtags );
     2699                $plugin->slug                                   = wp_kses( $plugin->slug, $plugins_allowedtags );
     2700                $plugin->version                                = wp_kses( $plugin->version, $plugins_allowedtags );
     2701                $plugin->description                    = strip_tags( $plugin->description );
     2702                $plugin->short_description              = strip_tags( $plugin->short_description );
     2703                $plugin->rating                                 = wp_kses( $plugin->rating, $plugins_allowedtags );
     2704                $plugin->ratings                                = wp_kses( $plugin->ratings, $plugins_allowedtags );
     2705                $plugin->num_ratings                    = $plugin->num_ratings;
     2706                $plugin->num_ratings_formatted  = number_format_i18n( $plugin->num_ratings );
     2707                $plugin->downloaded                             = number_format_i18n( $plugin->downloaded );
     2708                $plugin->last_updated                   = sprintf( __( '%s ago' ), human_time_diff( strtotime( $plugin->last_updated ) ) );
     2709        }
     2710
     2711        wp_send_json_success( $api );
     2712}
     2713
     2714/**
    26082715 * Apply [embed] handlers to a string.
    26092716 *
    26102717 * @since 4.0.0
  • src/wp-admin/includes/class-wp-plugin-install-list-table.php

     
    2727                // These are the tabs which are shown on the page
    2828                $tabs = array();
    2929                $tabs['dashboard'] = __( 'Search' );
    30                 if ( 'search' == $tab )
     30                if ( 'search' == $tab ) {
    3131                        $tabs['search'] = __( 'Search Results' );
    32                 $tabs['upload']    = __( 'Upload' );
     32                }
    3333                $tabs['featured']  = _x( 'Featured', 'Plugin Installer' );
    3434                $tabs['popular']   = _x( 'Popular', 'Plugin Installer' );
    3535                $tabs['new']       = _x( 'Newest', 'Plugin Installer' );
     
    4040
    4141                $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.
    4242
    43                 /**
    44                  * Filter the tabs shown on the Plugin Install screen.
    45                  *
    46                  * @since 2.7.0
    47                  *
    48                  * @param array $tabs The tabs shown on the Plugin Install screen. Defaults are 'dashboard', 'search',
    49                  *                    'upload', 'featured', 'popular', 'new', and 'favorites'.
    50                  */
     43                /** This filter is documented in wp-admin/plugin-install.php */
    5144                $tabs = apply_filters( 'install_plugins_tabs', $tabs );
    5245
    5346                /**
     
    112105                 * Filter API request arguments for each Plugin Install screen tab.
    113106                 *
    114107                 * The dynamic portion of the hook name, $tab, refers to the plugin install tabs.
    115                  * Default tabs are 'dashboard', 'search', 'upload', 'featured', 'popular', 'new',
     108                 * Default tabs are 'dashboard', 'search', 'featured', 'popular', 'new',
    116109                 * and 'favorites'.
    117110                 *
    118111                 * @since 3.7.0
  • src/wp-admin/includes/plugin-install.php

     
    126126
    127127function install_dashboard() {
    128128        ?>
    129         <p><?php printf( __( 'Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the <a href="%1$s">WordPress Plugin Directory</a> or upload a plugin in .zip format via <a href="%2$s">this page</a>.' ), 'https://wordpress.org/plugins/', self_admin_url( 'plugin-install.php?tab=upload' ) ); ?></p>
     129        <p><?php printf( __( 'Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the <a href="%1$s">WordPress Plugin Directory</a> or <a href="%2$s" class="wp-upload-show">upload a plugin</a> in .zip format.' ), 'https://wordpress.org/plugins/', self_admin_url( 'plugin-install.php?upload' ) ); ?></p>
    130130
    131131        <h4><?php _e('Search') ?></h4>
    132132        <?php install_search_form( false ); ?>
     
    187187 */
    188188function install_plugins_upload( $page = 1 ) {
    189189?>
    190         <h4><?php _e('Install a plugin in .zip format'); ?></h4>
    191         <p class="install-help"><?php _e('If you have a plugin in a .zip format, you may install it by uploading it here.'); ?></p>
    192         <form method="post" enctype="multipart/form-data" class="wp-upload-form" action="<?php echo self_admin_url('update.php?action=upload-plugin'); ?>">
    193                 <?php wp_nonce_field( 'plugin-upload'); ?>
    194                 <label class="screen-reader-text" for="pluginzip"><?php _e('Plugin zip file'); ?></label>
    195                 <input type="file" id="pluginzip" name="pluginzip" />
    196                 <?php submit_button( __( 'Install Now' ), 'button', 'install-plugin-submit', false ); ?>
    197         </form>
     190        <div class="wp-upload-container wp-upload-container-hidden">
     191                <p class="install-help"><?php _e( 'If you have a plugin in a .zip format, you may install it by uploading it here.' ); ?></p>
     192                <form method="post" enctype="multipart/form-data" class="wp-upload-form" action="<?php echo self_admin_url( 'update.php?action=upload-plugin' ); ?>">
     193                        <?php wp_nonce_field( 'plugin-upload' ); ?>
     194                        <label class="screen-reader-text" for="pluginzip"><?php _e( 'Plugin zip file' ); ?></label>
     195                        <input type="file" id="pluginzip" name="pluginzip" />
     196                        <?php submit_button( __( 'Install Now' ), 'button', 'install-plugin-submit', false ); ?>
     197                </form>
     198        </div>
    198199<?php
    199200}
    200201add_action('install_plugins_upload', 'install_plugins_upload', 10, 1);
  • src/wp-admin/includes/theme-install.php

     
    136136
    137137function install_themes_upload() {
    138138?>
    139 <p class="install-help"><?php _e('If you have a theme in a .zip format, you may install it by uploading it here.'); ?></p>
    140 <form method="post" enctype="multipart/form-data" class="wp-upload-form" action="<?php echo self_admin_url('update.php?action=upload-theme'); ?>">
    141         <?php wp_nonce_field( 'theme-upload'); ?>
    142         <input type="file" name="themezip" />
    143         <?php submit_button( __( 'Install Now' ), 'button', 'install-theme-submit', false ); ?>
    144 </form>
    145         <?php
     139        <div class="wp-upload-container wp-upload-container-hidden">
     140                <p class="install-help"><?php _e( 'If you have a theme in a .zip format, you may install it by uploading it here.' ); ?></p>
     141                <form method="post" enctype="multipart/form-data" class="wp-upload-form" action="<?php echo self_admin_url( 'update.php?action=upload-theme' ); ?>">
     142                        <?php wp_nonce_field( 'theme-upload' ); ?>
     143                        <input type="file" name="themezip" />
     144                        <?php submit_button( __( 'Install Now' ), 'button', 'install-theme-submit', false ); ?>
     145                </form>
     146        </div>
     147<?php
    146148}
    147149// add_action('install_themes_upload', 'install_themes_upload', 10, 0);
    148150
  • src/wp-admin/js/theme.js

     
    7979
    8080                // Render and append
    8181                this.view.render();
    82                 this.$el.empty().append( this.view.el ).addClass('rendered');
     82                this.$el.empty().append( this.view.el ).addClass( 'rendered' );
    8383                this.$el.append( '<br class="clear"/>' );
    8484        },
    8585
     
    105105                // Render and append after screen title
    106106                view.render();
    107107                this.searchContainer
    108                         .append( $.parseHTML( '<label class="screen-reader-text" for="theme-search-input">' + l10n.search + '</label>' ) )
     108                        .append( $.parseHTML( '<label class="screen-reader-text" for="wp-filter-search-input">' + l10n.search + '</label>' ) )
    109109                        .append( view.el );
    110110        },
    111111
    112112        // Checks when the user gets close to the bottom
    113         // of the mage and triggers a theme:scroll event
     113        // of the page and triggers a theme:scroll event
    114114        scroller: function() {
    115115                var self = this,
    116116                        bottom, threshold;
     
    342342                        beforeSend: function() {
    343343                                if ( ! paginated ) {
    344344                                        // Spin it
    345                                         $( 'body' ).addClass( 'loading-themes' ).removeClass( 'no-results' );
     345                                        $( 'body' ).addClass( 'loading-content' ).removeClass( 'no-results' );
    346346                                }
    347347                        }
    348348                });
     
    10801080themes.view.Search = wp.Backbone.View.extend({
    10811081
    10821082        tagName: 'input',
    1083         className: 'theme-search',
    1084         id: 'theme-search-input',
     1083        className: 'wp-filter-search',
     1084        id: 'wp-filter-search-input',
    10851085        searching: false,
    10861086
    10871087        attributes: {
     
    11101110        // Runs a search on the theme collection.
    11111111        search: function( event ) {
    11121112                var options = {};
    1113 
     1113               
    11141114                // Clear on escape.
    11151115                if ( event.type === 'keyup' && event.which === 27 ) {
    11161116                        event.target.value = '';
     
    11681168        },
    11691169
    11701170        search: function( query ) {
    1171                 $( '.theme-search' ).val( query );
     1171                $( '.wp-filter-search' ).val( query );
    11721172        },
    11731173
    11741174        themes: function() {
    1175                 $( '.theme-search' ).val( '' );
     1175                $( '.wp-filter-search' ).val( '' );
    11761176        },
    11771177
    11781178        navigate: function() {
     
    12291229
    12301230                // Handles search route event
    12311231                themes.router.on( 'route:search', function() {
    1232                         $( '.theme-search' ).trigger( 'keyup' );
     1232                        $( '.wp-filter-search' ).trigger( 'keyup' );
    12331233                });
    12341234
    12351235                this.extraRoutes();
     
    12881288                        request.tag = [ value.slice( 4 ) ];
    12891289                }
    12901290
    1291                 $( '.theme-section.current' ).removeClass( 'current' );
    1292                 $( 'body' ).removeClass( 'more-filters-opened filters-applied' );
     1291                $( '.wp-filter-link.current' ).removeClass( 'current' );
     1292                $( 'body' ).removeClass( 'show-filter-drawer filters-applied' );
    12931293
    12941294                // Get the themes by sending Ajax POST request to api.wordpress.org/themes
    12951295                // or searching the local cache
     
    13041304
    13051305        el: '#wpbody-content .wrap',
    13061306
    1307         // Register events for sorting and filters in theme-navigation
     1307        // Register events for sorting and filters in wp-filter
    13081308        events: {
    1309                 'click .theme-section': 'onSort',
     1309                'click .wp-filter-link': 'onSort',
    13101310                'click .theme-filter': 'onFilter',
    1311                 'click .more-filters': 'moreFilters',
    1312                 'click .apply-filters': 'applyFilters',
    1313                 'click [type="checkbox"]': 'addFilter',
    1314                 'click .clear-filters': 'clearFilters',
    1315                 'click .feature-name': 'filterSection',
    1316                 'click .filtering-by a': 'backToFilters'
     1311                'click .wp-filter-drawer-toggle': 'moreFilters',
     1312                'click .wp-filter-drawer-apply': 'applyFilters',
     1313                'click .wp-filter-group [type="checkbox"]': 'addFilter',
     1314                'click .wp-filter-drawer-clear': 'clearFilters',
     1315                'click .wp-filter-group-title': 'filterSection',
     1316                'click .wp-filter-by a': 'backToFilters'
    13171317        },
    13181318
    13191319        // Initial render method
     
    13431343                });
    13441344
    13451345                this.listenTo( this.collection, 'query:success', function() {
    1346                         $( 'body' ).removeClass( 'loading-themes' );
     1346                        $( 'body' ).removeClass( 'loading-content' );
    13471347                        $( '.theme-browser' ).find( 'div.error' ).remove();
    13481348                });
    13491349
    13501350                this.listenTo( this.collection, 'query:fail', function() {
    1351                         $( 'body' ).removeClass( 'loading-themes' );
     1351                        $( 'body' ).removeClass( 'loading-content' );
    13521352                        $( '.theme-browser' ).find( 'div.error' ).remove();
    13531353                        $( '.theme-browser' ).find( 'div.themes' ).before( '<div class="error"><p>' + l10n.error + '</p></div>' );
    13541354                });
     
    13861386
    13871387                event.preventDefault();
    13881388
    1389                 $( 'body' ).removeClass( 'filters-applied more-filters-opened' );
     1389                $( 'body' ).removeClass( 'filters-applied show-filter-drawer' );
    13901390
    13911391                // Bail if this is already active
    13921392                if ( $el.hasClass( this.activeClass ) ) {
     
    13951395
    13961396                this.sort( sort );
    13971397
    1398                 // Trigger a router.naviagte update
     1398                // Trigger a router.navigate update
    13991399                themes.router.navigate( themes.router.baseUrl( '?browse=' + sort ) );
    14001400        },
    14011401
     
    14021402        sort: function( sort ) {
    14031403                this.clearSearch();
    14041404
    1405                 $( '.theme-section, .theme-filter' ).removeClass( this.activeClass );
     1405                $( '.wp-filter-link, .theme-filter' ).removeClass( this.activeClass );
    14061406                $( '[data-sort="' + sort + '"]' ).addClass( this.activeClass );
    14071407
    14081408                this.browse( sort );
     
    14191419                        return;
    14201420                }
    14211421
    1422                 $( '.theme-filter, .theme-section' ).removeClass( this.activeClass );
     1422                $( '.wp-filter-link, .theme-filter' ).removeClass( this.activeClass );
    14231423                $el.addClass( this.activeClass );
    14241424
    14251425                if ( ! filter ) {
     
    14461446                var name,
    14471447                        tags = this.filtersChecked(),
    14481448                        request = { tag: tags },
    1449                         filteringBy = $( '.filtering-by .tags' );
     1449                        filteringBy = $( '.wp-filter-by .tags' );
    14501450
    14511451                if ( event ) {
    14521452                        event.preventDefault();
     
    14531453                }
    14541454
    14551455                $( 'body' ).addClass( 'filters-applied' );
    1456                 $( '.theme-section.current' ).removeClass( 'current' );
     1456                $( '.wp-filter-link.current' ).removeClass( 'current' );
    14571457                filteringBy.empty();
    14581458
    14591459                _.each( tags, function( tag ) {
    1460                         name = $( 'label[for="feature-id-' + tag + '"]' ).text();
     1460                        name = $( 'label[for="filter-id-' + tag + '"]' ).text();
    14611461                        filteringBy.append( '<span class="tag">' + name + '</span>' );
    14621462                });
    14631463
     
    14691469        // Get the checked filters
    14701470        // @return {array} of tags or false
    14711471        filtersChecked: function() {
    1472                 var items = $( '.feature-group' ).find( ':checkbox' ),
     1472                var items = $( '.wp-filter-group' ).find( ':checkbox' ),
    14731473                        tags = [];
    14741474
    14751475                _.each( items.filter( ':checked' ), function( item ) {
     
    14781478
    14791479                // When no filters are checked, restore initial state and return
    14801480                if ( tags.length === 0 ) {
    1481                         $( '.apply-filters' ).find( 'span' ).text( '' );
    1482                         $( '.clear-filters' ).hide();
     1481                        $( '.wp-filter-drawer-apply' ).find( 'span' ).text( '' );
     1482                        $( '.wp-filter-drawer-clear' ).hide();
    14831483                        $( 'body' ).removeClass( 'filters-applied' );
    14841484                        return false;
    14851485                }
    14861486
    1487                 $( '.apply-filters' ).find( 'span' ).text( tags.length );
    1488                 $( '.clear-filters' ).css( 'display', 'inline-block' );
     1487                $( '.wp-filter-drawer-apply' ).find( 'span' ).text( tags.length );
     1488                $( '.wp-filter-drawer-clear' ).css( 'display', 'inline-block' );
    14891489
    14901490                return tags;
    14911491        },
     
    14941494
    14951495        // Overwrite search container class to append search
    14961496        // in new location
    1497         searchContainer: $( '.theme-navigation' ),
     1497        searchContainer: $( '.wp-filter' ),
    14981498
    14991499        uploader: function() {
    1500                 $( 'a.upload' ).on( 'click', function( event ) {
     1500                $( '.wp-upload-show' ).on( 'click', function( event ) {
    15011501                        event.preventDefault();
    1502                         $( 'body' ).addClass( 'show-upload-theme' );
     1502                        $( 'body' ).addClass( 'show-upload-container' );
    15031503                        themes.router.navigate( themes.router.baseUrl( '?upload' ), { replace: true } );
    15041504                });
    1505                 $( 'a.browse-themes' ).on( 'click', function( event ) {
     1505                $( '.wp-upload-hide' ).on( 'click', function( event ) {
    15061506                        event.preventDefault();
    1507                         $( 'body' ).removeClass( 'show-upload-theme' );
     1507                        $( 'body' ).removeClass( 'show-upload-container' );
    15081508                        themes.router.navigate( themes.router.baseUrl( '' ), { replace: true } );
    15091509                });
    15101510        },
     
    15191519
    15201520                // If the filters section is opened and filters are checked
    15211521                // run the relevant query collapsing to filtered-by state
    1522                 if ( $( 'body' ).hasClass( 'more-filters-opened' ) && this.filtersChecked() ) {
     1522                if ( $( 'body' ).hasClass( 'show-filter-drawer' ) && this.filtersChecked() ) {
    15231523                        return this.addFilter();
    15241524                }
    15251525
     
    15261526                this.clearSearch();
    15271527
    15281528                themes.router.navigate( themes.router.baseUrl( '' ) );
    1529                 $( 'body' ).toggleClass( 'more-filters-opened' );
     1529                $( 'body' ).toggleClass( 'show-filter-drawer' );
    15301530        },
    15311531
    15321532        // Expand/collapse each individual filter section
     
    15371537        // Clears all the checked filters
    15381538        // @uses filtersChecked()
    15391539        clearFilters: function( event ) {
    1540                 var items = $( '.feature-group' ).find( ':checkbox' ),
     1540                var items = $( '.wp-filter-group' ).find( ':checkbox' ),
    15411541                        self = this;
    15421542
    15431543                event.preventDefault();
     
    15571557        },
    15581558
    15591559        clearSearch: function() {
    1560                 $( '#theme-search-input').val( '' );
     1560                $( '#wp-filter-search-input' ).val( '' );
    15611561        }
    15621562});
    15631563
     
    15751575        },
    15761576
    15771577        search: function( query ) {
    1578                 $( '.theme-search' ).val( query );
     1578                $( '.wp-filter-search' ).val( query );
    15791579        },
    15801580
    15811581        navigate: function() {
     
    16421642
    16431643                // Support the `upload` route by going straight to upload section
    16441644                themes.router.on( 'route:upload', function() {
    1645                         $( 'a.upload' ).trigger( 'click' );
     1645                        $( '.wp-upload-show' ).trigger( 'click' );
    16461646                });
    16471647
    16481648                // The `search` route event. The router populates the input field.
    16491649                themes.router.on( 'route:search', function() {
    1650                         $( '.theme-search' ).focus().trigger( 'keyup' );
     1650                        $( '.wp-filter-search' ).focus().trigger( 'keyup' );
    16511651                });
    16521652
    16531653                this.extraRoutes();
  • src/wp-admin/plugin-install.php

     
    66 * @subpackage Administration
    77 */
    88// TODO route this pages via a specific iframe handler instead of the do_action below
    9 if ( !defined( 'IFRAME_REQUEST' ) && isset( $_GET['tab'] ) && ( 'plugin-information' == $_GET['tab'] ) )
     9if ( !defined( 'IFRAME_REQUEST' ) && isset( $_GET['tab'] ) && ( 'plugin-information' == $_GET['tab'] ) ) {
    1010        define( 'IFRAME_REQUEST', true );
     11}
    1112
    1213/**
    1314 * WordPress Administration Bootstrap.
    1415 */
    1516require_once( dirname( __FILE__ ) . '/admin.php' );
     17require( ABSPATH . 'wp-admin/includes/plugin-install.php' );
    1618
    17 if ( ! current_user_can('install_plugins') )
     19wp_reset_vars( array( 'tab' ) );
     20
     21if ( ! current_user_can('install_plugins') ) {
    1822        wp_die(__('You do not have sufficient permissions to install plugins on this site.'));
     23}
    1924
    2025if ( is_multisite() && ! is_network_admin() ) {
    2126        wp_redirect( network_admin_url( 'plugin-install.php' ) );
     
    2227        exit();
    2328}
    2429
    25 $wp_list_table = _get_list_table('WP_Plugin_Install_List_Table');
    26 $pagenum = $wp_list_table->get_pagenum();
    27 $wp_list_table->prepare_items();
    28 
    2930$title = __('Install Plugins');
    3031$parent_file = 'plugins.php';
    3132
    32 wp_enqueue_script( 'plugin-install' );
    33 if ( 'plugin-information' != $tab )
     33$tabs = array(
     34        'upload'                => __( 'Upload Plugin' ),
     35        'browse-plugins'        => _x( 'Browse', 'plugins' ),
     36);
     37
     38$sections = array(
     39        'featured'      => _x( 'Featured', 'plugins' ),
     40        'popular'       => _x( 'Popular', 'plugins' ),
     41        'new'           => _x( 'Latest', 'plugins' ),
     42);
     43if ( $tab === 'beta' || false !== strpos( $GLOBALS['wp_version'], '-' ) ) {
     44        $sections['beta'] = _x( 'Beta Testing', 'plugins' );
     45}
     46
     47wp_localize_script( 'plugin', '_wpPluginSettings', array(
     48        'plugins' => false,
     49        'settings' => array(
     50                'isInstall'     => true,
     51                'canInstall'    => current_user_can( 'install_plugins' ),
     52                'installURI'    => current_user_can( 'install_plugins' ) ? self_admin_url( 'plugin-install.php' ) : null,
     53                'adminUrl'      => parse_url( self_admin_url(), PHP_URL_PATH )
     54        ),
     55        'l10n' => array(
     56                'search'  => __( 'Search Plugins' ),
     57                'searchPlaceholder' => __( 'Search plugins...' ), // placeholder (no ellipsis)
     58                'upload' => __( 'Upload Plugin' ),
     59                'error'  => __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>.' ),
     60                'pluginInformation' => __('Plugin Information:'),
     61                'ays' => __('Are you sure you want to install this plugin?'),
     62        ),
     63        'browse' => array(
     64                'sections' => $sections,
     65        ),
     66) );
     67
     68wp_enqueue_script( 'plugin' );
     69
     70if ( 'plugin-information' != $tab ) {
    3471        add_thickbox();
     72}
    3573
    3674$body_id = $tab;
    3775
     
    4381 *
    4482 * @since 2.7.0
    4583 */
    46 do_action( "install_plugins_pre_$tab" );
     84if ( $tab ) {
     85        do_action( "install_plugins_pre_$tab" );       
     86}
    4787
     88add_screen_option( 'misc_screen_options', array( 'option' => 'manageplugin-installplugin-cardcolumnshidden', 'id' => 'plugin-card' ) );
     89
     90$screen_options = array(
     91        'description' => 'Description',
     92        'rating' => 'Rating',
     93        'extra_details' => 'Extra Details'
     94);
     95foreach ( $screen_options as $id => $label ) {
     96        add_screen_option( $id, array( 'label' => __( $label ) ) );
     97}
     98
    4899get_current_screen()->add_help_tab( array(
    49100'id'            => 'overview',
    50101'title'         => __('Overview'),
     
    73124include(ABSPATH . 'wp-admin/admin-header.php');
    74125?>
    75126<div class="wrap">
    76 <h2><?php echo esc_html( $title ); ?></h2>
     127        <h2>
     128                <?php echo esc_html( $title ); ?>
     129                <?php
     130                /**
     131                 * Filter the tabs shown on the Plugin Install screen.
     132                 *
     133                 * @since 2.7.0
     134                 * @param array $tabs The tabs shown on the Plugin Install screen. Defaults are
     135                 *                    'upload' and 'browse-plugins'.
     136                 */
     137                $tabs = apply_filters( 'install_plugins_tabs', $tabs );
     138                foreach ( $tabs as $tab_slug => $tab_name ) {
     139                        $visibility = $tab_slug == 'upload' ? ' wp-upload-show' : ' wp-upload-hide';
     140                       
     141                        echo '<a href="#" class="' . esc_attr( $tab_slug ) . $visibility . ' add-new-h2">' . $tab_name . '</a>';
     142                }
     143                ?>
     144        </h2>
    77145
    78 <?php $wp_list_table->views(); ?>
     146        <?php install_plugins_upload(); ?>
    79147
    80 <br class="clear" />
    81 <?php
    82 /**
    83  * Fires after the plugins list table in each tab of the Install Plugins screen.
    84  *
    85  * The dynamic portion of the action hook, $tab, allows for targeting
    86  * individual tabs, for instance 'install_plugins_plugin-information'.
    87  *
    88  * @since 2.7.0
    89  *
    90  * @param int $paged The current page number of the plugins list table.
    91  */
    92 ?>
    93 <?php do_action( "install_plugins_$tab", $paged ); ?>
     148        <div class="wp-filter hide-on-upload">
     149                <div class="wp-filter-count">
     150                        <span class="count plugin-count"></span>
     151                </div>
     152               
     153                <ul class="wp-filter-links">
     154                <?php foreach( $sections as $section_sort => $section_text ) { ?>
     155                        <li>
     156                                <a href="#" class="wp-filter-link" data-sort="<?php echo $section_sort; ?>">
     157                                        <?php echo $section_text; ?>
     158                                </a>
     159                        </li>
     160                <?php } ?>
     161                </ul>
     162               
     163                <a class="wp-filter-drawer-toggle dashicons-before dashicons-heart" href="#" data-drawer="favorites">
     164                        <?php _e( 'Favorites' ); ?>
     165                </a>
     166                <a class="wp-filter-drawer-toggle dashicons-before dashicons-tag" href="#" data-drawer="tag">
     167                        <?php _e( 'Tag Filter' ); ?>
     168                </a>
     169               
     170                <div class="wp-filter-drawer" data-drawer="favorites">
     171               
     172                        TODO - Favorites
     173                       
     174                </div>
     175                <div class="wp-filter-drawer" data-drawer="tag">
     176               
     177                        TODO - Tag Filter
     178                       
     179                </div>
     180       
     181        </div>
     182       
     183        <div class="hide-on-upload">
     184                <div class="wp-filter-content plugin-browser"></div>
     185       
     186                <p class="wp-filter-notice"><?php _e( 'No plugins found. Try a different search.' ); ?></p>
     187                <span class="spinner"></span>
     188        </div>
     189        <br class="clear" />
     190        <?php
     191        /**
     192         * Fires after the plugins list table in each tab of the Install Plugins screen.
     193         *
     194         * The dynamic portion of the action hook, $tab, allows for targeting
     195         * individual tabs, for instance 'install_plugins_plugin-information'.
     196         *
     197         * @since 2.7.0
     198         *
     199         * @param int $paged The current page number of the plugins list table.
     200         */
     201        if ( $tab ) {
     202                do_action( "install_plugins_$tab", $paged );
     203        }
     204        ?>
    94205</div>
     206
     207<script id="tmpl-plugin" type="text/template">
     208        <div class="plugin-card">
     209                <?php
     210                $hidden = get_user_option( 'manageplugin-installplugin-cardcolumnshidden' );
     211                $columns = array();
     212               
     213                foreach ( $screen_options as $id => $field ) {
     214                        $columns[$id] = is_array( $hidden ) && in_array( $id, $hidden ) ? "column-{$id} column-hidden" : "column-{$id} column-visible";
     215                }
     216                ?>
     217                <div class="plugin-card-top">
     218                        <div class="name data-field">
     219                                <h4>
     220                                        <a href="{{{ data.detail_url }}}" class="thickbox">
     221                                                {{{ data.name }}}
     222                                        </a>
     223                                </h4>
     224                        <# if ( data.action_links ) { #>
     225                                <div class="action-links">
     226                                        <ul class="plugin-action-buttons">
     227                                        <# _.each( data.action_links, function ( action_link ) { #>
     228                                                <li>{{{ action_link }}}</li>
     229                                        <# }); #>
     230                                        </ul>
     231                                </div>
     232                        <# } #>
     233                        </div>
     234                        <div class="desc <?php echo $columns['description']; ?>">
     235                                <p>
     236                                        {{{ data.short_description }}}
     237                                <# if ( data.author ) { #>
     238                                        <span class="authors">
     239                                                <cite><?php printf( __( 'By %s' ), '{{{ data.author }}}' ); ?></cite>
     240                                        </span>
     241                                <# } #>
     242                                </p>
     243                        </div>
     244                </div>
     245                <footer class="plugin-card-bottom <?php echo $columns['extra_details']; ?>">
     246                        <div class="vers <?php echo $columns['rating']; ?>">
     247                                <div class="rating rating-{{ Math.round( data.rating / 10 ) * 10 }}">
     248                                        <span class="one"></span>
     249                                        <span class="two"></span>
     250                                        <span class="three"></span>
     251                                        <span class="four"></span>
     252                                        <span class="five"></span>
     253                                </div>
     254                                <span class="num-ratings">({{ data.num_ratings_formatted }})</span>
     255                        </div>
     256                        <div class="column-updated">
     257                                <strong><?php echo __( 'Last updated:' ); ?></strong> {{ data.last_updated }}
     258                        </div>
     259                        <div class="column-downloaded">
     260                                <?php printf( _n( '%s download', '%s downloads', '{{ data.downloaded }}' ), '{{ data.downloaded }}' ); ?>
     261                        </div>
     262                        <div class="column-compatibility">
     263                        <# if ( data.compatibility == 'untested' ) { #>
     264                                <?php echo __( '<strong>Untested</strong> with your install' ); ?>
     265                        <# } else if ( data.compatibility == 'incompatible' ) { #>
     266                                <?php echo __( '<strong>Incompatible</strong> with your install' ); ?>
     267                        <# } else { #>
     268                                <?php echo __( '<strong>Compatible</strong> with your install' ); ?>
     269                        <# } #>
     270                        </div>
     271                </footer>
     272        </div>
     273</script>
     274               
    95275<?php
    96276/**
    97277 * WordPress Administration Template Footer.
    98278 */
    99 include(ABSPATH . 'wp-admin/admin-footer.php');
     279include(ABSPATH . 'wp-admin/admin-footer.php');
     280 No newline at end of file
  • src/wp-admin/theme-install.php

     
    1212
    1313wp_reset_vars( array( 'tab' ) );
    1414
    15 if ( ! current_user_can('install_themes') )
     15if ( ! current_user_can('install_themes') ) {
    1616        wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );
     17}
    1718
    1819if ( is_multisite() && ! is_network_admin() ) {
    1920        wp_redirect( network_admin_url( 'theme-install.php' ) );
     
    3334);
    3435
    3536$sections = array(
    36         'featured' => __( 'Featured Themes' ),
    37         'popular'  => __( 'Popular Themes' ),
    38         'new'      => __( 'Newest Themes' ),
     37        'featured' => _x( 'Featured', 'themes' ),
     38        'popular'  => _x( 'Popular', 'themes' ),
     39        'new'      => _x( 'Latest', 'themes' ),
    3940);
    4041
    4142$installed_themes = search_theme_directories();
     
    125126                 */
    126127                $tabs = apply_filters( 'install_themes_tabs', $tabs );
    127128                foreach ( $tabs as $tab_slug => $tab_name ) {
    128                         echo '<a href="#" class="' . esc_attr( $tab_slug ) . ' add-new-h2">' . $tab_name . '</a>';
     129                        $visibility = $tab_slug == 'upload' ? ' wp-upload-show' : ' wp-upload-hide';
     130                       
     131                        echo '<a href="#" class="' . esc_attr( $tab_slug ) . $visibility . ' add-new-h2">' . $tab_name . '</a>';
    129132                }
    130133                ?>
    131134        </h2>
    132135
    133         <div class="upload-theme">
    134136        <?php install_themes_upload(); ?>
    135         </div>
    136 
    137         <div class="theme-navigation">
    138                 <span class="theme-count"></span>
    139                 <a class="theme-section" href="#" data-sort="featured"><?php _ex( 'Featured', 'themes' ); ?></a>
    140                 <a class="theme-section" href="#" data-sort="popular"><?php _ex( 'Popular', 'themes' ); ?></a>
    141                 <a class="theme-section" href="#" data-sort="new"><?php _ex( 'Latest', 'themes' ); ?></a>
    142                 <div class="theme-top-filters">
    143                         <!-- <span class="theme-filter" data-filter="photoblogging">Photography</span>
    144                         <span class="theme-filter" data-filter="responsive-layout">Responsive</span> -->
    145                         <a class="more-filters" href="#"><?php _e( 'Feature Filter' ); ?></a>
     137       
     138        <div class="wp-filter hide-on-upload">
     139                <div class="wp-filter-count">
     140                        <span class="count theme-count"></span>
    146141                </div>
    147                 <div class="more-filters-container">
    148                         <a class="apply-filters button button-secondary" href="#"><?php _e( 'Apply Filters' ); ?><span></span></a>
    149                         <a class="clear-filters button button-secondary" href="#"><?php _e( 'Clear' ); ?></a>
    150                         <br class="clear" />
     142               
     143                <ul class="wp-filter-links">
     144                <?php foreach( $sections as $section_sort => $section_text ) { ?>
     145                        <li>
     146                                <a href="#" class="wp-filter-link" data-sort="<?php echo $section_sort; ?>">
     147                                        <?php echo $section_text; ?>
     148                                </a>
     149                        </li>
     150                <?php } ?>
     151                </ul>
     152               
     153                <a class="wp-filter-drawer-toggle dashicons-before dashicons-admin-generic" href="#" data-drawer="feature">
     154                        <?php _e( 'Feature Filter' ); ?>
     155                </a>
     156               
     157                <div class="wp-filter-drawer" data-drawer="feature">
     158                        <div class="wp-filter-drawer-buttons">
     159                                <a class="wp-filter-drawer-apply button button-secondary" href="#"><?php _e( 'Apply Filters' ); ?><span></span></a>
     160                                <a class="wp-filter-drawer-clear button button-secondary" href="#"><?php _e( 'Clear' ); ?></a>
     161                        </div>
    151162                <?php
    152163                $feature_list = get_theme_feature_list();
    153164                foreach ( $feature_list as $feature_name => $features ) {
    154                         if ( $feature_name === 'Features' || $feature_name === __( 'Features' ) ) { // hack hack hack
    155                                 echo '<div class="filters-group wide-filters-group">';
    156                         } else {
    157                                 echo '<div class="filters-group">';
    158                         }
    159                         $feature_name = esc_html( $feature_name );
    160                         echo '<h4 class="feature-name">' . $feature_name . '</h4>';
    161                         echo '<ol class="feature-group">';
    162                         foreach ( $features as $feature => $feature_name ) {
    163                                 $feature = esc_attr( $feature );
    164                                 echo '<li><input type="checkbox" id="feature-id-' . $feature . '" value="' . $feature . '" /> ';
    165                                 echo '<label for="feature-id-' . $feature . '">' . $feature_name . '</label></li>';
    166                         }
    167                         echo '</ol>';
    168                         echo '</div>';
    169                 }
    170                 ?>
    171                         <div class="filtering-by">
     165                        if ( $feature_name === 'Features' || $feature_name === __( 'Features' ) ) { // hack hack hack ?>
     166                                <div class="wp-filter-group wp-filter-group-wide">
     167                        <?php } else { ?>
     168                                <div class="wp-filter-group">
     169                        <?php } ?>
     170                                <h4 class="wp-filter-group-title"><?php echo $feature_name; ?></h4>
     171                                <ol>
     172                                <?php foreach ( $features as $feature => $feature_name ) {
     173                                        $feature = esc_attr( $feature ); ?>
     174                                        <li>
     175                                                <input type="checkbox" id="filter-id-<?php echo $feature; ?>" value="<?php echo $feature; ?>" />
     176                                                <label for="filter-id-<?php echo $feature; ?>"><?php echo $feature_name; ?></label>
     177                                        </li>
     178                                <?php } ?>
     179                                </ol>
     180                        </div>
     181                <?php } ?>
     182                        <div class="wp-filter-by">
    172183                                <span><?php _e( 'Filtering by:' ); ?></span>
    173184                                <div class="tags"></div>
    174185                                <a href="#"><?php _e( 'Edit' ); ?></a>
    175186                        </div>
    176187                </div>
     188       
    177189        </div>
    178         <div class="theme-browser"></div>
    179         <div class="theme-install-overlay wp-full-overlay expanded"></div>
    180 
    181         <p class="no-themes"><?php _e( 'No themes found. Try a different search.' ); ?></p>
    182         <span class="spinner"></span>
    183 
     190       
     191        <div class="hide-on-upload">
     192                <div class="wp-filter-content theme-browser"></div>
     193                <div class="wp-full-overlay theme-install-overlay expanded"></div>
     194       
     195                <p class="wp-filter-notice"><?php _e( 'No themes found. Try a different search.' ); ?></p>
     196                <span class="spinner"></span>
     197        </div>
    184198        <br class="clear" />
    185 <?php
    186 /**
    187  * Fires at the top of each of the tabs on the Install Themes page.
    188  *
    189  * The dynamic portion of the hook name, $tab, refers to the current
    190  * theme install tab. Possible values are 'dashboard', 'search', 'upload',
    191  * 'featured', 'new', or 'updated'.
    192  *
    193  * @since 2.8.0
    194  *
    195  * @param int $paged Number of the current page of results being viewed.
    196  */
    197 if ( $tab ) {
    198         do_action( "install_themes_{$tab}", $paged );
    199 }
    200 ?>
     199        <?php
     200        /**
     201        * Fires at the top of each of the tabs on the Install Themes page.
     202        *
     203        * The dynamic portion of the hook name, $tab, refers to the current
     204        * theme install tab. Possible values are 'dashboard', 'search', 'upload',
     205        * 'featured', 'new', or 'updated'.
     206        *
     207        * @since 2.8.0
     208        *
     209        * @param int $paged Number of the current page of results being viewed.
     210        */
     211        if ( $tab ) {
     212                do_action( "install_themes_{$tab}", $paged );
     213        }
     214        ?>
    201215</div>
    202216
    203217<script id="tmpl-theme" type="text/template">
  • src/wp-admin/themes.php

     
    117117
    118118<div class="wrap">
    119119        <h2><?php esc_html_e( 'Themes' ); ?>
    120                 <span class="theme-count"><?php echo count( $themes ); ?></span>
     120                <span class="wp-title-count theme-count"><?php echo count( $themes ); ?></span>
    121121        <?php if ( ! is_multisite() && current_user_can( 'install_themes' ) ) : ?>
    122122                <a href="<?php echo admin_url( 'theme-install.php' ); ?>" class="hide-if-no-js add-new-h2"><?php echo esc_html( _x( 'Add New', 'Add new theme' ) ); ?></a>
    123123        <?php endif; ?>
  • src/wp-includes/script-loader.php

     
    488488                        'error' => __('Error while saving the changes.')
    489489                ) );
    490490
    491                 $scripts->add( 'plugin-install', "/wp-admin/js/plugin-install$suffix.js", array( 'jquery', 'thickbox' ), false, 1 );
    492                 did_action( 'init' ) && $scripts->localize( 'plugin-install', 'plugininstallL10n', array(
    493                         'plugin_information' => __('Plugin Information:'),
    494                         'ays' => __('Are you sure you want to install this plugin?')
    495                 ) );
     491                $scripts->add( 'plugin', "/wp-admin/js/plugin$suffix.js", array( 'wp-backbone' ), false, 1 );
    496492
    497493                $scripts->add( 'updates', "/wp-admin/js/updates$suffix.js", array( 'jquery' ) );
    498494