Version Description
- Add an Asterisk ("*") to match any Subdirectory at a given level of the File Hierarchy, as another form of the Prefix URL option
- Reorganize Settings page
Download this release
Release Info
Developer | dgewirtz |
Plugin | Multiple Themes |
Version | 4.9 |
Comparing to | |
See all releases |
Version 4.9
- includes/admin-other.php +26 -0
- includes/admin.php +984 -0
- includes/functions.php +414 -0
- includes/index.html +0 -0
- includes/old-wp.php +21 -0
- includes/select-theme.php +216 -0
- index.html +0 -0
- jonradio-multiple-themes.php +238 -0
- readme.txt +395 -0
- uninstall.php +20 -0
includes/admin-other.php
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Exit if .php file accessed directly
|
3 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
4 |
+
|
5 |
+
|
6 |
+
// Add Link to the plugin's entry on the Admin "Plugins" Page, for easy access
|
7 |
+
add_filter( 'plugin_action_links_' . jr_mt_plugin_basename(), 'jr_mt_plugin_action_links', 10, 1 );
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Creates Settings entry right on the Plugins Page entry.
|
11 |
+
*
|
12 |
+
* Helps the user understand where to go immediately upon Activation of the Plugin
|
13 |
+
* by creating entries on the Plugins page, right beside Deactivate and Edit.
|
14 |
+
*
|
15 |
+
* @param array $links Existing links for our Plugin, supplied by WordPress
|
16 |
+
* @param string $file Name of Plugin currently being processed
|
17 |
+
* @return string $links Updated set of links for our Plugin
|
18 |
+
*/
|
19 |
+
function jr_mt_plugin_action_links( $links ) {
|
20 |
+
// The "page=" query string value must be equal to the slug
|
21 |
+
// of the Settings admin page.
|
22 |
+
array_push( $links, '<a href="' . get_bloginfo('wpurl') . '/wp-admin/admin.php?page=jr_mt_settings' . '">Settings</a>' );
|
23 |
+
return $links;
|
24 |
+
}
|
25 |
+
|
26 |
+
?>
|
includes/admin.php
ADDED
@@ -0,0 +1,984 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Exit if .php file accessed directly
|
3 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
4 |
+
|
5 |
+
|
6 |
+
// Admin Page
|
7 |
+
|
8 |
+
require_once( jr_mt_path() . 'includes/admin-other.php' );
|
9 |
+
|
10 |
+
add_action( 'admin_menu', 'jr_mt_admin_hook' );
|
11 |
+
// Runs just before admin_init (below)
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Add Admin Menu item for plugin
|
15 |
+
*
|
16 |
+
* Plugin needs its own Page in the Settings section of the Admin menu.
|
17 |
+
*
|
18 |
+
*/
|
19 |
+
function jr_mt_admin_hook() {
|
20 |
+
// Add Settings Page for this Plugin
|
21 |
+
global $jr_mt_plugin_data;
|
22 |
+
add_theme_page( $jr_mt_plugin_data['Name'], 'Multiple Themes plugin', 'switch_themes', 'jr_mt_settings', 'jr_mt_settings_page' );
|
23 |
+
add_options_page( $jr_mt_plugin_data['Name'], 'Multiple Themes plugin', 'switch_themes', 'jr_mt_settings', 'jr_mt_settings_page' );
|
24 |
+
}
|
25 |
+
|
26 |
+
global $jr_mt_kwvalsep;
|
27 |
+
/* Everything is converted to lower-case, so upper-case letter makes a good keyword-value separator
|
28 |
+
*/
|
29 |
+
$jr_mt_kwvalsep = 'A';
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Settings page for plugin
|
33 |
+
*
|
34 |
+
* Display and Process Settings page for this plugin.
|
35 |
+
*
|
36 |
+
*/
|
37 |
+
function jr_mt_settings_page() {
|
38 |
+
global $jr_mt_plugin_data;
|
39 |
+
$jr_mt_plugin_data = array_merge( $jr_mt_plugin_data, jr_readme() );
|
40 |
+
global $jr_mt_themes_cache;
|
41 |
+
$jr_mt_themes_cache = wp_get_themes();
|
42 |
+
global $jr_mt_plugins_cache;
|
43 |
+
$jr_mt_plugins_cache = get_plugins();
|
44 |
+
add_thickbox();
|
45 |
+
echo '<div class="wrap">';
|
46 |
+
screen_icon( 'plugins' );
|
47 |
+
echo '<h2>' . $jr_mt_plugin_data['Name'] . '</h2>';
|
48 |
+
|
49 |
+
// Required because it is only called automatically for Admin Pages in the Settings section
|
50 |
+
settings_errors( 'jr_mt_settings' );
|
51 |
+
|
52 |
+
$theme = wp_get_theme()->Name;
|
53 |
+
global $jr_mt_options_cache;
|
54 |
+
|
55 |
+
$current_wp_version = get_bloginfo( 'version' );
|
56 |
+
|
57 |
+
if ( $jr_mt_plugin_data['read readme'] && version_compare( $current_wp_version, $jr_mt_plugin_data['Tested up to'], '>' ) ) {
|
58 |
+
/* WordPress version is too new:
|
59 |
+
When currently-installed version of Plugin was installed,
|
60 |
+
it did not support currently-installed version of WordPress.
|
61 |
+
So, check if a newer version of plugin is available. */
|
62 |
+
$current = FALSE;
|
63 |
+
// Check if latest version of the plugin supports this version of WordPress
|
64 |
+
if ( !function_exists( 'plugins_api' ) ) {
|
65 |
+
require_once( ABSPATH . 'wp-admin/includes/plugin-install.php' );
|
66 |
+
}
|
67 |
+
$directory = plugins_api( 'plugin_information', array( 'slug' => $jr_mt_plugin_data['slug'],
|
68 |
+
'fields' => array( 'download_link' => TRUE,
|
69 |
+
'tested' => TRUE,
|
70 |
+
'version' => TRUE,
|
71 |
+
'error_data' => TRUE,
|
72 |
+
'tags' => FALSE,
|
73 |
+
'compatibility' => FALSE,
|
74 |
+
'sections' => FALSE
|
75 |
+
)
|
76 |
+
) );
|
77 |
+
if ( property_exists( $directory, 'errors' ) && ( $directory->error_data->plugins_api_failed == 'N;' ) ) {
|
78 |
+
// Plugin not found in WordPress Directory
|
79 |
+
echo '<h3>Warnings</h3><p>Here is the problem:<ul><li> » This Plugin (' . $jr_mt_plugin_data['Name']
|
80 |
+
. ') has not been tested with the version of WordPress you are currently running: ' . $current_wp_version
|
81 |
+
. '.</li><li> » This Plugin could not be found in the WordPress Plugin Directory. '
|
82 |
+
. 'If you are sure it should be there, the WordPress Plugin Directory may be currently unavailable or inaccessible from your web server.</li></ul></p>'
|
83 |
+
. '<p>The plugin will probably still work with your newer version of WordPress, but you need to be aware of the issue.</p>';
|
84 |
+
} else {
|
85 |
+
if ( version_compare( $current_wp_version, $directory->tested, '>' ) ) {
|
86 |
+
// Latest version of readme.txt for latest version of Plugin indicates that Plugin has not yet been tested for this version of WordPress
|
87 |
+
echo '<h3>Warning</h3><p>Here is the problem:<ul><li> » This Plugin (' . $jr_mt_plugin_data['Name']
|
88 |
+
. ') has not been tested with the version of WordPress you are currently running: ' . $current_wp_version
|
89 |
+
. '.</li></ul></p>'
|
90 |
+
. '<p>The plugin will probably still work with your newer version of WordPress, but you need to be aware of the issue.</p>';
|
91 |
+
} else {
|
92 |
+
if ( version_compare( $jr_mt_plugin_data['Version'], $directory->version, '=' ) ) {
|
93 |
+
/* The latest version of the Plugin has been installed,
|
94 |
+
but the readme.txt has been updated in the WordPress Plugin Directory
|
95 |
+
to indicate that it now supports the installed version of WordPress.
|
96 |
+
|
97 |
+
Latest version of Plugin has already been installed, but readme.txt is out of date,
|
98 |
+
so update readme.txt. ...if you can
|
99 |
+
*/
|
100 |
+
|
101 |
+
$errmsg_before = '<h3>Warning</h3><p>Here is the problem:<ul><li> » This version (' . $jr_mt_plugin_data['Version']
|
102 |
+
. ') of this Plugin (' . $jr_mt_plugin_data['Name']
|
103 |
+
. ') has been tested with the version of WordPress you are currently running (' . $current_wp_version
|
104 |
+
. '), but</li><li> » The currently installed readme.txt file for this plugin is out of date,'
|
105 |
+
. '</li><li> » The attempt to update the readme.txt from the WordPress Plugin Repository failed, and'
|
106 |
+
. '</li><li> » The specific error is: ';
|
107 |
+
$errmsg_after = '</li></ul></p>'
|
108 |
+
. '<p>Another attempt will be made to update readme.txt each time this Settings page is displayed.'
|
109 |
+
. ' Nonetheless, this plugin should work properly even if readme.txt is out of date.</p>';
|
110 |
+
|
111 |
+
if ( is_wp_error( $file_name = download_url( $directory->download_link ) ) ) {
|
112 |
+
// Error
|
113 |
+
echo $errmsg_before . 'The plugin failed to completely download from the WordPress Repository with 300 seconds' . $errmsg_after;
|
114 |
+
} else {
|
115 |
+
if ( function_exists( 'zip_open' ) ) {
|
116 |
+
if ( is_int( $resource_handle = zip_open( $file_name ) ) ) {
|
117 |
+
// Error
|
118 |
+
echo $errmsg_before
|
119 |
+
. "php function zip_open error number $resource_handle while attempting to open the plugin's"
|
120 |
+
. 'compressed .zip file successfully downloaded from the WordPress Plugin Repository'
|
121 |
+
. $errmsg_after;
|
122 |
+
} else {
|
123 |
+
$find_readme = TRUE;
|
124 |
+
while ( $find_readme && ( FALSE !== $dir_ent = zip_read( $resource_handle ) ) ) {
|
125 |
+
if ( is_int( $dir_ent ) ) {
|
126 |
+
// Error code
|
127 |
+
echo $errmsg_before
|
128 |
+
. "php function zip_read error number $dir_ent while attempting to read the plugin's"
|
129 |
+
. ' compressed .zip file successfully downloaded from the WordPress Plugin Repository'
|
130 |
+
. $errmsg_after;
|
131 |
+
// Get out of While loop
|
132 |
+
$find_readme = FALSE;
|
133 |
+
} else {
|
134 |
+
// Wait until the While loop gets to the readme.txt entry in the Plugin's Zip file
|
135 |
+
if ( zip_entry_name( $dir_ent ) == $jr_mt_plugin_data['slug'] . '/readme.txt' ) {
|
136 |
+
if ( FALSE === zip_entry_open( $resource_handle, $dir_ent, 'rb' ) ) {
|
137 |
+
// Error
|
138 |
+
echo $errmsg_before
|
139 |
+
. 'php function zip_entry_open failed to open readme.txt file compressed within plugin .zip file in WordPress Repository'
|
140 |
+
. $errmsg_after;
|
141 |
+
} else {
|
142 |
+
$filesize = zip_entry_filesize( $dir_ent );
|
143 |
+
if ( !is_int( $filesize ) || ( $filesize < 100 ) ) {
|
144 |
+
// Error
|
145 |
+
echo $errmsg_before
|
146 |
+
. 'Size, in bytes, of readme.txt file is being incorrectly reported by php function zip_entry_filesize as '
|
147 |
+
. var_export( $filesize, TRUE )
|
148 |
+
. $errmsg_after;
|
149 |
+
} else {
|
150 |
+
$readme_content = zip_entry_read( $dir_ent, $filesize );
|
151 |
+
if ( ( $readme_content === FALSE ) || ( $readme_content === '' ) ) {
|
152 |
+
// Error
|
153 |
+
echo $errmsg_before
|
154 |
+
. 'php function zip_entry_read failed to read readme.txt file compressed within plugin .zip file in WordPress Repository'
|
155 |
+
. $errmsg_after;
|
156 |
+
} else {
|
157 |
+
if ( FALSE === zip_entry_close( $dir_ent ) ) {
|
158 |
+
// Error
|
159 |
+
echo $errmsg_before
|
160 |
+
. 'php function zip_entry_close failed to close readme.txt file compressed within plugin .zip file in WordPress Repository'
|
161 |
+
. $errmsg_after;
|
162 |
+
} else {
|
163 |
+
// Alternate: file_put_contents( jr_mt_path() . 'readme.txt', $readme_content );
|
164 |
+
$write_return = jr_filesystem_text_write( $readme_content, 'readme.txt', jr_mt_path() );
|
165 |
+
if ( is_wp_error( $write_return ) || ( FALSE === $write_return ) ) {
|
166 |
+
// Error
|
167 |
+
echo $errmsg_before
|
168 |
+
. 'WP_filesystem failed to store readme.txt file as part of download/update process from WordPress Repository'
|
169 |
+
. $errmsg_after;
|
170 |
+
}
|
171 |
+
}
|
172 |
+
}
|
173 |
+
}
|
174 |
+
}
|
175 |
+
// Get out of While loop because we have found and processed readme.txt
|
176 |
+
$find_readme = FALSE;
|
177 |
+
}
|
178 |
+
}
|
179 |
+
}
|
180 |
+
zip_close( $resource_handle );
|
181 |
+
}
|
182 |
+
} else {
|
183 |
+
echo $errmsg_before
|
184 |
+
. "php zip_open function is not defined, so readme.txt could not be updated from WordPress Plugin Repository"
|
185 |
+
. $errmsg_after;
|
186 |
+
}
|
187 |
+
// Delete temporary download file
|
188 |
+
if ( !unlink( $file_name ) ) {
|
189 |
+
echo $errmsg_before
|
190 |
+
. "php unlink function failed to delete downloaded readme.txt in temporary download file $file_name"
|
191 |
+
. $errmsg_after;
|
192 |
+
}
|
193 |
+
}
|
194 |
+
$current = TRUE;
|
195 |
+
} else {
|
196 |
+
// Recommend updating Plugin to latest version which supports the version of WordPress being run,
|
197 |
+
// but the currently-installed version of the Plugin does not.
|
198 |
+
echo '<h3>Warning</h3><p>This plugin is out of date and should be updated for performance and reliability reasons.'
|
199 |
+
. ' Plugin updates are shown on the Plugins-Installed Plugins page and the Dashboard-Updates page here in the Admin panels.</p>';
|
200 |
+
}
|
201 |
+
}
|
202 |
+
}
|
203 |
+
} else {
|
204 |
+
// Currently-installed version of Plugin supports currently-installed version of WordPress
|
205 |
+
$current = TRUE;
|
206 |
+
}
|
207 |
+
|
208 |
+
global $jr_mt_plugins_cache;
|
209 |
+
|
210 |
+
$compatible = TRUE;
|
211 |
+
|
212 |
+
// Check for incompatible plugins that have been activated: BuddyPress and Theme Test Drive
|
213 |
+
global $jr_mt_incompat_plugins;
|
214 |
+
foreach ( $jr_mt_plugins_cache as $rel_path => $plugin_data ) {
|
215 |
+
if ( in_array( $plugin_data['Name'], $jr_mt_incompat_plugins ) && is_plugin_active( $rel_path ) ) {
|
216 |
+
if ( $compatible ) {
|
217 |
+
echo '<h3>Plugin Conflict Error Detected</h3>';
|
218 |
+
$compatible = FALSE;
|
219 |
+
}
|
220 |
+
echo '<p>This Plugin (' . $jr_mt_plugin_data['Name'] . ') cannot be used when the <b>' . $plugin_data['Name']
|
221 |
+
. '</b> plugin is Activated. If you wish to use the ' . $jr_mt_plugin_data['Name']
|
222 |
+
. ' plugin, please deactivate the ' . $plugin_data['Name']
|
223 |
+
. ' plugin (not just when using this Settings page, but whenever the '
|
224 |
+
. $jr_mt_plugin_data['Name'] . ' plugin is activated).</p>';
|
225 |
+
}
|
226 |
+
}
|
227 |
+
|
228 |
+
if ( $compatible ) {
|
229 |
+
?>
|
230 |
+
<h3>Overview</h3>
|
231 |
+
<p>This Plugin allows you to selectively change the Theme you have selected as your <b>Current Theme</b> in <b>Appearance-Themes</b> on the Admin panels.
|
232 |
+
You can choose from any of the <b>Available Themes</b> listed on the Appearance-Themes Admin panel for:
|
233 |
+
<ul>
|
234 |
+
<li> » All Pages</li>
|
235 |
+
<li> » All Posts</li>
|
236 |
+
<li> » Everything (see Advanced Settings below)</li>
|
237 |
+
<li> » The Site Home</li>
|
238 |
+
<li> » A Specific Page</li>
|
239 |
+
<li> » A Specific Post</li>
|
240 |
+
<li> » Any other non-Admin page that has its own Permalink; for example, a specific Archive or Category page</li>
|
241 |
+
<li> » A Specific Query Keyword, or Keyword/Value pair, in any URL (<code>?keyword=value</code> or <code>&keyword=value</code>)</li>
|
242 |
+
</ul>
|
243 |
+
</p>
|
244 |
+
<h3>Important Notes</h3>
|
245 |
+
<?php
|
246 |
+
if ( function_exists('is_multisite') && is_multisite() ) {
|
247 |
+
echo "In a WordPress Network (AKA Multisite), Themes must be <b>Network Enabled</b> before they will appear as Available Themes on individual sites' Appearance-Themes panel.";
|
248 |
+
}
|
249 |
+
echo '<p>';
|
250 |
+
echo "The Current Theme, defined to WordPress in Appearance-Themes admin panel, is <b>$theme</b>.";
|
251 |
+
$settings = get_option( 'jr_mt_settings' );
|
252 |
+
if ( trim( $settings['current'] ) ) {
|
253 |
+
echo " But it is being overridden in Advanced Settings (see below), which set the plugin's default Theme to <b>";
|
254 |
+
echo wp_get_theme( $settings['current'] )->Name;
|
255 |
+
echo '</b>. You will not normally need to specify this default Theme in any of the other Settings on this page, though you will need to specify the WordPress Current Theme wherever you want it appear. Or, if you specify a different Theme for All Pages, All Posts or Everything, and wish to use the default Theme for one or more specific Pages, Posts or other non-Admin pages.';
|
256 |
+
} else {
|
257 |
+
echo ' You will not normally need to specify it in any of the Settings on this page. The only exception would be if you specify a different Theme for All Pages, All Posts or Everything, and wish to use the Current Theme for one or more specific Pages, Posts or other non-Admin pages.';
|
258 |
+
}
|
259 |
+
echo '</p>';
|
260 |
+
if ( $jr_mt_plugin_data['read readme'] ) {
|
261 |
+
if ( $current ) {
|
262 |
+
echo '<p>This Plugin (' . $jr_mt_plugin_data['Name'] . ') has been tested with the version of WordPress you are currently running: '
|
263 |
+
. $current_wp_version . '</p>';
|
264 |
+
}
|
265 |
+
} else {
|
266 |
+
echo '<p>Compatibility checks could not be done because the plugin was unable to read its readme.txt file, likely a user/permissions hosting issue.</p>';
|
267 |
+
}
|
268 |
+
if ( jr_mt_plugin_update_available() ) {
|
269 |
+
echo '<p>A new version of this Plugin (' . $jr_mt_plugin_data['Name'] . ') is available from the WordPress Repository.'
|
270 |
+
. ' We strongly recommend updating ASAP because new versions fix problems that users like yourself have reported to us.'
|
271 |
+
. ' <a class="thickbox" title="' . $jr_mt_plugin_data['Name'] . '" href="' . network_admin_url()
|
272 |
+
. 'plugin-install.php?tab=plugin-information&plugin=' . $jr_mt_plugin_data['slug']
|
273 |
+
. '§ion=changelog&TB_iframe=true&width=640&height=768">Click here</a> for more details.</p>';
|
274 |
+
}
|
275 |
+
echo '<hr /><form action="options.php" method="POST">';
|
276 |
+
|
277 |
+
// Plugin Settings are displayed and entered here:
|
278 |
+
settings_fields( 'jr_mt_settings' );
|
279 |
+
do_settings_sections( 'jr_mt_settings_page' );
|
280 |
+
echo '<p><input name="save" type="submit" value="Save Changes" class="button-primary" /></p></form>';
|
281 |
+
}
|
282 |
+
|
283 |
+
echo '<hr /><h3>System Information</h3><p>You are currently running:<ul>';
|
284 |
+
echo "<li> » The {$jr_mt_plugin_data['Name']} plugin Version {$jr_mt_plugin_data['Version']}</li>";
|
285 |
+
echo "<li> »» The Path to the plugin's directory is " . rtrim( jr_mt_path(), '/' ) . '</li>';
|
286 |
+
echo "<li> »» The URL to the plugin's directory is " . plugins_url() . "/{$jr_mt_plugin_data['slug']}</li>";
|
287 |
+
echo "<li> » WordPress Version $current_wp_version</li>";
|
288 |
+
echo '<li> »» WordPress language is set to ' , get_bloginfo( 'language' ) . '</li>';
|
289 |
+
echo '<li> » ' . php_uname( 's' ) . ' operating system, Release/Version ' . php_uname( 'r' ) . ' / ' . php_uname( 'v' ) . '</li>';
|
290 |
+
echo '<li> » ' . php_uname( 'm' ) . ' computer hardware</li>';
|
291 |
+
echo '<li> » Host name ' . php_uname( 'n' ) . '</li>';
|
292 |
+
echo '<li> » php Version ' . phpversion() . '</li>';
|
293 |
+
echo '<li> »» php memory_limit ' . ini_get('memory_limit') . '</li>';
|
294 |
+
echo '<li> » Zend engine Version ' . zend_version() . '</li>';
|
295 |
+
echo '<li> » Web Server software is ' . getenv( 'SERVER_SOFTWARE' ) . '</li>';
|
296 |
+
if ( function_exists( 'apache_get_version' ) && ( FALSE !== $apache = apache_get_version() ) ) {
|
297 |
+
echo "<li> »» Apache Version $apache</li>";
|
298 |
+
}
|
299 |
+
global $wpdb;
|
300 |
+
echo '<li> » MySQL Version ' . $wpdb->get_var( 'SELECT VERSION();', 0, 0 ) . '</li>';
|
301 |
+
|
302 |
+
echo '</ul></p>';
|
303 |
+
}
|
304 |
+
|
305 |
+
add_action( 'admin_init', 'jr_mt_admin_init' );
|
306 |
+
|
307 |
+
/**
|
308 |
+
* Register and define the settings
|
309 |
+
*
|
310 |
+
* Everything to be stored and/or can be set by the user
|
311 |
+
*
|
312 |
+
*/
|
313 |
+
function jr_mt_admin_init() {
|
314 |
+
register_setting( 'jr_mt_settings', 'jr_mt_settings', 'jr_mt_validate_settings' );
|
315 |
+
$settings = get_option( 'jr_mt_settings' );
|
316 |
+
if ( !empty( $settings['ids']) || !empty( $settings['query'] ) ) {
|
317 |
+
add_settings_section( 'jr_mt_delete_settings_section',
|
318 |
+
'Current Theme Selection Entries',
|
319 |
+
'jr_mt_delete_settings_expl',
|
320 |
+
'jr_mt_settings_page'
|
321 |
+
);
|
322 |
+
if ( !empty( $settings['ids'] ) ) {
|
323 |
+
add_settings_field( 'del_entry', 'Page/Post/Prefix Entries:', 'jr_mt_echo_delete_entry', 'jr_mt_settings_page', 'jr_mt_delete_settings_section' );
|
324 |
+
}
|
325 |
+
if ( !empty( $settings['query'] ) ) {
|
326 |
+
add_settings_field( 'del_query_entry', 'Query Keyword Entries:', 'jr_mt_echo_delete_query_entry', 'jr_mt_settings_page', 'jr_mt_delete_settings_section' );
|
327 |
+
}
|
328 |
+
}
|
329 |
+
add_settings_section( 'jr_mt_all_settings_section',
|
330 |
+
'<input name="save" type="submit" value="Save Changes" class="button-primary" /></h3><h3>For All Pages, All Posts and/or Site Home',
|
331 |
+
'jr_mt_all_settings_expl',
|
332 |
+
'jr_mt_settings_page'
|
333 |
+
);
|
334 |
+
$suffix = array(
|
335 |
+
'Pages' => '<br />(Pages created with Add Page)',
|
336 |
+
'Posts' => ''
|
337 |
+
);
|
338 |
+
foreach ( array( 'Pages', 'Posts' ) as $thing ) {
|
339 |
+
add_settings_field( 'all_' . strtolower( $thing ), "Select Theme for All $thing" . $suffix[$thing], 'jr_mt_echo_all_things', 'jr_mt_settings_page', 'jr_mt_all_settings_section',
|
340 |
+
array( 'thing' => $thing ) );
|
341 |
+
}
|
342 |
+
add_settings_field( 'site_home',
|
343 |
+
'Select Theme for Site Home<br />(' . get_home_url() . ')',
|
344 |
+
'jr_mt_echo_site_home',
|
345 |
+
'jr_mt_settings_page',
|
346 |
+
'jr_mt_all_settings_section'
|
347 |
+
);
|
348 |
+
add_settings_section( 'jr_mt_single_settings_section',
|
349 |
+
'For An Individual Page, Post or other non-Admin page;<br />or a group of pages, specified by URL Prefix, optionally with Asterisk(s)',
|
350 |
+
'jr_mt_single_settings_expl',
|
351 |
+
'jr_mt_settings_page'
|
352 |
+
);
|
353 |
+
add_settings_field( 'add_is_prefix', 'Select here if URL is a Prefix', 'jr_mt_echo_add_is_prefix', 'jr_mt_settings_page', 'jr_mt_single_settings_section' );
|
354 |
+
add_settings_field( 'add_theme', 'Theme', 'jr_mt_echo_add_theme', 'jr_mt_settings_page', 'jr_mt_single_settings_section' );
|
355 |
+
add_settings_field( 'add_path_id', 'URL of Page, Post, Prefix or other', 'jr_mt_echo_add_path_id', 'jr_mt_settings_page', 'jr_mt_single_settings_section' );
|
356 |
+
add_settings_section( 'jr_mt_querykw_section',
|
357 |
+
'For A Query Keyword on any Page, Post or other non-Admin page',
|
358 |
+
'jr_mt_querykw_expl',
|
359 |
+
'jr_mt_settings_page'
|
360 |
+
);
|
361 |
+
add_settings_field( 'add_querykw_theme', 'Theme', 'jr_mt_echo_add_querykw_theme', 'jr_mt_settings_page', 'jr_mt_querykw_section' );
|
362 |
+
add_settings_field( 'add_querykw_keyword', 'Query Keyword', 'jr_mt_echo_add_querykw_keyword', 'jr_mt_settings_page', 'jr_mt_querykw_section' );
|
363 |
+
add_settings_section( 'jr_mt_query_section',
|
364 |
+
'For A Query Keyword=Value on any Page, Post or other non-Admin page',
|
365 |
+
'jr_mt_query_expl',
|
366 |
+
'jr_mt_settings_page'
|
367 |
+
);
|
368 |
+
add_settings_field( 'add_query_theme', 'Theme', 'jr_mt_echo_add_query_theme', 'jr_mt_settings_page', 'jr_mt_query_section' );
|
369 |
+
add_settings_field( 'add_query_keyword', 'Query Keyword', 'jr_mt_echo_add_query_keyword', 'jr_mt_settings_page', 'jr_mt_query_section' );
|
370 |
+
add_settings_field( 'add_query_value', 'Query Value', 'jr_mt_echo_add_query_value', 'jr_mt_settings_page', 'jr_mt_query_section' );
|
371 |
+
add_settings_section( 'jr_mt_advanced_settings_section',
|
372 |
+
'Advanced Setting',
|
373 |
+
'jr_mt_advanced_settings_expl',
|
374 |
+
'jr_mt_settings_page'
|
375 |
+
);
|
376 |
+
add_settings_field( 'current',
|
377 |
+
'Select Theme for Everything, to Override WordPress Current Theme (<b>' . wp_get_theme()->Name . '</b>)',
|
378 |
+
'jr_mt_echo_current',
|
379 |
+
'jr_mt_settings_page',
|
380 |
+
'jr_mt_advanced_settings_section'
|
381 |
+
);
|
382 |
+
}
|
383 |
+
|
384 |
+
/**
|
385 |
+
* Section text for Section2
|
386 |
+
*
|
387 |
+
* Display an explanation of this Section
|
388 |
+
*
|
389 |
+
*/
|
390 |
+
function jr_mt_delete_settings_expl() {
|
391 |
+
?>
|
392 |
+
<p>
|
393 |
+
In this section, all entries are displayed for Themes selected for individual Pages, Posts
|
394 |
+
and any other non-Admin pages that have their own Permalink; for example, specific Archive or Category pages.
|
395 |
+
Or groups of Pages, Posts or any other non-Admin pages that share the same <b>URL Prefix</b>
|
396 |
+
or <b>Query Keyword</b> (<code>?keyword=value</code> or <code>&keyword=value</code>).
|
397 |
+
</p>
|
398 |
+
<p>
|
399 |
+
You can delete any of these entries by filling in the check box beside each one
|
400 |
+
and clicking the <b>Save Changes</b> button.
|
401 |
+
To change the Theme for an entry, add the same entry with a different Theme in one of the sections below this one.</p>
|
402 |
+
|
403 |
+
<?php
|
404 |
+
}
|
405 |
+
|
406 |
+
function jr_mt_echo_delete_entry() {
|
407 |
+
$settings = get_option( 'jr_mt_settings' );
|
408 |
+
$first = TRUE;
|
409 |
+
foreach ( $settings['ids'] as $path_id => $opt_array ) {
|
410 |
+
if ( $first ) {
|
411 |
+
$first = FALSE;
|
412 |
+
} else {
|
413 |
+
echo '<br />';
|
414 |
+
}
|
415 |
+
echo "Delete <input type='checkbox' id='del_entry' name='jr_mt_settings[del_entry][]' value='$path_id' /> Theme="
|
416 |
+
. wp_get_theme( $opt_array['theme'] )->Name . '; ';
|
417 |
+
if ( $path_id == '' ) {
|
418 |
+
echo 'Site=<a href="' . get_home_url() . '" target="_blank">Home</a>';
|
419 |
+
} else {
|
420 |
+
switch ( $opt_array['type'] ) {
|
421 |
+
case '*':
|
422 |
+
echo 'Prefix*=<a href="' . get_home_url() . "/$path_id" . '" target="_blank">' . "$path_id</a>";
|
423 |
+
break;
|
424 |
+
case 'prefix':
|
425 |
+
echo 'Prefix=<a href="' . get_home_url() . "/$path_id" . '" target="_blank">' . "$path_id</a>";
|
426 |
+
break;
|
427 |
+
case 'cat':
|
428 |
+
echo 'Category=<a href="' . get_home_url() . '/?cat=' . $opt_array['id'] . '" target="_blank">' . get_cat_name( $opt_array['id'] ) . '</a>';
|
429 |
+
break;
|
430 |
+
case 'archive':
|
431 |
+
echo 'Archive=<a href="' . get_home_url() . '/?m=' . $opt_array['id'] . '" target="_blank">' . $opt_array['id'] . '</a>';
|
432 |
+
break;
|
433 |
+
default:
|
434 |
+
$p_array = get_posts( array( 'post_type' => 'any', 'include' => array( $path_id ) ) );
|
435 |
+
if ( empty( $p_array ) ) {
|
436 |
+
if ( $opt_array['type'] == 'admin' ) {
|
437 |
+
echo 'Admin=<a href="' . get_home_url() . '/' . $opt_array['rel_url'] . '" target="_blank">' . "$path_id</a>";
|
438 |
+
} else {
|
439 |
+
echo 'Path=<a href="' . get_home_url() . "/$path_id" . '" target="_blank">' . "$path_id</a>";
|
440 |
+
}
|
441 |
+
} else {
|
442 |
+
echo ucfirst( $p_array[0]->post_type ) . '=<a href="' . get_permalink( $path_id ) . '" target="_blank">' . $p_array[0]->post_title . '</a>';
|
443 |
+
}
|
444 |
+
}
|
445 |
+
}
|
446 |
+
}
|
447 |
+
}
|
448 |
+
|
449 |
+
function jr_mt_echo_delete_query_entry() {
|
450 |
+
global $jr_mt_kwvalsep;
|
451 |
+
$settings = get_option( 'jr_mt_settings' );
|
452 |
+
$three_dots = '…';
|
453 |
+
$first = TRUE;
|
454 |
+
foreach ( $settings['query'] as $keyword => $value_array ) {
|
455 |
+
foreach ( $value_array as $value => $theme ) {
|
456 |
+
if ( $first ) {
|
457 |
+
$first = FALSE;
|
458 |
+
} else {
|
459 |
+
echo '<br />';
|
460 |
+
}
|
461 |
+
echo "Delete <input type='checkbox' id='del_query_entry' name='jr_mt_settings[del_query_entry][]' value='$keyword$jr_mt_kwvalsep$value' /> Theme="
|
462 |
+
. wp_get_theme( $theme )->Name . '; '
|
463 |
+
. 'Query='
|
464 |
+
. '<code>'
|
465 |
+
. trim( get_home_url(), '\ /' )
|
466 |
+
. "/</code>$three_dots<code>/?"
|
467 |
+
. "<b><input type='text' readonly='readonly' disable='disabled' name='jr_mt_delkw' value='$keyword' size='"
|
468 |
+
. jr_mt_strlen( $keyword )
|
469 |
+
. "' /></b>"
|
470 |
+
. '=';
|
471 |
+
if ( '*' === $value ) {
|
472 |
+
echo '</code>' . $three_dots;
|
473 |
+
} else {
|
474 |
+
echo "<b><input type='text' readonly='readonly' disable='disabled' name='jr_mt_delkwval' value='$value' size='"
|
475 |
+
. jr_mt_strlen( $value )
|
476 |
+
. "' /></b></code>";
|
477 |
+
}
|
478 |
+
}
|
479 |
+
}
|
480 |
+
}
|
481 |
+
|
482 |
+
/**
|
483 |
+
* Section text for Section1
|
484 |
+
*
|
485 |
+
* Display an explanation of this Section
|
486 |
+
*
|
487 |
+
*/
|
488 |
+
function jr_mt_all_settings_expl() {
|
489 |
+
?>
|
490 |
+
<p>
|
491 |
+
In this section, you can select a different Theme for All Pages, All Posts and/or Site Home.
|
492 |
+
To remove a previously selected Theme, select the blank entry from the drop-down list.
|
493 |
+
</p>
|
494 |
+
<p>
|
495 |
+
In the <i>next</i> section, you will be able to select a Theme, including the Current Theme, to override any choice you make here, for individual Pages, Posts or
|
496 |
+
any other non-Admin pages that have their own Permalink; for example, specific Archive or Category pages.
|
497 |
+
Or groups of Pages, Posts or any other non-Admin pages that share the same URL Prefix.
|
498 |
+
</p>
|
499 |
+
<p>
|
500 |
+
There is also a Query Keyword section
|
501 |
+
farther down this Settings page
|
502 |
+
that allows
|
503 |
+
you to select a Theme to use whenever a specified
|
504 |
+
Query Keyword (<code>?keyword=value</code> or <code>&keyword=value</code>)
|
505 |
+
appears in the URL of any Page, Post or other non-Admin page.
|
506 |
+
</p>
|
507 |
+
<?php
|
508 |
+
}
|
509 |
+
|
510 |
+
function jr_mt_echo_all_things( $thing ) {
|
511 |
+
$settings = get_option( 'jr_mt_settings' );
|
512 |
+
$field = 'all_' . strtolower( $thing['thing'] );
|
513 |
+
jr_mt_themes_field( $field, $settings[$field], 'jr_mt_settings', TRUE );
|
514 |
+
}
|
515 |
+
|
516 |
+
function jr_mt_echo_site_home() {
|
517 |
+
$settings = get_option( 'jr_mt_settings' );
|
518 |
+
jr_mt_themes_field( 'site_home', $settings['site_home'], 'jr_mt_settings', FALSE );
|
519 |
+
}
|
520 |
+
|
521 |
+
/**
|
522 |
+
* Section text for Section3
|
523 |
+
*
|
524 |
+
* Display an explanation of this Section
|
525 |
+
*
|
526 |
+
*/
|
527 |
+
function jr_mt_single_settings_expl() {
|
528 |
+
?>
|
529 |
+
<p>
|
530 |
+
Select a Theme for an individual Page, Post or
|
531 |
+
any other non-Admin page that has its own Permalink; for example, a specific Archive or Category page.
|
532 |
+
Or for a group of pages which have URLs that all begin with the same characters ("Prefix"),
|
533 |
+
optionally specifying an Asterisk ("*") to match all subdirectories at specific levels.
|
534 |
+
</p>
|
535 |
+
<p>
|
536 |
+
Then cut and paste the URL of the desired Page, Post, Prefix or other non-Admin page.
|
537 |
+
And click the <b>Save Changes</b> button to add the entry.
|
538 |
+
</p>
|
539 |
+
There are three types of Entries that you can specify here:
|
540 |
+
<ol>
|
541 |
+
<li>
|
542 |
+
<b>URL</b> - if Visitor URL matches this URL, use this Theme
|
543 |
+
</li>
|
544 |
+
<li>
|
545 |
+
<b>URL Prefix</b> - any Visitor URL that begins with this URL Prefix will use this Theme
|
546 |
+
</li>
|
547 |
+
<li>
|
548 |
+
<b>URL Prefix with Asterisk(s)</b> - URL Prefix that matches any subdirectory where Asterisk ("*") is specified
|
549 |
+
</li>
|
550 |
+
</ol>
|
551 |
+
For the third type, an Asterisk can only be specified to match the entire subdirectory name, not parts of the name:
|
552 |
+
<blockquote>
|
553 |
+
For example, using a Permalink structure that uses dates,
|
554 |
+
where a typical Post might be at URL
|
555 |
+
<code>http://example.com/wp/2014/04/13/daily-thoughts/</code>,
|
556 |
+
a URL Prefix with Asterisk entry of
|
557 |
+
<code>http://example.com/wp/*/04/*/d</code>
|
558 |
+
would match all April Posts with Titles that begin with the letter "d", no matter what year they were posted.
|
559 |
+
</blockquote>
|
560 |
+
</p>
|
561 |
+
<?php
|
562 |
+
}
|
563 |
+
|
564 |
+
function jr_mt_echo_add_is_prefix() {
|
565 |
+
?>
|
566 |
+
<input type="radio" id="add_is_prefix" name="jr_mt_settings[add_is_prefix]" value="false" checked="checked" /> URL<br/>
|
567 |
+
<input type="radio" id="add_is_prefix" name="jr_mt_settings[add_is_prefix]" value="prefix" /> URL Prefix<br/>
|
568 |
+
<input type="radio" id="add_is_prefix" name="jr_mt_settings[add_is_prefix]" value="*" /> URL Prefix with Asterisk ("*")
|
569 |
+
<?php
|
570 |
+
}
|
571 |
+
|
572 |
+
function jr_mt_echo_add_theme() {
|
573 |
+
jr_mt_themes_field( 'add_theme', '', 'jr_mt_settings', FALSE );
|
574 |
+
}
|
575 |
+
|
576 |
+
function jr_mt_echo_add_path_id() {
|
577 |
+
?>
|
578 |
+
<input id="add_path_id" name="jr_mt_settings[add_path_id]" type="text" size="100" maxlength="256" value="" />
|
579 |
+
<br />
|
580 |
+
(cut and paste URL here of Page, Post, Prefix or other)
|
581 |
+
<br />
|
582 |
+
URL must begin with
|
583 |
+
<?php
|
584 |
+
echo '<code>' . trim( get_home_url(), '\ /' ) . '/</code>';
|
585 |
+
}
|
586 |
+
|
587 |
+
/**
|
588 |
+
* Section text for Section5
|
589 |
+
*
|
590 |
+
* Display an explanation of this Section
|
591 |
+
*
|
592 |
+
*/
|
593 |
+
function jr_mt_querykw_expl() {
|
594 |
+
?>
|
595 |
+
<p>
|
596 |
+
Select a Theme to use
|
597 |
+
whenever the specified Query Keyword (<code>?keyword=</code> or <code>&keyword=</code>)
|
598 |
+
is found in the URL of
|
599 |
+
any Page, Post or
|
600 |
+
any other non-Admin page.
|
601 |
+
And click the <b>Save Changes</b> button to add the entry.
|
602 |
+
</p>
|
603 |
+
<p>
|
604 |
+
<b>
|
605 |
+
Note
|
606 |
+
</b>
|
607 |
+
that Query Keyword takes precedence over all other types of Theme selection entries.
|
608 |
+
For example,
|
609 |
+
<?php
|
610 |
+
echo '<code>' . trim( get_home_url(), '\ /' ) . '?firstname=dorothy</code>'
|
611 |
+
. ' would use the Theme specified for the <code>firstname</code> keyword, not the Theme specified for Site Home.</p>';
|
612 |
+
}
|
613 |
+
function jr_mt_echo_add_querykw_theme() {
|
614 |
+
jr_mt_themes_field( 'add_querykw_theme', '', 'jr_mt_settings', FALSE );
|
615 |
+
}
|
616 |
+
function jr_mt_echo_add_querykw_keyword() {
|
617 |
+
$three_dots = '…';
|
618 |
+
echo '<code>'
|
619 |
+
. trim( get_home_url(), '\ /' )
|
620 |
+
. "/</code>$three_dots<code>/?"
|
621 |
+
. '<input id="add_querykw_keyword" name="jr_mt_settings[add_querykw_keyword]" type="text" size="20" maxlength="64" value="" />=</code>'
|
622 |
+
. $three_dots;
|
623 |
+
}
|
624 |
+
|
625 |
+
/**
|
626 |
+
* Section text for Section5
|
627 |
+
*
|
628 |
+
* Display an explanation of this Section
|
629 |
+
*
|
630 |
+
*/
|
631 |
+
function jr_mt_query_expl() {
|
632 |
+
?>
|
633 |
+
<p>
|
634 |
+
Select a Theme to use
|
635 |
+
whenever the specified Query Keyword <b>and</b> Value (<code>?keyword=value</code> or <code>&keyword=value</code>)
|
636 |
+
are found in the URL of
|
637 |
+
any Page, Post or
|
638 |
+
any other non-Admin page.
|
639 |
+
And click the <b>Save Changes</b> button to add the entry.
|
640 |
+
</p>
|
641 |
+
<p>
|
642 |
+
<b>
|
643 |
+
Note
|
644 |
+
</b>
|
645 |
+
that Query Keyword=Value takes precedence over all other Theme selection entries,
|
646 |
+
including a Query Keyword entry for the same Keyword.
|
647 |
+
For example,
|
648 |
+
<?php
|
649 |
+
echo '<code>' . trim( get_home_url(), '\ /' ) . '?firstname=dorothy</code>'
|
650 |
+
. ' would use the Theme specified for the <code>firstname=dorothy</code> keyword=value pair,'
|
651 |
+
. ' not the Theme specified for Site Home nor even the Theme specified for the Keyword <code>firstname</code>.</p>';
|
652 |
+
}
|
653 |
+
function jr_mt_echo_add_query_theme() {
|
654 |
+
jr_mt_themes_field( 'add_query_theme', '', 'jr_mt_settings', FALSE );
|
655 |
+
}
|
656 |
+
function jr_mt_echo_add_query_keyword() {
|
657 |
+
$three_dots = '…';
|
658 |
+
echo '<code>'
|
659 |
+
. trim( get_home_url(), '\ /' )
|
660 |
+
. "/</code>$three_dots<code>/?"
|
661 |
+
. '<input id="add_query_keyword" name="jr_mt_settings[add_query_keyword]" type="text" size="20" maxlength="64" value="" /></code>';
|
662 |
+
}
|
663 |
+
function jr_mt_echo_add_query_value() {
|
664 |
+
echo '<code>'
|
665 |
+
. '='
|
666 |
+
. '<input id="add_query_value" name="jr_mt_settings[add_query_value]" type="text" size="20" maxlength="64" value="" /></code>';
|
667 |
+
}
|
668 |
+
|
669 |
+
/**
|
670 |
+
* Section text for Section6
|
671 |
+
*
|
672 |
+
* Display an explanation of this Section
|
673 |
+
*
|
674 |
+
*/
|
675 |
+
function jr_mt_advanced_settings_expl() {
|
676 |
+
?>
|
677 |
+
<p>
|
678 |
+
<b>Warning:</b>
|
679 |
+
As the name of the section implies, Advanced Settings
|
680 |
+
may surprise you with unintended consequences,
|
681 |
+
so please be careful.
|
682 |
+
</p>
|
683 |
+
<p>
|
684 |
+
<b>Theme for Everything</b> simplifies the use of a Theme with Admin panel settings that you need to change frequently,
|
685 |
+
when the Theme is only going to be used on one or more Pages or Posts.
|
686 |
+
The Theme can be set as the WordPress Current Theme through the Appearance-Themes admin panel,
|
687 |
+
and set for specific Pages or Posts using this plugin's settings (above),
|
688 |
+
with another Theme specified below as the plugin's default theme ("Theme for Everything").
|
689 |
+
</p>
|
690 |
+
<?php
|
691 |
+
}
|
692 |
+
|
693 |
+
function jr_mt_echo_current() {
|
694 |
+
$settings = get_option( 'jr_mt_settings' );
|
695 |
+
jr_mt_themes_field( 'current', $settings['current'], 'jr_mt_settings', TRUE );
|
696 |
+
echo '<br />(select blank entry for default: WordPress Current Theme defined in Appearance-Themes, currently <b>' . wp_get_theme()->Name . '</b>)';
|
697 |
+
}
|
698 |
+
|
699 |
+
function jr_mt_validate_settings( $input ) {
|
700 |
+
$valid = array();
|
701 |
+
foreach ( array( 'all_pages', 'all_posts', 'site_home', 'current' ) as $thing ) {
|
702 |
+
$valid[$thing] = $input[$thing];
|
703 |
+
}
|
704 |
+
|
705 |
+
$settings = get_option( 'jr_mt_settings' );
|
706 |
+
$ids = $settings['ids'];
|
707 |
+
$query = $settings['query'];
|
708 |
+
if ( isset ( $input['del_entry'] ) ) {
|
709 |
+
foreach ( $input['del_entry'] as $del_entry ) {
|
710 |
+
unset( $ids[$del_entry] );
|
711 |
+
}
|
712 |
+
}
|
713 |
+
if ( isset ( $input['del_query_entry'] ) ) {
|
714 |
+
global $jr_mt_kwvalsep;
|
715 |
+
foreach ( $input['del_query_entry'] as $del_entry ) {
|
716 |
+
$entry = explode( $jr_mt_kwvalsep, $del_entry );
|
717 |
+
unset( $query[$entry[0]][$entry[1]] );
|
718 |
+
if ( empty( $query[$entry[0]] ) ) {
|
719 |
+
unset( $query[$entry[0]] );
|
720 |
+
}
|
721 |
+
}
|
722 |
+
}
|
723 |
+
|
724 |
+
/* Handle troublesome %E2%80%8E UTF Left-to-right Mark (LRM) suffix first.
|
725 |
+
*/
|
726 |
+
if ( FALSE === stripos( $input['add_path_id'], '%E2%80%8E' ) ) {
|
727 |
+
if ( FALSE === stripos( rawurlencode( $input['add_path_id'] ), '%E2%80%8E' ) ) {
|
728 |
+
$url = $input['add_path_id'];
|
729 |
+
} else {
|
730 |
+
$url = rawurldecode( str_ireplace( '%E2%80%8E', '', rawurlencode( $input['add_path_id'] ) ) );
|
731 |
+
}
|
732 |
+
} else {
|
733 |
+
$url = str_ireplace( '%E2%80%8E', '', $input['add_path_id'] );
|
734 |
+
}
|
735 |
+
$url = rawurldecode( trim( $url ) );
|
736 |
+
|
737 |
+
if ( ( empty( $input['add_theme'] ) && !empty( $url ) ) || ( !empty( $input['add_theme'] ) && empty( $url ) ) ) {
|
738 |
+
add_settings_error(
|
739 |
+
'jr_mt_settings',
|
740 |
+
'jr_mt_emptyerror',
|
741 |
+
'Both URL and Theme must be specified to add an Individual entry',
|
742 |
+
'error'
|
743 |
+
);
|
744 |
+
} else {
|
745 |
+
if ( !empty( $url ) ) {
|
746 |
+
$validate_url = jr_mt_site_url( $url );
|
747 |
+
if ( $validate_url === TRUE ) {
|
748 |
+
if ( ( '*' !== $input['add_is_prefix'] ) && ( FALSE !== strpos( $url, '*' ) ) ) {
|
749 |
+
add_settings_error(
|
750 |
+
'jr_mt_settings',
|
751 |
+
'jr_mt_queryerror',
|
752 |
+
'Asterisk ("*") only allowed when "URL Prefix with Asterisk" selected: <code>' . $url . '</code>',
|
753 |
+
'error'
|
754 |
+
);
|
755 |
+
} else {
|
756 |
+
extract( jr_mt_url_to_id( $url ) );
|
757 |
+
if ( 'false' === $input['add_is_prefix'] ) {
|
758 |
+
if ( $home ) {
|
759 |
+
add_settings_error(
|
760 |
+
'jr_mt_settings',
|
761 |
+
'jr_mt_homeerror',
|
762 |
+
'Please use "Select Theme for Site Home" field instead of specifying Site Home URL as an individual entry.',
|
763 |
+
'error'
|
764 |
+
);
|
765 |
+
} else {
|
766 |
+
if ( $type == 'admin' ) {
|
767 |
+
add_settings_error(
|
768 |
+
'jr_mt_settings',
|
769 |
+
'jr_mt_adminerror',
|
770 |
+
'Admin Page URLs are not allowed because no known Themes alter the appearance of Admin pages: <code>' . $url . '</code>',
|
771 |
+
'error'
|
772 |
+
);
|
773 |
+
} else {
|
774 |
+
if ( $id === FALSE ) {
|
775 |
+
$key = $page_url;
|
776 |
+
} else {
|
777 |
+
$key = $id;
|
778 |
+
}
|
779 |
+
}
|
780 |
+
}
|
781 |
+
} else {
|
782 |
+
if ( parse_url( $url, PHP_URL_QUERY ) === NULL ) {
|
783 |
+
if ( '*' === $input['add_is_prefix'] ) {
|
784 |
+
$asterisk_not_alone = FALSE;
|
785 |
+
$no_asterisk = TRUE;
|
786 |
+
$rel_url_dirs = explode( '/', str_replace( '\\', '/', $rel_url ) );
|
787 |
+
foreach ( $rel_url_dirs as $dir ) {
|
788 |
+
if ( $no_asterisk ) {
|
789 |
+
if ( FALSE !== strpos( $dir, '*' ) ) {
|
790 |
+
$no_asterisk = FALSE;
|
791 |
+
if ( '*' !== $dir ) {
|
792 |
+
$asterisk_not_alone = TRUE;
|
793 |
+
}
|
794 |
+
}
|
795 |
+
}
|
796 |
+
}
|
797 |
+
if ( $no_asterisk ) {
|
798 |
+
add_settings_error(
|
799 |
+
'jr_mt_settings',
|
800 |
+
'jr_mt_queryerror',
|
801 |
+
'No Asterisk ("*") specified but "URL Prefix with Asterisk" selected: <code>' . $url . '</code>',
|
802 |
+
'error'
|
803 |
+
);
|
804 |
+
} else {
|
805 |
+
if ( $asterisk_not_alone ) {
|
806 |
+
add_settings_error(
|
807 |
+
'jr_mt_settings',
|
808 |
+
'jr_mt_queryerror',
|
809 |
+
'An Asterisk ("*") may only replace a full subdirectory name, not just a portion of it: <code>' . $url . '</code>',
|
810 |
+
'error'
|
811 |
+
);
|
812 |
+
}
|
813 |
+
}
|
814 |
+
}
|
815 |
+
} else {
|
816 |
+
add_settings_error(
|
817 |
+
'jr_mt_settings',
|
818 |
+
'jr_mt_queryerror',
|
819 |
+
'?key=val&key=val Queries are not supported in a URL Prefix: <code>' . $url . '</code>',
|
820 |
+
'error'
|
821 |
+
);
|
822 |
+
}
|
823 |
+
$type = $input['add_is_prefix'];
|
824 |
+
$key = $rel_url;
|
825 |
+
}
|
826 |
+
$errors = get_settings_errors();
|
827 |
+
if ( empty( $errors ) ) {
|
828 |
+
$ids[$key] = array(
|
829 |
+
'theme' => $input['add_theme'],
|
830 |
+
'type' => $type,
|
831 |
+
'id' => $id,
|
832 |
+
'page_url' => $page_url,
|
833 |
+
'rel_url' => $rel_url,
|
834 |
+
'url' => $url
|
835 |
+
);
|
836 |
+
}
|
837 |
+
/*
|
838 |
+
$errors = get_settings_errors();
|
839 |
+
if ( empty( $errors ) ) {
|
840 |
+
// Here is where to check if URL gives a 404, but it doesn't work, always getting 302, and obliterating Settings Saved message
|
841 |
+
if ( 404 == $respcode = wp_remote_retrieve_response_code( wp_remote_head( $url ) ) ) {
|
842 |
+
add_settings_error(
|
843 |
+
'jr_mt_settings',
|
844 |
+
'jr_mt_urlerror',
|
845 |
+
"Warning: URL specified ('$url') generated error response $respcode",
|
846 |
+
'error'
|
847 |
+
);
|
848 |
+
}
|
849 |
+
}
|
850 |
+
*/
|
851 |
+
}
|
852 |
+
} else {
|
853 |
+
add_settings_error(
|
854 |
+
'jr_mt_settings',
|
855 |
+
'jr_mt_urlerror',
|
856 |
+
'URL specified for Individual page/post: <code>' . $url . '</code>' . $validate_url,
|
857 |
+
'updated'
|
858 |
+
);
|
859 |
+
}
|
860 |
+
}
|
861 |
+
}
|
862 |
+
|
863 |
+
/* Make sure reserved characters are not used
|
864 |
+
in URL Query keyword or value fields on Settings page.
|
865 |
+
*/
|
866 |
+
function jr_mt_query_chars( $element, $where ) {
|
867 |
+
foreach (
|
868 |
+
array(
|
869 |
+
'=' => 'Equals Sign' ,
|
870 |
+
'?' => 'Question Mark' ,
|
871 |
+
'&' => 'Ampersand' ,
|
872 |
+
' ' => 'Blank' ,
|
873 |
+
'#' => 'Number Sign' ,
|
874 |
+
'/' => 'Slash' ,
|
875 |
+
'\\' => 'Backslash' ,
|
876 |
+
'[' => 'Square Bracket',
|
877 |
+
']' => 'Square Bracket',
|
878 |
+
) as $char => $name ) {
|
879 |
+
if ( FALSE !== strpos( $element, $char ) ) {
|
880 |
+
add_settings_error(
|
881 |
+
'jr_mt_settings',
|
882 |
+
'jr_mt_queryerror',
|
883 |
+
'Illegal character used in '
|
884 |
+
. $where
|
885 |
+
. ': '
|
886 |
+
. $name
|
887 |
+
. ' ("' . $char . '") in "'
|
888 |
+
. $element
|
889 |
+
. '"',
|
890 |
+
'error'
|
891 |
+
);
|
892 |
+
return FALSE;
|
893 |
+
}
|
894 |
+
}
|
895 |
+
return TRUE;
|
896 |
+
}
|
897 |
+
/* Data Sanitization needed here
|
898 |
+
*/
|
899 |
+
$keyword = jr_mt_prep_query_keyword( $input['add_querykw_keyword'] );
|
900 |
+
if ( !empty( $input['add_querykw_theme'] ) && !empty( $keyword ) ) {
|
901 |
+
if ( jr_mt_query_chars( $keyword, 'Query Keyword' ) ) {
|
902 |
+
/* If there is an existing entry for the Keyword,
|
903 |
+
then replace it.
|
904 |
+
Otherwise, create a new entry.
|
905 |
+
*/
|
906 |
+
$query[$keyword]['*'] = $input['add_querykw_theme'];
|
907 |
+
}
|
908 |
+
} else {
|
909 |
+
if ( !( empty( $input['add_querykw_theme'] ) && empty( $keyword ) ) ) {
|
910 |
+
add_settings_error(
|
911 |
+
'jr_mt_settings',
|
912 |
+
'jr_mt_emptyerror',
|
913 |
+
'Both Query Keyword and Theme must be specified to add an Individual Query Keyword entry',
|
914 |
+
'error'
|
915 |
+
);
|
916 |
+
}
|
917 |
+
}
|
918 |
+
|
919 |
+
/* Data Sanitization needed here
|
920 |
+
*/
|
921 |
+
$keyword = jr_mt_prep_query_keyword( $input['add_query_keyword'] );
|
922 |
+
$value = jr_mt_prep_query_value( $input['add_query_value'] );
|
923 |
+
if ( !empty( $input['add_query_theme'] ) && !empty( $keyword ) && !empty( $value ) ) {
|
924 |
+
if ( jr_mt_query_chars( $keyword, 'Query Keyword' ) && jr_mt_query_chars( $value, 'Query Value' ) ) {
|
925 |
+
/* If there is an existing entry for the Keyword and Value pair,
|
926 |
+
then replace it.
|
927 |
+
Otherwise, create a new entry.
|
928 |
+
*/
|
929 |
+
$query[$keyword][$value] = $input['add_query_theme'];
|
930 |
+
}
|
931 |
+
} else {
|
932 |
+
if ( !( empty( $input['add_query_theme'] ) && empty( $keyword ) && empty( $value ) ) ) {
|
933 |
+
add_settings_error(
|
934 |
+
'jr_mt_settings',
|
935 |
+
'jr_mt_emptyerror',
|
936 |
+
'Query Keyword, Value and Theme must all be specified to add an Individual Query entry',
|
937 |
+
'error'
|
938 |
+
);
|
939 |
+
}
|
940 |
+
}
|
941 |
+
|
942 |
+
$errors = get_settings_errors();
|
943 |
+
if ( empty( $errors ) ) {
|
944 |
+
add_settings_error(
|
945 |
+
'jr_mt_settings',
|
946 |
+
'jr_mt_saved',
|
947 |
+
'Settings Saved',
|
948 |
+
'updated'
|
949 |
+
);
|
950 |
+
}
|
951 |
+
$valid['ids'] = $ids;
|
952 |
+
$valid['query'] = $query;
|
953 |
+
return $valid;
|
954 |
+
}
|
955 |
+
|
956 |
+
// $theme_name is the name of the Theme's folder within the Theme directory
|
957 |
+
function jr_mt_themes_field( $field_name, $theme_name, $setting, $excl_current_theme ) {
|
958 |
+
echo "<select id='$field_name' name='$setting" . "[$field_name]' size='1'>";
|
959 |
+
if ( empty( $theme_name ) ) {
|
960 |
+
$selected = 'selected="selected"';
|
961 |
+
} else {
|
962 |
+
$selected = '';
|
963 |
+
}
|
964 |
+
echo "<option value='' $selected></option>";
|
965 |
+
global $jr_mt_themes_cache;
|
966 |
+
foreach ( $jr_mt_themes_cache as $folder => $theme_obj ) {
|
967 |
+
if ( $excl_current_theme ) {
|
968 |
+
if ( ( jr_mt_current_theme( 'stylesheet' ) == $theme_obj['stylesheet'] ) && ( jr_mt_current_theme( 'template' ) == $theme_obj['template'] ) ) {
|
969 |
+
// Skip the Current Theme
|
970 |
+
continue;
|
971 |
+
}
|
972 |
+
}
|
973 |
+
if ( $theme_name == $folder ) {
|
974 |
+
$selected = 'selected="selected"';
|
975 |
+
} else {
|
976 |
+
$selected = '';
|
977 |
+
}
|
978 |
+
$name = $theme_obj->Name;
|
979 |
+
echo "<option value='$folder' $selected>$name</option>";
|
980 |
+
}
|
981 |
+
echo '</select>' . PHP_EOL;
|
982 |
+
}
|
983 |
+
|
984 |
+
?>
|
includes/functions.php
ADDED
@@ -0,0 +1,414 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Exit if .php file accessed directly
|
3 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
4 |
+
|
5 |
+
if ( function_exists( 'mb_strtolower' ) ) {
|
6 |
+
function jr_mt_strlen( $string ) {
|
7 |
+
return mb_strlen( $string );
|
8 |
+
}
|
9 |
+
function jr_mt_strtolower( $string ) {
|
10 |
+
return mb_strtolower( $string );
|
11 |
+
}
|
12 |
+
} else {
|
13 |
+
function jr_mt_strlen( $string ) {
|
14 |
+
return strlen( $string );
|
15 |
+
}
|
16 |
+
function jr_mt_strtolower( $string ) {
|
17 |
+
return strtolower( $string );
|
18 |
+
}
|
19 |
+
}
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Return WordPress Current Theme, as defined in Appearance Admin panels
|
23 |
+
*
|
24 |
+
* Obtains Folder Name of Current Theme, from 'template' option of wp_load_alloptions().
|
25 |
+
*
|
26 |
+
* @param string $option parameter to select current template or stylesheet
|
27 |
+
* @return string type Folder Name of Current Theme
|
28 |
+
*/
|
29 |
+
function jr_mt_current_theme( $option ) {
|
30 |
+
global $jr_mt_options_cache;
|
31 |
+
return $jr_mt_options_cache[$option];
|
32 |
+
}
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Given URL, return post or page ID, if possible, and relative path if not
|
36 |
+
*
|
37 |
+
* Calls jr_mt_query_keywords.
|
38 |
+
*
|
39 |
+
* @param string $url full URL of WordPress page, post, admin, etc.
|
40 |
+
* @return array array with keys of "type", "id" and "page_url":
|
41 |
+
* string type "pages", "posts" or "admin"
|
42 |
+
* string id Page ID or Post ID or FALSE
|
43 |
+
* string page_url relative URL WordPress page, post, admin, etc. or FALSE
|
44 |
+
* string rel_url URL relative to WordPress home
|
45 |
+
* bool home is URL Site Home?
|
46 |
+
*/
|
47 |
+
function jr_mt_url_to_id( $url_orig ) {
|
48 |
+
// Some hosts, likely only IIS, insert an erroneous "/index.php" into the middle of the Permalink in $_SERVER['REQUEST_URI']
|
49 |
+
$url = str_replace( '/index.php', '', $url_orig );
|
50 |
+
|
51 |
+
$trim = '\ /'; // remove leading and trailing backslashes, blanks and forward slashes
|
52 |
+
|
53 |
+
$is_home = FALSE;
|
54 |
+
|
55 |
+
// get_home_url() returns "https://subdomain.domain.com/wp" - the full URL of the home page of the site
|
56 |
+
$home = trim( parse_url( get_home_url(), PHP_URL_PATH ), $trim ); // "wp"
|
57 |
+
|
58 |
+
$admin_home = trim( parse_url( admin_url(), PHP_URL_PATH ), $trim );
|
59 |
+
$page_url = trim( parse_url( $url, PHP_URL_PATH ), $trim ); // "wp/fruit/apples"
|
60 |
+
$is_admin = ( $admin_home == substr( $page_url, 0, strlen( $admin_home ) ) );
|
61 |
+
if ( !empty( $home ) ) { // Only if WordPress is installed in a subfolder, NOT in the Root
|
62 |
+
$page_url = trim( substr( $page_url, stripos( $page_url, $home ) + strlen( $home ) ), $trim ); // "fruit/apples"
|
63 |
+
}
|
64 |
+
$rel_url = $page_url;
|
65 |
+
|
66 |
+
$type = FALSE;
|
67 |
+
|
68 |
+
$id = jr_mt_query_keywords( parse_url( $url, PHP_URL_QUERY ) );
|
69 |
+
if ( $id === NULL ) {
|
70 |
+
if ( $is_admin ) {
|
71 |
+
$id = FALSE;
|
72 |
+
$type = 'admin';
|
73 |
+
} else {
|
74 |
+
// Check for home page (url_to_postid() does not work for home page)
|
75 |
+
if ( empty( $page_url ) ) {
|
76 |
+
$is_home = TRUE;
|
77 |
+
$id = get_option('page_on_front');
|
78 |
+
if ( $id == 0 ) {
|
79 |
+
// There is no home Page; posts are displayed instead on the home page
|
80 |
+
$page_url = '';
|
81 |
+
$id = FALSE;
|
82 |
+
} else {
|
83 |
+
$type = 'pages';
|
84 |
+
}
|
85 |
+
} else {
|
86 |
+
global $wp_rewrite;
|
87 |
+
if ( is_null( $wp_rewrite ) ) {
|
88 |
+
$GLOBALS['wp_rewrite'] = new WP_Rewrite();
|
89 |
+
}
|
90 |
+
global $wp;
|
91 |
+
if ( is_null( $wp ) ) {
|
92 |
+
$GLOBALS['jr_mt_cache'] = FALSE;
|
93 |
+
$wp = (object) array( 'public_query_vars' => array() );
|
94 |
+
} else {
|
95 |
+
if ( !isset( $wp->public_query_vars ) ) {
|
96 |
+
$GLOBALS['jr_mt_cache'] = FALSE;
|
97 |
+
$wp->public_query_vars = array();
|
98 |
+
}
|
99 |
+
}
|
100 |
+
$id = url_to_postid( $url );
|
101 |
+
if ( $id == 0 ) {
|
102 |
+
$page = get_page_by_path( $page_url );
|
103 |
+
if ( $page === NULL ) {
|
104 |
+
// get_page_by_path() returns NULL for Posts, Home Page, Admin, etc.
|
105 |
+
// So, check for Posts:
|
106 |
+
$post = get_posts( array( 'name' => $page_url ) );
|
107 |
+
if ( empty( $post ) ) {
|
108 |
+
$id = FALSE;
|
109 |
+
} else {
|
110 |
+
$id = $post[0]->ID;
|
111 |
+
$type = 'posts';
|
112 |
+
}
|
113 |
+
} else {
|
114 |
+
$id = $page->ID;
|
115 |
+
$type = 'pages';
|
116 |
+
}
|
117 |
+
} else {
|
118 |
+
$post_obj = get_post( $id );
|
119 |
+
if ( $post_obj->post_type == 'page' ) {
|
120 |
+
$type = 'pages';
|
121 |
+
} else {
|
122 |
+
if ( $post_obj->post_type == 'post' ) {
|
123 |
+
$type = 'posts';
|
124 |
+
}
|
125 |
+
}
|
126 |
+
}
|
127 |
+
}
|
128 |
+
}
|
129 |
+
} else {
|
130 |
+
// id in query of URL (?keyword=value&keyword=value)
|
131 |
+
$type = key( $id );
|
132 |
+
$id = $id[$type];
|
133 |
+
$page_url = FALSE;
|
134 |
+
}
|
135 |
+
return array(
|
136 |
+
'type' => $type,
|
137 |
+
'id' => $id,
|
138 |
+
'page_url' => $page_url,
|
139 |
+
'rel_url' => $rel_url,
|
140 |
+
'home' => $is_home
|
141 |
+
);
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Return page_id= or p= (post ID) or page= (admin page) value from a URL
|
146 |
+
*
|
147 |
+
* Calls parse_str function in its own variable space because it could create virtually any variable name!
|
148 |
+
* Only looks at page_id=, p= and page= now, but could be expanded to other query keywords.
|
149 |
+
*
|
150 |
+
* @param string $url_query Query portion (after the ?) in a URL
|
151 |
+
* @return var array with key of "pages", "posts" or "admin" and value of page_id=, p= or page=, respectively; or NULL if none are present
|
152 |
+
*/
|
153 |
+
function jr_mt_query_keywords( $url_query ) {
|
154 |
+
if ( $url_query === NULL ) {
|
155 |
+
return NULL;
|
156 |
+
} else {
|
157 |
+
parse_str( $url_query );
|
158 |
+
if ( isset( $page_id ) ) {
|
159 |
+
return array( 'pages' => $page_id );
|
160 |
+
} else {
|
161 |
+
if ( isset( $p ) ) {
|
162 |
+
return array( 'posts' => $p );
|
163 |
+
} else {
|
164 |
+
if ( isset( $page ) ) {
|
165 |
+
return array( 'admin' => $page );
|
166 |
+
} else {
|
167 |
+
if ( isset( $cat ) ) {
|
168 |
+
return array( 'cat' => $cat );
|
169 |
+
} else {
|
170 |
+
if ( isset( $m ) ) {
|
171 |
+
return array( 'archive' => $m );
|
172 |
+
} else {
|
173 |
+
if ( isset( $s ) ) {
|
174 |
+
return array( 'livesearch' => $s );
|
175 |
+
} else {
|
176 |
+
return NULL;
|
177 |
+
}
|
178 |
+
}
|
179 |
+
}
|
180 |
+
}
|
181 |
+
}
|
182 |
+
}
|
183 |
+
}
|
184 |
+
}
|
185 |
+
|
186 |
+
/**
|
187 |
+
* Is the URL on the current WordPress web site?
|
188 |
+
*
|
189 |
+
* Checks if URL begins with Site Home URL.
|
190 |
+
*
|
191 |
+
* @param string $url URL to be checked to be sure it is "on" the current WordPress web site
|
192 |
+
* @return var bool TRUE if URL on current WordPress web site; string error message otherwise
|
193 |
+
*/
|
194 |
+
function jr_mt_site_url( $url ) {
|
195 |
+
$check_url = trim( $url );
|
196 |
+
if ( strcasecmp( 'http', substr( $check_url, 0, 4 ) ) != 0 ) {
|
197 |
+
return 'URL does not begin with http://';
|
198 |
+
}
|
199 |
+
$site_home = get_home_url();
|
200 |
+
if ( strcasecmp( $site_home, substr( $check_url, 0, strlen( $site_home ) ) ) != 0 ) {
|
201 |
+
return "URL specified is not part of current WordPress web site. URL must begin with '$site_home'";
|
202 |
+
}
|
203 |
+
return TRUE;
|
204 |
+
}
|
205 |
+
|
206 |
+
function jr_readme() {
|
207 |
+
$readme = array( 'read readme' => FALSE );
|
208 |
+
$file_array = jr_filesystem_text_read('readme.txt', jr_mt_path());
|
209 |
+
if ( ( FALSE !== $file_array ) && !is_wp_error( $file_array ) ) {
|
210 |
+
// Get first non-blank line
|
211 |
+
$results = jr_nextline( $file_array, 0 );
|
212 |
+
if ( '===' === substr( $results['line'], 0, 3) ) {
|
213 |
+
$readme['read readme'] = TRUE;
|
214 |
+
$readme['name'] = trim( $results['line'], ' =' );
|
215 |
+
do {
|
216 |
+
$results = jr_nextline( $file_array, $results['index'] );
|
217 |
+
if ( '==' === substr( $results['line'], 0, 2) ) {
|
218 |
+
break;
|
219 |
+
} else {
|
220 |
+
$colon = strpos( $results['line'], ":", 4 );
|
221 |
+
if ( $colon !== FALSE ) {
|
222 |
+
$key = preg_replace( '/\s+/', ' ', trim( substr( $results['line'], 0, $colon ) ) );
|
223 |
+
$readme[$key] = trim( substr( $results['line'], $colon + 1 ) );
|
224 |
+
}
|
225 |
+
}
|
226 |
+
} while ( $results['line'] != "" );
|
227 |
+
}
|
228 |
+
}
|
229 |
+
return $readme;
|
230 |
+
}
|
231 |
+
function jr_nextline( $file_array, $index ) {
|
232 |
+
$line = "";
|
233 |
+
while ( ( $index < count( $file_array ) ) && ( $line === "" ) ) {
|
234 |
+
$line = trim( $file_array[$index++] );
|
235 |
+
};
|
236 |
+
return array( 'line' => $line, 'index' => $index );
|
237 |
+
// ['line'] of "" indicates End of File
|
238 |
+
// ['index'] is the next line to be read
|
239 |
+
}
|
240 |
+
|
241 |
+
/**
|
242 |
+
* Initialize Filesystem object
|
243 |
+
*
|
244 |
+
* @param str $form_url - URL of the page to display request form
|
245 |
+
* @param str $method - connection method
|
246 |
+
* @param str $context - destination folder
|
247 |
+
* @param array $fields - fileds of $_POST array that should be preserved between screens
|
248 |
+
* @return bool/str - false on failure, stored text on success
|
249 |
+
**/
|
250 |
+
function jr_filesystem_init( $form_url, $method, $context, $fields = null ) {
|
251 |
+
global $wp_filesystem;
|
252 |
+
|
253 |
+
/* first attempt to get credentials */
|
254 |
+
if (false === ($creds = request_filesystem_credentials($form_url, $method, false, $context, $fields))) {
|
255 |
+
|
256 |
+
/**
|
257 |
+
* if we comes here - we don't have credentials
|
258 |
+
* so the request for them is displaying
|
259 |
+
* no need for further processing
|
260 |
+
**/
|
261 |
+
return false;
|
262 |
+
}
|
263 |
+
|
264 |
+
/* now we got some credentials - try to use them*/
|
265 |
+
if ( !WP_Filesystem( $creds ) ) {
|
266 |
+
|
267 |
+
/* incorrect connection data - ask for credentials again, now with error message */
|
268 |
+
request_filesystem_credentials($form_url, $method, true, $context);
|
269 |
+
return false;
|
270 |
+
}
|
271 |
+
|
272 |
+
return true; //filesystem object successfully initiated
|
273 |
+
}
|
274 |
+
|
275 |
+
/**
|
276 |
+
* Read text from file
|
277 |
+
*
|
278 |
+
* @param str $form_url - URL of the page where request form will be displayed
|
279 |
+
* @return bool/str - false on failure, stored text on success
|
280 |
+
**/
|
281 |
+
function jr_filesystem_text_read($file_name, $context){
|
282 |
+
global $wp_filesystem;
|
283 |
+
|
284 |
+
$text = '';
|
285 |
+
|
286 |
+
$form_url = wp_nonce_url('themes.php?page=jr_mt_settings', 'filesystem_dummy_screen');
|
287 |
+
$method = ''; //leave this empty to perform test for 'direct' writing
|
288 |
+
|
289 |
+
if(!jr_filesystem_init($form_url, $method, $context))
|
290 |
+
return false; //stop further processing when request forms displaying
|
291 |
+
|
292 |
+
/*
|
293 |
+
* now $wp_filesystem could be used
|
294 |
+
* get correct target file first
|
295 |
+
**/
|
296 |
+
$target_dir = $wp_filesystem->find_folder($context);
|
297 |
+
$target_file = trailingslashit($target_dir).$file_name;
|
298 |
+
|
299 |
+
/* read the file */
|
300 |
+
if($wp_filesystem->exists($target_file)){ //check for existence
|
301 |
+
|
302 |
+
$text = $wp_filesystem->get_contents_array($target_file);
|
303 |
+
if(!$text)
|
304 |
+
return new WP_Error('reading_error', 'Error when reading file'); //return error object
|
305 |
+
|
306 |
+
}
|
307 |
+
|
308 |
+
return $text;
|
309 |
+
}
|
310 |
+
|
311 |
+
/**
|
312 |
+
* Perform writing into file
|
313 |
+
*
|
314 |
+
* @param str $form_url - URL of the page to display request form
|
315 |
+
* @return bool/str - false on failure, stored text on success
|
316 |
+
**/
|
317 |
+
function jr_filesystem_text_write( $content, $file_name, $context ) {
|
318 |
+
global $wp_filesystem;
|
319 |
+
|
320 |
+
$method = ''; //leave this empty to perform test for 'direct' writing
|
321 |
+
$form_url = wp_nonce_url('themes.php?page=jr_mt_settings', 'filesystem_dummy_screen');
|
322 |
+
|
323 |
+
if(!jr_filesystem_init($form_url, $method, $context))
|
324 |
+
return false; //stop further processing when request form is displaying
|
325 |
+
|
326 |
+
/*
|
327 |
+
* now $wp_filesystem could be used
|
328 |
+
* get correct target file first
|
329 |
+
**/
|
330 |
+
$target_dir = $wp_filesystem->find_folder($context);
|
331 |
+
$target_file = trailingslashit($target_dir) . $file_name;
|
332 |
+
|
333 |
+
/* write into file */
|
334 |
+
if(!$wp_filesystem->put_contents($target_file, $content, FS_CHMOD_FILE))
|
335 |
+
return new WP_Error('writing_error', 'Error when writing file'); //return error object
|
336 |
+
|
337 |
+
return $content;
|
338 |
+
}
|
339 |
+
|
340 |
+
/**
|
341 |
+
* Update available for Plugin?
|
342 |
+
*
|
343 |
+
* @return bool - TRUE if an update is available in the WordPress Repository,
|
344 |
+
* FALSE if no update is available or if the update_plugins transient is not available
|
345 |
+
* (which also results in an error message).
|
346 |
+
**/
|
347 |
+
function jr_mt_plugin_update_available() {
|
348 |
+
global $jr_mt_update_plugins;
|
349 |
+
if ( !isset( $jr_mt_update_plugins ) ) {
|
350 |
+
$transient = get_site_transient( 'update_plugins' );
|
351 |
+
if ( FALSE === $transient ) {
|
352 |
+
// Error
|
353 |
+
return FALSE;
|
354 |
+
} else {
|
355 |
+
$jr_mt_update_plugins = $transient;
|
356 |
+
}
|
357 |
+
}
|
358 |
+
if ( empty( $jr_mt_update_plugins->response ) ) {
|
359 |
+
return FALSE;
|
360 |
+
}
|
361 |
+
return array_key_exists( jr_mt_plugin_basename(), $jr_mt_update_plugins->response );
|
362 |
+
}
|
363 |
+
|
364 |
+
/**
|
365 |
+
* What Themes are defined to Plugin?
|
366 |
+
*
|
367 |
+
* @return arr - a list of Themes (folder names) defined in Settings of Plugin
|
368 |
+
**/
|
369 |
+
function jr_mt_themes_defined() {
|
370 |
+
$themes = array();
|
371 |
+
$settings = get_option( 'jr_mt_settings' );
|
372 |
+
foreach ( $settings as $key => $value ) {
|
373 |
+
if ( 'ids' == $key ) {
|
374 |
+
foreach ( $value as $id => $arr ) {
|
375 |
+
$themes[] = $arr['theme'];
|
376 |
+
}
|
377 |
+
} else {
|
378 |
+
if ( !empty( $value ) ) {
|
379 |
+
$themes[] = $value;
|
380 |
+
}
|
381 |
+
}
|
382 |
+
}
|
383 |
+
return array_unique( $themes );
|
384 |
+
}
|
385 |
+
|
386 |
+
/**
|
387 |
+
* Prepare URL Query Value
|
388 |
+
*
|
389 |
+
* Sanitize and standardize a URL Query Value for storage in a database.
|
390 |
+
* Does not support ?keyword[]=value, i.e. - $value cannot be an Array.
|
391 |
+
*
|
392 |
+
* @param string $value URL Query Value to be sanitized and standardized; will fail if array
|
393 |
+
* @return string URL Query Value after being sanitized and standardized
|
394 |
+
*/
|
395 |
+
function jr_mt_prep_query_value( $value ) {
|
396 |
+
return str_ireplace( '%e2%80%8e', '', jr_mt_strtolower( trim( $value ) ) );
|
397 |
+
}
|
398 |
+
function jr_mt_prep_query_keyword( $keyword ) {
|
399 |
+
return jr_mt_prep_query_value( $keyword );
|
400 |
+
}
|
401 |
+
|
402 |
+
function jr_mt_parse_query( $query ) {
|
403 |
+
/* Written to replace parse_str which converts a dot to an underscore
|
404 |
+
*/
|
405 |
+
$marker = 'jr_mt_dot';
|
406 |
+
parse_str( str_replace( '.', $marker, $query ), $marker_array );
|
407 |
+
$query_array = array();
|
408 |
+
foreach ( $marker_array as $key => $val ) {
|
409 |
+
$query_array[str_replace( $marker, '.', $key )] = str_replace( $marker, '.', $val );
|
410 |
+
}
|
411 |
+
return $query_array;
|
412 |
+
}
|
413 |
+
|
414 |
+
?>
|
includes/index.html
ADDED
File without changes
|
includes/old-wp.php
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Exit if .php file accessed directly
|
3 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
4 |
+
|
5 |
+
/* A Version of WordPress older than the first one supported by the Plugin
|
6 |
+
is being run.
|
7 |
+
*/
|
8 |
+
|
9 |
+
add_action( 'all_admin_notices', 'jr_mt_all_admin_notice' );
|
10 |
+
// Runs after admin_menu hook
|
11 |
+
add_action( 'admin_notices', 'jr_mt_all_admin_notice' ); // for older versions
|
12 |
+
|
13 |
+
function jr_mt_all_admin_notice() {
|
14 |
+
// Only displayed in Admin panels:
|
15 |
+
echo '<div class="error">Deactivated the <b>jonradio Multiple Themes</b> plugin: requires WordPress Version 3.4 or newer; you are running Version '
|
16 |
+
. get_bloginfo( 'version' ) . '</div>';
|
17 |
+
global $jr_mt_file;
|
18 |
+
deactivate_plugins( $jr_mt_file );
|
19 |
+
}
|
20 |
+
|
21 |
+
?>
|
includes/select-theme.php
ADDED
@@ -0,0 +1,216 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Exit if .php file accessed directly
|
3 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
4 |
+
|
5 |
+
add_action( 'plugins_loaded', 'jr_mt_plugins_loaded' );
|
6 |
+
function jr_mt_plugins_loaded() {
|
7 |
+
/* Select the relevant Theme
|
8 |
+
*/
|
9 |
+
add_filter( 'pre_option_stylesheet', 'jr_mt_stylesheet' );
|
10 |
+
add_filter( 'pre_option_template', 'jr_mt_template' );
|
11 |
+
}
|
12 |
+
|
13 |
+
function jr_mt_stylesheet() {
|
14 |
+
return jr_mt_theme( 'stylesheet' );
|
15 |
+
}
|
16 |
+
|
17 |
+
function jr_mt_template() {
|
18 |
+
return jr_mt_theme( 'template' );
|
19 |
+
}
|
20 |
+
|
21 |
+
function jr_mt_theme( $option ) {
|
22 |
+
/* The hooks that (indirectly) call this function are called repeatedly by WordPress,
|
23 |
+
so do the checking once and store the values in a global array.
|
24 |
+
$jt_mt_theme['stylesheet'] - Stylesheet Name of Theme chosen
|
25 |
+
$jt_mt_theme['template'] - Template Name of Theme chosen
|
26 |
+
|
27 |
+
Very important note:
|
28 |
+
- get_option( 'jr_mt_settings' ) ['ids']['theme'] is the Theme Subdirectory Name,
|
29 |
+
as opposed to the Template or Stylesheet Name for the Theme.
|
30 |
+
- likewise, the variable local variable $theme
|
31 |
+
These three different values for each Theme must be clearly separated, as all three usually
|
32 |
+
match, but do not have to, e.g. - Child Themes.
|
33 |
+
*/
|
34 |
+
$GLOBALS['jr_mt_cache'] = TRUE;
|
35 |
+
global $jr_mt_theme;
|
36 |
+
if ( !isset( $jr_mt_theme ) ) {
|
37 |
+
$jr_mt_theme = array();
|
38 |
+
}
|
39 |
+
if ( !isset( $jr_mt_theme[$option] ) ) {
|
40 |
+
$theme = jr_mt_chosen();
|
41 |
+
if ( $theme === FALSE ) {
|
42 |
+
// Get both at once, to save a repeat of this logic later:
|
43 |
+
$jr_mt_theme['stylesheet'] = jr_mt_current_theme( 'stylesheet' );
|
44 |
+
$jr_mt_theme['template'] = jr_mt_current_theme( 'template' );
|
45 |
+
} else {
|
46 |
+
$themes = wp_get_themes();
|
47 |
+
$jr_mt_theme['stylesheet'] = $themes[$theme]->stylesheet;
|
48 |
+
$jr_mt_theme['template'] = $themes[$theme]->template;
|
49 |
+
}
|
50 |
+
}
|
51 |
+
$theme = $jr_mt_theme[$option];
|
52 |
+
global $jr_mt_cache;
|
53 |
+
if ( $jr_mt_cache === FALSE ) {
|
54 |
+
unset( $jr_mt_theme[$option] );
|
55 |
+
}
|
56 |
+
return $theme;
|
57 |
+
}
|
58 |
+
|
59 |
+
// Returns FALSE for Current Theme
|
60 |
+
function jr_mt_chosen() {
|
61 |
+
$keywords_raw = jr_mt_parse_query( $_SERVER['QUERY_STRING'] );
|
62 |
+
$keywords = array();
|
63 |
+
foreach ( $keywords_raw as $keyword => $value ) {
|
64 |
+
if ( is_array( $value ) ) {
|
65 |
+
$kw_prepped = jr_mt_prep_query_keyword( $keyword );
|
66 |
+
foreach ( $value as $arr_key => $arr_value ) {
|
67 |
+
$keywords[$kw_prepped][jr_mt_prep_query_value( $arr_key )] = jr_mt_prep_query_value( $arr_value );
|
68 |
+
}
|
69 |
+
} else {
|
70 |
+
$keywords[jr_mt_prep_query_keyword( $keyword )] = jr_mt_prep_query_value( $value );
|
71 |
+
}
|
72 |
+
}
|
73 |
+
if ( is_admin() ) {
|
74 |
+
// Admin panel
|
75 |
+
// return P2 theme if p2ajax= is present; current theme otherwise
|
76 |
+
if ( isset( $keywords['p2ajax'] ) && array_key_exists( 'p2', wp_get_themes() ) ) {
|
77 |
+
$theme = 'p2';
|
78 |
+
} else {
|
79 |
+
$theme = FALSE; // Current Theme
|
80 |
+
}
|
81 |
+
} else {
|
82 |
+
/* Non-Admin page, i.e. - Public Site, etc.
|
83 |
+
|
84 |
+
Begin by checking for any Query keywords specified by the Admin in Settings
|
85 |
+
*/
|
86 |
+
$settings = get_option( 'jr_mt_settings' );
|
87 |
+
$settings_query = $settings['query'];
|
88 |
+
foreach ( $keywords as $keyword => $value ) {
|
89 |
+
if ( isset( $settings_query[$keyword] ) ) {
|
90 |
+
if ( isset( $settings_query[$keyword][$value] ) ) {
|
91 |
+
return $settings_query[$keyword][$value];
|
92 |
+
} else {
|
93 |
+
if ( isset( $settings_query[$keyword]['*'] ) ) {
|
94 |
+
return $settings_query[$keyword]['*'];
|
95 |
+
}
|
96 |
+
}
|
97 |
+
}
|
98 |
+
}
|
99 |
+
|
100 |
+
extract( jr_mt_url_to_id( rawurldecode( parse_url( home_url(), PHP_URL_SCHEME ) . '://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] ) ) );
|
101 |
+
if ( ( 'livesearch' === $type ) && ( FALSE !== $livesearch_theme = jr_mt_livesearch_theme() ) ) {
|
102 |
+
return $livesearch_theme;
|
103 |
+
}
|
104 |
+
if ( $home ) {
|
105 |
+
if ( trim( $settings['site_home'] ) != '' ) {
|
106 |
+
return $settings['site_home'];
|
107 |
+
}
|
108 |
+
}
|
109 |
+
$ids = $settings['ids'];
|
110 |
+
if ( $id === FALSE ) {
|
111 |
+
if ( isset( $ids[$page_url] ) ) {
|
112 |
+
$theme = $ids[$page_url]['theme'];
|
113 |
+
} else {
|
114 |
+
$theme = jr_mt_check_all( $type, $rel_url, $ids );
|
115 |
+
}
|
116 |
+
} else {
|
117 |
+
if ( isset( $ids[$id] ) ) {
|
118 |
+
$theme = $ids[$id]['theme'];
|
119 |
+
} else {
|
120 |
+
$theme = jr_mt_check_all( $type, $rel_url, $ids );
|
121 |
+
}
|
122 |
+
}
|
123 |
+
}
|
124 |
+
return $theme;
|
125 |
+
}
|
126 |
+
|
127 |
+
// Returns FALSE for Current Theme
|
128 |
+
function jr_mt_check_all( $type, $rel_url, $ids ) {
|
129 |
+
// Check Prefix entries first, because we already know there is no specific entry for this URL.
|
130 |
+
$theme = '';
|
131 |
+
$match_length = 0;
|
132 |
+
foreach ( $ids as $key => $array ) {
|
133 |
+
if ( $array['type'] == 'prefix' ) {
|
134 |
+
$this_length = strlen( $array['rel_url'] );
|
135 |
+
if ( $array['rel_url'] == substr( $rel_url, 0, $this_length ) ) {
|
136 |
+
// Need to find longest match if there are multiple prefix matches.
|
137 |
+
if ( $this_length > $match_length ) {
|
138 |
+
$theme = $array['theme'];
|
139 |
+
$match_length = $this_length;
|
140 |
+
}
|
141 |
+
}
|
142 |
+
}
|
143 |
+
}
|
144 |
+
// See if a Prefix entry was found
|
145 |
+
if ( $match_length == 0 ) {
|
146 |
+
/* No, so now check for Asterisk
|
147 |
+
*/
|
148 |
+
$current_url = str_replace( '\\', '/', $rel_url );
|
149 |
+
$current_url_dirs = explode( '/', $current_url );
|
150 |
+
$current_url_dirs_count = count( $current_url_dirs );
|
151 |
+
foreach ( $ids as $key => $array ) {
|
152 |
+
if ( '*' === $array['type'] ) {
|
153 |
+
$prefix_url = str_replace( '\\', '/', $array['rel_url'] );
|
154 |
+
$prefix_url_dirs = explode( '/', $prefix_url );
|
155 |
+
/* Current URL must have at least as many subdirectory levels
|
156 |
+
specified as Prefix Entry being tested, or it cannot match
|
157 |
+
*/
|
158 |
+
if ( $current_url_dirs_count >= count( $prefix_url_dirs ) ) {
|
159 |
+
foreach ( $prefix_url_dirs as $element => $dir ) {
|
160 |
+
/* Anywhere there is an Asterisk in Entry,
|
161 |
+
Make the Current URL match at that point (subdirectory level)
|
162 |
+
*/
|
163 |
+
if ( '*' === $dir ) {
|
164 |
+
$current_url_dirs[$element] = '*';
|
165 |
+
}
|
166 |
+
}
|
167 |
+
$this_length = strlen( $prefix_url );
|
168 |
+
if ( $prefix_url === substr( implode( '/', $current_url_dirs ), 0, $this_length ) ) {
|
169 |
+
// Need to find longest match if there are multiple prefix matches.
|
170 |
+
if ( $this_length > $match_length ) {
|
171 |
+
$theme = $array['theme'];
|
172 |
+
$match_length = $this_length;
|
173 |
+
}
|
174 |
+
}
|
175 |
+
}
|
176 |
+
}
|
177 |
+
}
|
178 |
+
if ( $match_length == 0 ) {
|
179 |
+
if ( $type === FALSE ) {
|
180 |
+
$theme = FALSE; // Current Theme
|
181 |
+
} else {
|
182 |
+
$settings = get_option( 'jr_mt_settings' );
|
183 |
+
if ( isset( $settings["all_$type"] ) ) {
|
184 |
+
$theme = $settings["all_$type"];
|
185 |
+
} else {
|
186 |
+
$theme = '';
|
187 |
+
}
|
188 |
+
if ( empty( $theme ) ) {
|
189 |
+
$theme = FALSE; // Current Theme
|
190 |
+
}
|
191 |
+
}
|
192 |
+
}
|
193 |
+
}
|
194 |
+
return $theme;
|
195 |
+
}
|
196 |
+
|
197 |
+
function jr_mt_livesearch_theme() {
|
198 |
+
$livesearch_themes = array( 'knowhow' );
|
199 |
+
if ( in_array( jr_mt_current_theme( 'stylesheet' ), $livesearch_themes ) ) {
|
200 |
+
return jr_mt_current_theme( 'stylesheet' );
|
201 |
+
} else {
|
202 |
+
if ( in_array( jr_mt_current_theme( 'template' ), $livesearch_themes ) ) {
|
203 |
+
return jr_mt_current_theme( 'template' );
|
204 |
+
} else {
|
205 |
+
// Go through all the Themes defined in the Plugin's settings
|
206 |
+
foreach ( jr_mt_themes_defined() as $theme ) {
|
207 |
+
if ( in_array( $theme, $livesearch_themes ) ) {
|
208 |
+
return $theme;
|
209 |
+
}
|
210 |
+
}
|
211 |
+
}
|
212 |
+
}
|
213 |
+
return FALSE;
|
214 |
+
}
|
215 |
+
|
216 |
+
?>
|
index.html
ADDED
File without changes
|
jonradio-multiple-themes.php
ADDED
@@ -0,0 +1,238 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
Plugin Name: jonradio Multiple Themes
|
4 |
+
Plugin URI: http://zatzlabs.com/plugins/
|
5 |
+
Description: Select different Themes for one or more, or all WordPress Pages, Posts or other non-Admin pages. Or Site Home.
|
6 |
+
Version: 4.8
|
7 |
+
Author: David Gewirtz
|
8 |
+
Author URI: http://zatzlabs.com/plugins/
|
9 |
+
License: GPLv2
|
10 |
+
*/
|
11 |
+
|
12 |
+
/* Copyright 2013 jonradio (email : info@zatz.com)
|
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 2 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, write to the Free Software
|
26 |
+
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
27 |
+
*/
|
28 |
+
|
29 |
+
/* Exit if .php file accessed directly
|
30 |
+
*/
|
31 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
32 |
+
|
33 |
+
global $jr_mt_file;
|
34 |
+
$jr_mt_file = __FILE__;
|
35 |
+
|
36 |
+
/* Catch old unsupported version of WordPress before any damage can be done.
|
37 |
+
*/
|
38 |
+
if ( version_compare( get_bloginfo( 'version' ), '3.4', '<' ) ) {
|
39 |
+
require_once( plugin_dir_path( __FILE__ ) . 'includes/old-wp.php' );
|
40 |
+
} else {
|
41 |
+
/* Use $plugin_data['Name'] for the array of incompatible plugins
|
42 |
+
*/
|
43 |
+
global $jr_mt_incompat_plugins;
|
44 |
+
$jr_mt_incompat_plugins = array( 'Theme Test Drive', 'BuddyPress', 'Polylang' );
|
45 |
+
|
46 |
+
global $jr_mt_path;
|
47 |
+
$jr_mt_path = plugin_dir_path( __FILE__ );
|
48 |
+
/**
|
49 |
+
* Return Plugin's full directory path with trailing slash
|
50 |
+
*
|
51 |
+
* Local XAMPP install might return:
|
52 |
+
* C:\xampp\htdocs\wpbeta\wp-content\plugins\jonradio-multiple-themes/
|
53 |
+
*
|
54 |
+
*/
|
55 |
+
function jr_mt_path() {
|
56 |
+
global $jr_mt_path;
|
57 |
+
return $jr_mt_path;
|
58 |
+
}
|
59 |
+
|
60 |
+
global $jr_mt_plugin_basename;
|
61 |
+
$jr_mt_plugin_basename = plugin_basename( __FILE__ );
|
62 |
+
/**
|
63 |
+
* Return Plugin's Basename
|
64 |
+
*
|
65 |
+
* For this plugin, it would be:
|
66 |
+
* jonradio-multiple-themes/jonradio-multiple-themes.php
|
67 |
+
*
|
68 |
+
*/
|
69 |
+
function jr_mt_plugin_basename() {
|
70 |
+
global $jr_mt_plugin_basename;
|
71 |
+
return $jr_mt_plugin_basename;
|
72 |
+
}
|
73 |
+
|
74 |
+
if ( !function_exists( 'get_plugin_data' ) ) {
|
75 |
+
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
|
76 |
+
}
|
77 |
+
|
78 |
+
global $jr_mt_plugin_data;
|
79 |
+
$jr_mt_plugin_data = get_plugin_data( __FILE__ );
|
80 |
+
$jr_mt_plugin_data['slug'] = basename( dirname( __FILE__ ) );
|
81 |
+
|
82 |
+
global $jr_mt_options_cache;
|
83 |
+
$all_options = wp_load_alloptions();
|
84 |
+
$jr_mt_options_cache['stylesheet'] = $all_options['stylesheet'];
|
85 |
+
$jr_mt_options_cache['template'] = $all_options['template'];
|
86 |
+
|
87 |
+
/* Detect initial activation or a change in plugin's Version number
|
88 |
+
|
89 |
+
Sometimes special processing is required when the plugin is updated to a new version of the plugin.
|
90 |
+
Also used in place of standard activation and new site creation exits provided by WordPress.
|
91 |
+
Once that is complete, update the Version number in the plugin's Network-wide settings.
|
92 |
+
*/
|
93 |
+
|
94 |
+
if ( ( FALSE === ( $internal_settings = get_option( 'jr_mt_internal_settings' ) ) )
|
95 |
+
|| empty( $internal_settings['version'] ) )
|
96 |
+
{
|
97 |
+
/* Plugin is either:
|
98 |
+
- updated from a version so old that Version was not yet stored in the plugin's settings, or
|
99 |
+
- first use after install:
|
100 |
+
- first time ever installed, or
|
101 |
+
- installed previously and properly uninstalled (data deleted)
|
102 |
+
*/
|
103 |
+
|
104 |
+
$old_version = '0.1';
|
105 |
+
} else {
|
106 |
+
$old_version = $internal_settings['version'];
|
107 |
+
}
|
108 |
+
|
109 |
+
$settings = get_option( 'jr_mt_settings' );
|
110 |
+
if ( empty( $settings ) ) {
|
111 |
+
$settings = array(
|
112 |
+
'all_pages' => '',
|
113 |
+
'all_posts' => '',
|
114 |
+
'site_home' => '',
|
115 |
+
'current' => '',
|
116 |
+
'query' => array(),
|
117 |
+
'ids' => array()
|
118 |
+
);
|
119 |
+
/* Add if Settings don't exist, re-initialize if they were empty.
|
120 |
+
*/
|
121 |
+
update_option( 'jr_mt_settings', $settings );
|
122 |
+
/* New install on this site, very old version or corrupt settings
|
123 |
+
*/
|
124 |
+
$old_version = $jr_mt_plugin_data['Version'];
|
125 |
+
}
|
126 |
+
|
127 |
+
require_once( jr_mt_path() . 'includes/functions.php' );
|
128 |
+
|
129 |
+
if ( version_compare( $old_version, $jr_mt_plugin_data['Version'], '!=' ) ) {
|
130 |
+
if ( isset( $settings['ids'] ) && is_array( $settings['ids'] ) ) {
|
131 |
+
$ids = $settings['ids'];
|
132 |
+
} else {
|
133 |
+
$ids = array();
|
134 |
+
}
|
135 |
+
/* Create, if internal settings do not exist; update if they do exist
|
136 |
+
*/
|
137 |
+
$internal_settings['version'] = $jr_mt_plugin_data['Version'];
|
138 |
+
update_option( 'jr_mt_internal_settings', $internal_settings );
|
139 |
+
|
140 |
+
/* Handle all Settings changes made in old plugin versions
|
141 |
+
*/
|
142 |
+
if ( version_compare( $old_version, '2.1', '<' ) ) {
|
143 |
+
unset( $settings['all_admin'] );
|
144 |
+
// Check for Site Home entry, remove it and set Site Home field
|
145 |
+
// And remove all Admin entries (no longer supported)
|
146 |
+
if ( isset( $ids[''] ) ) {
|
147 |
+
$settings['site_home'] = $ids['']['theme'];
|
148 |
+
unset( $ids[''] );
|
149 |
+
} else {
|
150 |
+
$settings['site_home'] = '';
|
151 |
+
}
|
152 |
+
foreach ( $ids as $key => $arr ) {
|
153 |
+
if ( $arr['type'] == 'admin' ) {
|
154 |
+
unset( $ids[$key] );
|
155 |
+
}
|
156 |
+
}
|
157 |
+
}
|
158 |
+
if ( version_compare( $old_version, '3.0', '<' ) ) {
|
159 |
+
foreach ( $ids as $key => $arr ) {
|
160 |
+
if ( strcasecmp( 'http', substr( $arr['rel_url'], 0, 4 ) ) == 0 ) {
|
161 |
+
unset( $ids[$key] );
|
162 |
+
}
|
163 |
+
}
|
164 |
+
}
|
165 |
+
if ( version_compare( $old_version, '4.1', '<' ) ) {
|
166 |
+
// Replace %hex with real character to support languages like Chinese
|
167 |
+
foreach ( $ids as $key => $arr ) {
|
168 |
+
$newkey = rawurldecode( $key );
|
169 |
+
$newarr = $arr;
|
170 |
+
unset( $ids[$key] );
|
171 |
+
$newarr['page_url'] = rawurldecode( $newarr['page_url'] );
|
172 |
+
$newarr['rel_url'] = rawurldecode( $newarr['rel_url'] );
|
173 |
+
$newarr['url'] = rawurldecode( $newarr['url'] );
|
174 |
+
$ids[$newkey] = $newarr;
|
175 |
+
}
|
176 |
+
}
|
177 |
+
if ( version_compare( $old_version, '4.1.2', '<' ) ) {
|
178 |
+
// Add new Current Theme override option
|
179 |
+
$settings['current'] = '';
|
180 |
+
}
|
181 |
+
if ( version_compare( $old_version, '4.6', '<' ) ) {
|
182 |
+
// Add new Query Keyword override option
|
183 |
+
$settings['query'] = array();
|
184 |
+
}
|
185 |
+
if ( version_compare( $old_version, '4.7', '<' ) ) {
|
186 |
+
/* Change the format of the Query array
|
187 |
+
*/
|
188 |
+
$query = array();
|
189 |
+
foreach ( $settings['query'] as $number => $keyword_array ) {
|
190 |
+
foreach ( $keyword_array as $keyword => $theme ) {
|
191 |
+
$query[ jr_mt_prep_query_keyword( $keyword ) ]['*'] = $theme;
|
192 |
+
}
|
193 |
+
}
|
194 |
+
$settings['query'] = $query;
|
195 |
+
}
|
196 |
+
|
197 |
+
$settings['ids'] = $ids;
|
198 |
+
update_option( 'jr_mt_settings', $settings );
|
199 |
+
}
|
200 |
+
|
201 |
+
if ( is_admin() ) {
|
202 |
+
// Admin panel
|
203 |
+
require_once( jr_mt_path() . 'includes/admin.php' );
|
204 |
+
} else {
|
205 |
+
// Setting of Blank uses WordPress Current Theme value
|
206 |
+
if ( trim( $settings['current'] ) ) {
|
207 |
+
$jr_mt_options_cache['stylesheet'] = $settings['current'];
|
208 |
+
$jr_mt_options_cache['template'] = $settings['current'];
|
209 |
+
}
|
210 |
+
require_once( jr_mt_path() . 'includes/select-theme.php' );
|
211 |
+
}
|
212 |
+
}
|
213 |
+
|
214 |
+
/* Settings structure:
|
215 |
+
code - get_option( 'jr_mt_settings' )
|
216 |
+
['all_pages'] => zero length string or folder in Themes directory containing theme to use for All Pages
|
217 |
+
['all_posts'] => zero length string or folder in Themes directory containing theme to use for All Posts
|
218 |
+
['site_home'] => zero length string or folder in Themes directory containing theme to use for Home Page
|
219 |
+
['current'] => zero length string or folder in Themes directory containing theme to override WordPress Current Theme
|
220 |
+
['ids']
|
221 |
+
[id] - zero length string or WordPress ID of Page, Post, etc.
|
222 |
+
['type'] => 'page' or 'post' or 'admin' or 'cat' or 'archive' or 'prefix' or other
|
223 |
+
['theme'] => folder in Themes directory containing theme to use
|
224 |
+
['id'] => FALSE or WordPress ID of Page, Post, etc.
|
225 |
+
['page_url'] => relative URL WordPress page, post, admin, etc. or FALSE
|
226 |
+
['rel_url'] => URL relative to WordPress home
|
227 |
+
['url'] => original full URL, from Settings page entry by user
|
228 |
+
*/
|
229 |
+
|
230 |
+
/*
|
231 |
+
Research Notes:
|
232 |
+
The first time one of these Filter Hooks fires, pre_option_stylesheet and pre_option_template, only the following functions can be used to help determine "where" you are in the site:
|
233 |
+
- is_admin()
|
234 |
+
- is_user_logged_in()
|
235 |
+
- get_option("page_on_front") - ID of home page; zero if Reading Settings NOT set to a Static Page of a WordPress Page
|
236 |
+
*/
|
237 |
+
|
238 |
+
?>
|
readme.txt
ADDED
@@ -0,0 +1,395 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
=== jonradio Multiple Themes ===
|
2 |
+
Contributors: dgewirtz
|
3 |
+
Donate link: http://zatzlabs.com/plugins/
|
4 |
+
Tags: themes, theme, sections, style, template, stylesheet, accessibility
|
5 |
+
Requires at least: 3.4
|
6 |
+
Tested up to: 3.9
|
7 |
+
Stable tag: 4.9
|
8 |
+
License: GPLv2 or later
|
9 |
+
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
+
|
11 |
+
Select different Themes for one or more, or all WordPress Pages, Posts or other non-Admin pages. Or Site Home.
|
12 |
+
|
13 |
+
== Description ==
|
14 |
+
|
15 |
+
Allows the Administrator to specify which Theme will be used on specific Pages, Posts, other non-Admin pages (such as Category or Archive pages) or Site Home. A Prefix feature allows a Theme to be selected based on the initial characters of its URL ("Prefix URL"), an Asterisk ("*") can be used to match all subdirectories at a specific level in the directory/folder hierarchy, and a Query Keyword feature allows a Theme to be selected whenever a specified ?keyword= or &keyword= is found in the URL. A Theme can also be specified for All Pages, All Posts or Everywhere. In turn, even when a Theme is specified for All Pages, All Posts or Everywhere, a different Theme can still be specified for specific Pages or Posts.
|
16 |
+
|
17 |
+
Think what you could do if you could easily use more than one Theme on your WordPress web site or blog:
|
18 |
+
|
19 |
+
* Divide your site into Sections, each with its own unique look
|
20 |
+
* Style individual Pages, Posts, or other elements (Site Home, Category main page, Archive main page) with a different Theme
|
21 |
+
* Select a unique Theme for all Pages, Posts, Attachments, Category pages or Archive pages
|
22 |
+
* Make slight variations to a Theme, using Child Themes, for one or more Pages, Posts or other elements (Site Home, Category main page, Archive main page)
|
23 |
+
* Supports Multiple Stylesheets for Accessibility and other purposes (create one Child Theme for each Stylesheet)
|
24 |
+
* Test a new Theme on one or more Pages or Posts
|
25 |
+
* Convert to a new Theme a Page or Post at a time
|
26 |
+
* Host multiple mini-web sites on your WordPress site, each with a different Theme
|
27 |
+
* When a larger version of an image attachment is displayed, for example, when clicking on a gallery image thumbnail, use a different theme to display it, for one or all images attached to a Page or Post
|
28 |
+
|
29 |
+
**Use with Paid Themes**: Some Paid Themes do not work with this plugin. See the FAQ tab for more information and alternatives.
|
30 |
+
|
31 |
+
**Use with other Plugins**: **BuddyPress**, **Polylang** and **Theme Test Drive** plugins must all be Deactivated when jonradio Multiple Themes is Activated
|
32 |
+
|
33 |
+
**Changing Theme Options (Widgets, Sidebars, Menus, Templates, Background, Header, etc.)?**: See the FAQ (Frequently-Asked Questions) tab for important information on changing Options on Themes other than the Current Theme.
|
34 |
+
|
35 |
+
To select all Pages, Posts, Archives, Categories, etc. that begin with the same partial URL, a "Prefix URL" can be specified by selecting the Prefix checkbox when creating an entry on the Settings page for the jonradio Multiple Themes plugin. Restriction: the Prefix URL cannot contain all or part of a Query, which is the portion of a URL that begins with a question mark ("?"). Although the Prefix cannot contain a Query, URLs containing a Query will be matched by the Prefix.
|
36 |
+
|
37 |
+
To select any URL on the site that contains a specified Query Keyword ("?keyword=" or "&keyword=") or Query Keyword=Value combination ("?keyword=value" or "&keyword=value"), a "Query Keyword" entry can be created.
|
38 |
+
|
39 |
+
Normally, if a Theme is not specified for a Page, Post, Site Home or other WordPress-displayed web page, such as Category or Archive display, the **Current Theme** specified in **Appearance-Themes** on the Admin panels will be used. The plugin has an Advanced Setting "Select Theme for Everything" that can be used to define a default Theme for the plugin to use instead of the WordPress Current Theme. This is useful for a Theme that has many frequently-used options that are much easier to access when it is the WordPress Current Theme, but there is another Theme to be used everywhere except for a few select Pages or Posts.
|
40 |
+
|
41 |
+
When selecting a Theme for Site Home or all or specific Pages, Posts or other non-Admin pages, the Theme must be shown in the list of Available Themes on the Appearance-Themes Admin panel. If necessary, install the Theme. In a WordPress Network (AKA Multisite), Themes must be **Network Enabled** before they will appear as Available Themes on individual sites' Appearance-Themes panel.
|
42 |
+
|
43 |
+
I hesitate to use the term **Theme Switcher** to describe this plugin, because the term has so many meanings. The jonradio Multiple Themes plugin does **not** alter the standard WordPress options that define what Theme is used on your WordPress site. Instead, it dynamically (and selectively) overrides that choice. Technical details aside, what this means is that deactivating or deleting the jonradio Multiple Themes plugin will instantly revert to the WordPress Current Theme that you have defined through the standard WordPress Appearance-Themes Admin panel.
|
44 |
+
|
45 |
+
== Installation ==
|
46 |
+
|
47 |
+
This section describes how to install the *jonradio Multiple Themes* plugin and get it working.
|
48 |
+
|
49 |
+
1. Use **Add Plugin** within the WordPress Admin panel to download and install this *jonradio Multiple Themes* plugin from the WordPress.org plugin repository (preferred method). Or download and unzip this plugin, then upload the `/jonradio-multiple-themes/` directory to your WordPress web site's `/wp-content/plugins/` directory.
|
50 |
+
1. Activate the *jonradio Multiple Themes* plugin through the **Installed Plugins** Admin panel in WordPress. If you have a WordPress Network ("Multisite"), you can either **Network Activate** this plugin through the **Installed Plugins** Network Admin panel, or Activate it individually on the sites where you wish to use it. Activating on individual sites within a Network avoids some of the confusion created by WordPress' hiding of Network Activated plugins on the Plugin menu of individual sites. Alternatively, to avoid this confusion, you can install the *jonradio Reveal Network Activated Plugins* plugin.
|
51 |
+
1. Be sure that all Themes you plan to use have been installed and are listed under Available Themes on the WordPress Appearance-Themes Admin panel. In a WordPress Network ("Multisite"), Themes must be **Network Enabled** before they will appear as Available Themes on individual sites' Appearance-Themes panel.
|
52 |
+
1. Select Themes to be used on the plugin's **Multiple Themes plugin** Settings page in the WordPress Admin panels, which is found in both the **Appearance** and **Settings** sections. You can also get to this Settings page by clicking on the **Settings** link for this plugin on the **Installed Plugins** page of the Admin panel.
|
53 |
+
1. If you need to change Theme Options (Widgets, Sidebars, Menus, Templates, Background, Header, etc.) for any Theme *other than* the Current Theme, see the FAQ (Frequently-Asked Questions) tab for important information.
|
54 |
+
|
55 |
+
== Frequently Asked Questions ==
|
56 |
+
|
57 |
+
= What if my Themes or other plugins don't seem to be working with the jonradio Multiple Themes plugin? =
|
58 |
+
|
59 |
+
Please ask before giving up. Either by [posting a Support question](http://wordpress.org/support/plugin/jonradio-multiple-themes "Support Forum") or contacting us directly by filling out this [Contact Form (click here)](http://zatzlabs.com/contact-us/ "Contact Form").
|
60 |
+
|
61 |
+
If we cannot solve the problem, please consider using a WordPress Network. One install of WordPress allows you to have multiple separate Sites ("MultiSite"), each with a different Theme, without using the jonradio Multiple Themes plugin. The sites can look to the outside world as if they are just one web site by using the Sub-directories option. For example, Site 1 would be at example.com, and Site 2 could be at example.com/forum.
|
62 |
+
|
63 |
+
= What if a Theme has a lot of Options that I need to change frequently? =
|
64 |
+
|
65 |
+
You will probably want to make it the WordPress Current Theme defined in the Appearance-Themes admin panel,
|
66 |
+
so that you will have instant access to the Theme's many Options, especially if the Theme has its own Section(s) of the Admin panel menu.
|
67 |
+
|
68 |
+
The plugin's Advanced Setting **Select Theme for Everything** can be used to select another Theme to be used everywhere except for the specific Page(s) or Post(s) where you wish the WordPress Current Theme to appear.
|
69 |
+
|
70 |
+
= Will this plugin work with Paid Themes? =
|
71 |
+
|
72 |
+
Some do, some do not; unfortunately, there are a growing number of newer Paid Themes that incorporate so many WordPress Hooks that it is not feasible for this plugin to handle them all. But we have only tested the few Paid Themes whose authors have provided us with permission to use, without charge, their themes for test purposes. Elegant, for example, allows us to accept copies of its Themes provided by its customers who require assistance with the jonradio Multiple Themes plugin. On the other hand, some other Paid Theme authors have simply ignored our requests, despite our stated willingness to sign a non-disclosure agreement.
|
73 |
+
|
74 |
+
We do encourage you to contact us if you run into problems when using the jonradio Multiple Themes plugin with a Paid Theme, as the problem may not be unique to the Paid Theme.
|
75 |
+
|
76 |
+
To state the obvious, the cost of purchasing a license for all Paid Themes for testing purposes is prohibitive for an Open Source plugin such as this one.
|
77 |
+
|
78 |
+
= How do I change the Theme Options (Widgets, Sidebars, Menus, Background, Header, etc.) used for each Theme? =
|
79 |
+
|
80 |
+
**NOTE**: See the next FAQ for information on Templates.
|
81 |
+
|
82 |
+
For the Current Theme, nothing changes when using the jonradio Multiple Themes plugin. Options for the Current Theme, including Widgets, Sidebars, Menus, Background, Header and other Customizations supported by the Theme, can be modified in the Admin panel using the Appearance menu items on the left sidebar and the Customize link displayed beside the Current Theme on the Manage Themes tab of Appearance-Themes.
|
83 |
+
|
84 |
+
It is more difficult to modify Options for Active Themes that are *not* the Current Theme. We hope to build this functionality into the jonradio Multiple Themes plugin in a future Version, but it is not clear just how practical that is, so the best that can be said is: Maybe.
|
85 |
+
|
86 |
+
For now, there are two approaches. Except for Widgets, the first approach is the most likely to give you success. Menus, on the other hand, really work well with the first approach, and are severely restricted with the second method.
|
87 |
+
|
88 |
+
**WARNING**: So far, we have not received any reports of, nor have we tested, using both Method #1 and #2 on the same WordPress site. Use Caution if you plan to do so, as we cannot predict the results.
|
89 |
+
|
90 |
+
**Method #1:**
|
91 |
+
|
92 |
+
Set the Theme Options with Live Preview.
|
93 |
+
|
94 |
+
Note: Widgets cannot be placed using this Method.
|
95 |
+
|
96 |
+
1. Go to Appearance-Themes-Live Preview in the Admin panels.
|
97 |
+
1. Use the right sidebar to modify the Theme Options. Note that "Navigation" will not appear until a Custom Menu has been defined in Appearance-Menus. Navigation-Primary Navigation is where you would set the custom menu to be used for the Theme you are currently previewing.
|
98 |
+
1. Click the Save & Activate button.
|
99 |
+
1. Go immediately to Appearance-Themes to reactivate the Current Theme.
|
100 |
+
|
101 |
+
**Method #2:**
|
102 |
+
|
103 |
+
Use the Theme Test Drive plugin.
|
104 |
+
|
105 |
+
Note: this approach only allows Menus to be set for one Theme. Using this method to assign one or more menus to a Theme will unassign menus for all other Themes.
|
106 |
+
|
107 |
+
The jonradio Multiple Themes plugin (i.e. - this plugin) must be Deactivated, and the Theme Test Drive plugin installed and activated, so that each Theme can be selected with the Theme Test Drive plugin, allowing the Theme's Options to be set "as if" it were the Current Theme.
|
108 |
+
|
109 |
+
1. Deactivate jonradio Multiple Themes
|
110 |
+
1. Install the Theme Test Drive plugin found at http://wordpress.org/extend/plugins/theme-test-drive/
|
111 |
+
1. Activate the Theme Test Drive plugin
|
112 |
+
1. Go to Appearance-Theme Test Drive
|
113 |
+
1. In the Usage section, select an alternate Theme you will be using with jonradio Multiple Themes
|
114 |
+
1. Push the Enable Theme Drive button at the bottom
|
115 |
+
1. Go to the WordPress Admin panel's Appearance menu (left sidebar)
|
116 |
+
1. Make your changes to the Theme Options, including Widgets, Sidebars, Menus (see note above about Menus), Background, Header and other Customizations for this alternate Theme (which will appear as if it were the Current Theme)
|
117 |
+
1. If you have more than one alternate Theme with Options you wish to change, repeat Steps 4-8 for each alternate Theme
|
118 |
+
1. Deactivate the Theme Test Drive plugin
|
119 |
+
1. Activate jonradio Multiple Themes
|
120 |
+
1. Changes to the Options for the Current Theme can now be made normally, just as you would without either plugin
|
121 |
+
1. Both the alternate and Current Themes should now display all Theme options properly when selected through the jonradio Multiple Themes plugin
|
122 |
+
|
123 |
+
= How do I change the Template for a specific Page or Post? =
|
124 |
+
|
125 |
+
For the Current Theme, nothing changes when using the jonradio Multiple Themes plugin. Select an alternate Template from the drop-down list in the Template field of the Page Attributes section of the Add New Page, Edit Page, Add New Post or Edit Post page of the Admin panels. Or the Template field in Quick Edit.
|
126 |
+
|
127 |
+
It is more difficult to change Templates for Pages or Posts defined with the jonradio Multiple Themes plugin to use Active Themes that are *not* the Current Theme. We hope to build this functionality into the jonradio Multiple Themes plugin in a future Version.
|
128 |
+
|
129 |
+
Use the Theme Test Drive plugin. The jonradio Multiple Themes plugin (i.e. - this plugin) must be Deactivated, and the Theme Test Drive plugin installed and activated, so that each Theme can be selected with the Theme Test Drive plugin, allowing the Theme's Template to be set for each Page or Post using that Theme "as if" it were the Current Theme.
|
130 |
+
|
131 |
+
1. Deactivate jonradio Multiple Themes
|
132 |
+
1. Install the Theme Test Drive plugin found at http://wordpress.org/extend/plugins/theme-test-drive/
|
133 |
+
1. Activate the Theme Test Drive plugin
|
134 |
+
1. Go to Appearance-Theme Test Drive
|
135 |
+
1. In the Usage section, select an alternate Theme you will be using with jonradio Multiple Themes
|
136 |
+
1. Push the Enable Theme Drive button at the bottom
|
137 |
+
1. Go to the WordPress Admin panel's Page or Post menu (left sidebar)
|
138 |
+
1. Make your changes to the Template field of each Page and/or Post that has been selected for this alternate Theme AND requires a non-default Template
|
139 |
+
1. If you have more than one alternate Theme with Templates you wish to change, repeat Steps 4-8 for each alternate Theme
|
140 |
+
1. Deactivate the Theme Test Drive plugin
|
141 |
+
1. Activate jonradio Multiple Themes
|
142 |
+
1. Changes to the Templates for Pages and Posts using the Current Theme can now be made normally, just as you would without either plugin
|
143 |
+
1. Both the alternate and Current Themes should now display all Templates properly when selected through the jonradio Multiple Themes plugin
|
144 |
+
|
145 |
+
= How do I select a Theme for a Category of Posts? =
|
146 |
+
|
147 |
+
That functionality, to directly specify a Theme for a Category on the Settings page, is being investigated for a future version of the jonradio Multiple Themes plugin. But there is already a solution based on Permalinks:
|
148 |
+
|
149 |
+
1. In the WordPress Admin panels, go to Settings-Permalinks
|
150 |
+
1. Specify a Permalinks structure that begins with /%category%/
|
151 |
+
1. Push the Save Changes button
|
152 |
+
1. Go to Settings-Multiple Themes plugin
|
153 |
+
1. In the Section "For An Individual Page, Post or other non-Admin page", select the Theme for the Category of Posts
|
154 |
+
1. Enter the URL of the Categories page, e.g. - http://domain.com/news/
|
155 |
+
1. Click the checkbox "Select here if URL is a Prefix"
|
156 |
+
1. Push the Save Changes button
|
157 |
+
|
158 |
+
= How do I Edit a Theme? =
|
159 |
+
|
160 |
+
WordPress includes a built-in Theme Editor. Select Editor in the Admin panel's Appearance menu items on the left sidebar.
|
161 |
+
|
162 |
+
By default, the style.css file of the Current Theme is displayed. You can edit other Themes by selecting them in the "Select theme to edit" field and clicking the Select button.
|
163 |
+
|
164 |
+
Alternatively, you can edit any Theme on your own computer. If your computer runs Windows, NotePad++ and FileZilla run very well together, using FileZilla's View/Edit feature to provide a Theme Editor with syntax highlighting and other advanced features.
|
165 |
+
|
166 |
+
If one or more of the Active Themes have their own Theme Editor or other type of Theme Options panels, such as Elegant's epanel, please read the next FAQ.
|
167 |
+
|
168 |
+
= How do I use Elegant's epanel? =
|
169 |
+
|
170 |
+
Nothing changes for the Current Theme. epanel can be accessed just as it would be without the jonradio Multiple Themes plugin, simply by selecting the WordPress Admin panel's Appearance submenu item titled Theme Options preceded by the name of your Elegant Theme.
|
171 |
+
|
172 |
+
To make changes to other Active Themes that you will be specifying with the jonradio Multiple Themes plugin:
|
173 |
+
|
174 |
+
1. Deactivate jonradio Multiple Themes
|
175 |
+
1. Install the Theme Test Drive plugin found at http://wordpress.org/extend/plugins/theme-test-drive/
|
176 |
+
1. Activate the Theme Test Drive plugin
|
177 |
+
1. Go to Appearance-Theme Test Drive
|
178 |
+
1. In the Usage section, select an alternate Theme you will be using with jonradio Multiple Themes
|
179 |
+
1. Push the Enable Theme Drive button at the bottom
|
180 |
+
1. Click on the Appearance menu item on the left sidebar of the WordPress Admin panel to refresh the submenu
|
181 |
+
1. Click on the submenu item titled with your Elegant theme's name followed by "Theme Options"
|
182 |
+
1. Elegant's epanel will now appear
|
183 |
+
1. Make all the changes for this Theme, being sure to push the Save button
|
184 |
+
1. If you have more than one alternate Theme with Options you wish to change, repeat Steps 4-10 for each alternate Theme
|
185 |
+
1. Deactivate the Theme Test Drive plugin
|
186 |
+
1. Activate jonradio Multiple Themes
|
187 |
+
1. Changes to the Options for the Current Theme can now be made normally, just as you would without either plugin
|
188 |
+
1. Both the alternate and Current Themes should now display all Theme options properly when selected through the jonradio Multiple Themes plugin
|
189 |
+
|
190 |
+
Thanks to Elegant for allowing us to test copies of any of their Themes provided by their customers.
|
191 |
+
|
192 |
+
= What happens when I change Permalinks? =
|
193 |
+
|
194 |
+
For entries you have created for individual Pages and Posts with the jonradio Multiple Themes plugin, you can subsequently change your Permalink structure or you can change the Permalink of a Page or Post, without having to change the plugin's entry. However, for other pages, such as Categories or Archives, you will have to delete your old entries and create new ones with the jonradio Multiple Themes plugin.
|
195 |
+
|
196 |
+
= I added a new entry but why doesn't it appear in the list of entries? =
|
197 |
+
|
198 |
+
If you add an entry that already exists, it merely replaces the previous entry.
|
199 |
+
|
200 |
+
= How can I change the Theme for an entry? =
|
201 |
+
|
202 |
+
Simply add the entry again, with the new Theme. It will replace the previous entry.
|
203 |
+
|
204 |
+
== Screenshots ==
|
205 |
+
|
206 |
+
1. Plugin's Admin Page
|
207 |
+
|
208 |
+
== Changelog ==
|
209 |
+
|
210 |
+
= 4.9 =
|
211 |
+
* Add an Asterisk ("*") to match any Subdirectory at a given level of the File Hierarchy, as another form of the Prefix URL option
|
212 |
+
* Reorganize Settings page
|
213 |
+
|
214 |
+
= 4.8 =
|
215 |
+
* Delay intercept of get_options 'stylesheet' and 'template' until 'plugins_loaded' (NextGen Gallery conflict)
|
216 |
+
* Check for illegal characters in Keyword and Value of Query portion of URL in Settings fields
|
217 |
+
|
218 |
+
= 4.7.3 =
|
219 |
+
* Add support for dot in URL Queries (keyword or value) by replacing parse_str()
|
220 |
+
* Removed subfolder /includes/debug/
|
221 |
+
|
222 |
+
= 4.7.2 =
|
223 |
+
* Do not execute select-theme.php on Admin panels, to eliminate error message whenever any plugin is uninstalled
|
224 |
+
* Handle URL Query Keyword[]=Value
|
225 |
+
* Add Polylang to list of incompatible plugins
|
226 |
+
|
227 |
+
= 4.7.1 =
|
228 |
+
* Handle PHP without mbstring extension
|
229 |
+
|
230 |
+
= 4.7 =
|
231 |
+
* Add option to select a Theme based on Query Keyword and Value pair in URL
|
232 |
+
* Redesign how Query entries are stored
|
233 |
+
* Full testing completed with WordPress Version 3.8
|
234 |
+
|
235 |
+
= 4.6 =
|
236 |
+
* Add option to select a Theme based on Query Keyword in URL
|
237 |
+
* Rearrange Settings page
|
238 |
+
|
239 |
+
= 4.5.2 =
|
240 |
+
* Eliminate Fatal Error if php zip_open() function is not available, when readme.txt is out of date
|
241 |
+
|
242 |
+
= 4.5.1 =
|
243 |
+
* Remove %E2%80%8E suffix from URLs being entered
|
244 |
+
|
245 |
+
= 4.5 =
|
246 |
+
* Check with get_page_by_path() and get_posts( array( 'name' => $page_url ) ) if url_to_postid() fails to find URL input
|
247 |
+
|
248 |
+
= 4.4 =
|
249 |
+
* Rewrite Plugin's handling of its own version number to fix issues when new sites are activated in a Network and plugin is Network-Activated
|
250 |
+
* Prevent Fatal Error for Versions of WordPress before 3.4, and Deactivate Plugin instead, because plugin requires at least 3.4 to function
|
251 |
+
* Security: require "switch_themes" Capability rather than "manage_options" Capability to access plugin's Settings page
|
252 |
+
|
253 |
+
= 4.3 =
|
254 |
+
* Add SSL support so that visitors can view the WordPress site with https:// URLs and Site URL can be https://
|
255 |
+
|
256 |
+
= 4.2 =
|
257 |
+
* Add option to override WordPress Current Theme
|
258 |
+
* Security enhancements to eliminate direct execution of .php files
|
259 |
+
|
260 |
+
= 4.1.1 =
|
261 |
+
* Handle situations where readme.txt file in plugin's directory cannot be read or written
|
262 |
+
|
263 |
+
= 4.1 =
|
264 |
+
* Support for non-alphanumeric characters in URLs, e.g. - languages using characters not in the English alphabet
|
265 |
+
* Support for Live Search feature of KnowHow Theme
|
266 |
+
* Display errors, not settings, on plugin's Admin page for activated BuddyPress or Theme Test Drive plugins, or old versions of WordPress
|
267 |
+
* Add error checking/messages and diagnostic information to plugin's Admin page
|
268 |
+
|
269 |
+
= 4.0.2 =
|
270 |
+
* Prevent Warning and Notice by initializing global $wp
|
271 |
+
|
272 |
+
= 4.0.1 =
|
273 |
+
* Prevent Fatal Error by initializing global $wp_rewrite
|
274 |
+
|
275 |
+
= 4 =
|
276 |
+
* Discovered url_to_postid() function, to address situations where Slug differed from Permalink, such as Posts with Year/Month folders
|
277 |
+
|
278 |
+
= 3.3.1 =
|
279 |
+
* Fix White Screen of Death on a Page selected by plugin
|
280 |
+
|
281 |
+
= 3.3 =
|
282 |
+
* Support Child Themes and any other situation where stylesheet and template names are not the same
|
283 |
+
|
284 |
+
= 3.2 =
|
285 |
+
* Correct Problem with P2 Theme, and its logged on verification at wp-admin/admin-ajax.php?p2ajax=true&action=logged_in_out&_loggedin={nonce}
|
286 |
+
* Add "Settings Saved" message to Admin page
|
287 |
+
* Tested with WordPress Version 3.5 beta
|
288 |
+
|
289 |
+
= 3.1 =
|
290 |
+
* Add Support for Prefixes, where all URLs beginning with the specified characters ("Prefix") can be assigned to a specified Theme
|
291 |
+
|
292 |
+
= 3.0 =
|
293 |
+
* Add Support for Categories and Archives when no Permalinks exist (support already existed Categories and Archives with Permalinks)
|
294 |
+
* Resolve several minor bugs
|
295 |
+
|
296 |
+
= 2.9 =
|
297 |
+
* Rewrite much of the Settings page and Plugin Directory documentation
|
298 |
+
* Add Support for IIS which returns incorrect values in $_SERVER['REQUEST_URI']
|
299 |
+
* Make it easier to select the Theme for the Site Home by providing a new Settings field
|
300 |
+
* Remove ability to set Theme for Admin pages since no known Theme provides Admin templates, and because the previous implementation sometimes displayed the incorrect Current Theme in Admin; this feature may be re-added in a future release, and could even be used to change Settings of Themes that are not currently the Current Theme
|
301 |
+
* Add version upgrade detection to add, remove and update Settings fields
|
302 |
+
* Move Settings link on Plugins page from beginning to end of links
|
303 |
+
|
304 |
+
= 2.0 =
|
305 |
+
* Address pecularities of wp_make_link_relative() related to root-based WordPress sites using Permalinks
|
306 |
+
|
307 |
+
= 1.1 =
|
308 |
+
* Fix foreach failing on some systems, based on PHP warning level
|
309 |
+
|
310 |
+
= 1.0 =
|
311 |
+
* Make plugin conform to WordPress plugin repository standards.
|
312 |
+
* Beta testing completed.
|
313 |
+
|
314 |
+
== Upgrade Notice ==
|
315 |
+
|
316 |
+
= 4.9 =
|
317 |
+
Allow Prefix URLs to match all subdirectories with an Asterisk ("*")
|
318 |
+
|
319 |
+
= 4.8 =
|
320 |
+
Compatibility with NextGen Gallery plugin
|
321 |
+
|
322 |
+
= 4.7.3 =
|
323 |
+
Allow dots in URL Queries
|
324 |
+
|
325 |
+
= 4.7.2 =
|
326 |
+
Avoid Error Message during Uninstall of other Plugins
|
327 |
+
|
328 |
+
= 4.7.1 =
|
329 |
+
Avoid mb_ function errors for PHP without mbstring extension
|
330 |
+
|
331 |
+
= 4.7 =
|
332 |
+
Select Theme by Query Keyword/Value pair in URL
|
333 |
+
|
334 |
+
= 4.6 =
|
335 |
+
Select Theme by Query Keyword in URL
|
336 |
+
|
337 |
+
= 4.5.2 =
|
338 |
+
Fix zip_open Fatal Error
|
339 |
+
|
340 |
+
= 4.5.1 =
|
341 |
+
Fix %E2%80%8E suffix problem on input URLs
|
342 |
+
|
343 |
+
= 4.5 =
|
344 |
+
Handle URL input for non-standard Pages and Posts
|
345 |
+
|
346 |
+
= 4.4 =
|
347 |
+
Fix errors when new Network site created or old WordPress version used, and correct Setting page Permissions to "switch_themes"
|
348 |
+
|
349 |
+
= 4.3 =
|
350 |
+
Add SSL support for sites with https:// URLs
|
351 |
+
|
352 |
+
= 4.2 =
|
353 |
+
Add "Select Theme for Everything" feature and improve security
|
354 |
+
|
355 |
+
= 4.1.1 =
|
356 |
+
Resolve issues with readme.txt permissions introduced in Version 4.1's compatibility checking
|
357 |
+
|
358 |
+
= 4.1 =
|
359 |
+
Support non-English alphabet in URLs and Live Search feature in KnowHow Theme
|
360 |
+
|
361 |
+
= 4.0.2 =
|
362 |
+
Fix "Warning: in_array() expects parameter 2 to be array, null given in domain.com/wp-includes/rewrite.php on line 364"
|
363 |
+
|
364 |
+
= 4.0.1 =
|
365 |
+
Fix "Fatal error: Call to a member function wp_rewrite_rules() on a non-object in domain.com/wp-includes/rewrite.php on line 294"
|
366 |
+
|
367 |
+
= 4 =
|
368 |
+
Fix Posts not working in some Permalink setups, most notably Year/Month
|
369 |
+
|
370 |
+
= 3.3.1 =
|
371 |
+
Fix White Screen of Death on a Page, Post or other element selected by plugin
|
372 |
+
|
373 |
+
= 3.3 =
|
374 |
+
Remove Restriction that Stylesheet Name must match Template Name, which it does not with Child Themes
|
375 |
+
|
376 |
+
= 3.2 =
|
377 |
+
Add Support for P2 Theme and provide "Settings Saved" message
|
378 |
+
|
379 |
+
= 3.1 =
|
380 |
+
Allow Prefix URLs to be used to specify where a Theme will be displayed
|
381 |
+
|
382 |
+
= 3.0 =
|
383 |
+
Improve support for Categories and Archives, and eliminate all known bugs.
|
384 |
+
|
385 |
+
= 2.9 =
|
386 |
+
Improve Settings fields, correct display of wrong Current Theme in Appearance-Themes Admin panel, and add IIS Support.
|
387 |
+
|
388 |
+
= 2.0 =
|
389 |
+
Selecting Individual Pages and Posts on a WordPress site installed in the root and using Permalinks now works correctly.
|
390 |
+
|
391 |
+
= 1.1 =
|
392 |
+
Eliminate possibility of foreach error message if PHP warning level is set at a high level
|
393 |
+
|
394 |
+
= 1.0 =
|
395 |
+
Beta version 0.9 had not been tested when installed from the WordPress Plugin Repository
|
uninstall.php
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Ensure call comes from WordPress, not a hacker or anyone else trying direct access.
|
3 |
+
if ( !defined( 'WP_UNINSTALL_PLUGIN' ) )
|
4 |
+
exit ();
|
5 |
+
|
6 |
+
|
7 |
+
/* Remove any tables, options, and such created by this Plugin */
|
8 |
+
if ( function_exists('is_multisite') && is_multisite() ) {
|
9 |
+
global $wpdb, $site_id;
|
10 |
+
$blogs = $wpdb->get_results( "SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = $site_id" );
|
11 |
+
foreach ($blogs as $blog_obj) {
|
12 |
+
delete_blog_option( $blog_obj->blog_id, 'jr_mt_settings' );
|
13 |
+
delete_blog_option( $blog_obj->blog_id, 'jr_mt_internal_settings' );
|
14 |
+
}
|
15 |
+
} else {
|
16 |
+
delete_option( 'jr_mt_settings' );
|
17 |
+
delete_option( 'jr_mt_internal_settings' );
|
18 |
+
}
|
19 |
+
|
20 |
+
?>
|