Custom Post Template - Version 1.1

Version Description

Download this release

Release Info

Developer simonwheatley
Plugin Icon wp plugin Custom Post Template
Version 1.1
Comparing to
See all releases

Code changes from version 1.0 to 1.1

custom-post-templates.php CHANGED
@@ -4,7 +4,7 @@ Plugin Name: Custom Post Templates
4
  Plugin URI: http://wordpress.org/extend/plugins/custom-post-template/
5
  Description: Provides a drop-down to select different templates for posts from the post edit screen. The templates are defined similarly to page templates, and will replace single.php for the specified post.
6
  Author: Simon Wheatley
7
- Version: 1.0
8
  Author URI: http://simonwheatley.co.uk/wordpress/
9
  */
10
 
@@ -44,7 +44,7 @@ class CustomPostTemplates extends CustomPostTemplates_Plugin
44
  $this->tpl_meta_key = 'custom_post_template';
45
  // Init hooks and all that
46
  $this->register_plugin ( 'post-templates', __FILE__ );
47
- $this->add_meta_box( 'select_post_template', __('Post Template'), 'select_post_template', 'post', 'normal', 'core' );
48
  $this->add_action( 'save_post' );
49
  $this->add_filter( 'single_template', 'filter_single_template' );
50
  }
@@ -107,9 +107,7 @@ class CustomPostTemplates extends CustomPostTemplates_Plugin
107
 
108
  protected function get_custom_post_template()
109
  {
110
- $custom_template = get_post_meta( $this->post_ID, $this->tpl_meta_key );
111
- // Seems to come out as an array. Irritating.
112
- if ( is_array( $custom_template ) ) $custom_template = $custom_template[ 0 ];
113
  return $custom_template;
114
  }
115
 
@@ -123,12 +121,12 @@ class CustomPostTemplates extends CustomPostTemplates_Plugin
123
 
124
  if ( is_array( $templates ) ) {
125
  foreach ( $templates as $template ) {
126
- $template_data = implode( '', file( WP_CONTENT_DIR . $template ) );
 
 
 
127
 
128
- preg_match( '|Template Name Posts:(.*)$|mi', $template_data, $name );
129
- if ( empty( $name ) ) continue;
130
-
131
- $name = $name[ 1 ];
132
 
133
  $page_templates[ trim( $name ) ] = basename( $template );
134
  }
4
  Plugin URI: http://wordpress.org/extend/plugins/custom-post-template/
5
  Description: Provides a drop-down to select different templates for posts from the post edit screen. The templates are defined similarly to page templates, and will replace single.php for the specified post.
6
  Author: Simon Wheatley
7
+ Version: 1.1
8
  Author URI: http://simonwheatley.co.uk/wordpress/
9
  */
10
 
44
  $this->tpl_meta_key = 'custom_post_template';
45
  // Init hooks and all that
46
  $this->register_plugin ( 'post-templates', __FILE__ );
47
+ $this->add_meta_box( 'select_post_template', __('Post Template'), 'select_post_template', 'post', 'side', 'default' );
48
  $this->add_action( 'save_post' );
49
  $this->add_filter( 'single_template', 'filter_single_template' );
50
  }
107
 
108
  protected function get_custom_post_template()
109
  {
110
+ $custom_template = get_post_meta( $this->post_ID, $this->tpl_meta_key, true );
 
 
111
  return $custom_template;
112
  }
113
 
121
 
122
  if ( is_array( $templates ) ) {
123
  foreach ( $templates as $template ) {
124
+ // Get the file data and collapse it into a single string
125
+ $template_data = implode( '', file( $template ) );
126
+ if ( ! preg_match( '|Template Name Posts:(.*)$|mi', $template_data, $name ) )
127
+ continue;
128
 
129
+ $name = _cleanup_header_comment( $name[ 1 ] );
 
 
 
130
 
131
  $page_templates[ trim( $name ) ] = basename( $template );
132
  }
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: http://www.simonwheatley.co.uk/wordpress/
4
  Tags: post, template, theme
5
  Requires at least: 2.9
6
  Tested up to: 2.9.1
7
- Stable tag: 1.0
8
 
9
  Provides a drop-down to select different templates for posts from the post edit screen. The templates replace single.php for the specified post.
10
 
@@ -52,7 +52,11 @@ Right, that's it. Grump over. ;)
52
 
53
  == Change Log ==
54
 
55
- = v1b 2010/01/15 =
 
 
 
 
56
 
57
  * BUGFIX: Theme templates now come with a complete filepath, so no need to add WP_CONTENT_DIR constant to the beginning.
58
  * ENHANCEMENT: Metabox now shows up on the side, under the publish box... where you'd expect.
4
  Tags: post, template, theme
5
  Requires at least: 2.9
6
  Tested up to: 2.9.1
7
+ Stable tag: 1.1
8
 
9
  Provides a drop-down to select different templates for posts from the post edit screen. The templates replace single.php for the specified post.
10
 
52
 
53
  == Change Log ==
54
 
55
+ = v1.1 2010/01/27 =
56
+
57
+ * IDIOTFIX: Managed to revert to an old version somehow, this version should fix that.
58
+
59
+ = v1 2010/01/15 (released 2010/01/26) =
60
 
61
  * BUGFIX: Theme templates now come with a complete filepath, so no need to add WP_CONTENT_DIR constant to the beginning.
62
  * ENHANCEMENT: Metabox now shows up on the side, under the publish box... where you'd expect.
trunk/custom-post-templates.php DELETED
@@ -1,148 +0,0 @@
1
- <?php
2
- /*
3
- Plugin Name: Custom Post Templates
4
- Plugin URI: http://wordpress.org/extend/plugins/custom-post-template/
5
- Description: Provides a drop-down to select different templates for posts from the post edit screen. The templates are defined similarly to page templates, and will replace single.php for the specified post.
6
- Author: Simon Wheatley
7
- Version: 1.0
8
- Author URI: http://simonwheatley.co.uk/wordpress/
9
- */
10
-
11
- /* Copyright 2008 Simon Wheatley
12
-
13
- This program is free software; you can redistribute it and/or modify
14
- it under the terms of the GNU General Public License as published by
15
- the Free Software Foundation; either version 2 of the License, or
16
- (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26
-
27
- */
28
-
29
- require_once( dirname (__FILE__) . '/plugin.php' );
30
-
31
- /**
32
- *
33
- * @package default
34
- * @author Simon Wheatley
35
- **/
36
- class CustomPostTemplates extends CustomPostTemplates_Plugin
37
- {
38
- private $tpl_meta_key;
39
- private $post_ID;
40
-
41
- function __construct()
42
- {
43
- // Init properties
44
- $this->tpl_meta_key = 'custom_post_template';
45
- // Init hooks and all that
46
- $this->register_plugin ( 'post-templates', __FILE__ );
47
- $this->add_meta_box( 'select_post_template', __('Post Template'), 'select_post_template', 'post', 'side', 'default' );
48
- $this->add_action( 'save_post' );
49
- $this->add_filter( 'single_template', 'filter_single_template' );
50
- }
51
-
52
- /*
53
- * FILTERS & ACTIONS
54
- * *******************
55
- */
56
-
57
- public function select_post_template( $post )
58
- {
59
- $this->post_ID = $post->ID;
60
-
61
- $template_vars = array();
62
- $template_vars[ 'templates' ] = $this->get_post_templates();
63
- $template_vars[ 'custom_template' ] = $this->get_custom_post_template();
64
-
65
- // Render the template
66
- $this->render_admin ( 'select_post_template', $template_vars );
67
- }
68
-
69
- public function save_post( $post_ID )
70
- {
71
- $action_needed = (bool) @ $_POST[ 'custom_post_template_present' ];
72
- if ( ! $action_needed ) return;
73
-
74
- $this->post_ID = $post_ID;
75
-
76
- $template = (string) @ $_POST[ 'custom_post_template' ];
77
- $this->set_custom_post_template( $template );
78
- }
79
-
80
- public function filter_single_template( $template )
81
- {
82
- global $wp_query;
83
-
84
- $this->post_ID = $wp_query->post->ID;
85
-
86
- $template_file = $this->get_custom_post_template();
87
- $custom_template = TEMPLATEPATH . "/" . $template_file;
88
- // Check both the template file and the full path, otherwise you discover that the theme dir
89
- // exists (which is not surprising)
90
- if ( $template_file && file_exists( $custom_template ) ) return $custom_template;
91
-
92
- return $template;
93
- }
94
-
95
- /*
96
- * UTILITY METHODS
97
- * *****************
98
- */
99
-
100
- protected function set_custom_post_template( $template )
101
- {
102
- delete_post_meta( $this->post_ID, $this->tpl_meta_key );
103
- if ( ! $template || $template == 'default' ) return;
104
-
105
- add_post_meta( $this->post_ID, $this->tpl_meta_key, $template );
106
- }
107
-
108
- protected function get_custom_post_template()
109
- {
110
- $custom_template = get_post_meta( $this->post_ID, $this->tpl_meta_key );
111
- // Seems to come out as an array. Irritating.
112
- if ( is_array( $custom_template ) ) $custom_template = $custom_template[ 0 ];
113
- return $custom_template;
114
- }
115
-
116
- protected function get_post_templates()
117
- {
118
- $themes = get_themes();
119
- $theme = get_current_theme();
120
- $templates = $themes[ $theme ][ 'Template Files' ];
121
-
122
- $page_templates = array();
123
-
124
- if ( is_array( $templates ) ) {
125
- foreach ( $templates as $template ) {
126
- $template_data = implode( '', file( $template ) );
127
- preg_match( '|Template Name Posts:(.*)$|mi', $template_data, $name );
128
- if ( empty( $name ) ) continue;
129
-
130
- $name = $name[ 1 ];
131
-
132
- $page_templates[ trim( $name ) ] = basename( $template );
133
- }
134
- }
135
-
136
- return $page_templates;
137
- }
138
- }
139
-
140
- /**
141
- * Instantiate the plugin
142
- *
143
- * @global
144
- **/
145
-
146
- $CustomPostTemplates = new CustomPostTemplates();
147
-
148
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/plugin.php DELETED
@@ -1,676 +0,0 @@
1
- <?php
2
-
3
- // ======================================================================================
4
- // This library is free software; you can redistribute it and/or
5
- // modify it under the terms of the GNU Lesser General Public
6
- // License as published by the Free Software Foundation; either
7
- // version 2.1 of the License, or (at your option) any later version.
8
- //
9
- // This library is distributed in the hope that it will be useful,
10
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
- // Lesser General Public License for more details.
13
- // ======================================================================================
14
- // @author John Godley (http://urbangiraffe.com)
15
- // @version 0.1.25
16
- // @copyright Copyright &copy; 2007 John Godley, All Rights Reserved
17
- // ======================================================================================
18
- // 0.1.6 - Corrected WP locale functions
19
- // 0.1.7 - Add phpdoc comments
20
- // 0.1.8 - Support for Admin SSL
21
- // 0.1.9 - URL encoding, defer localization until init
22
- // 0.1.10 - Better URL encoding
23
- // 0.1.11 - Make work in WP 2.0, fix HTTPS issue on IIS
24
- // 0.1.12 - Activation/deactivation actions that take into account the directory
25
- // 0.1.13 - Add realpath function
26
- // 0.1.14 - Add select/checked functions, fix locale loader
27
- // 0.1.15 - Remove dependency on prototype
28
- // 0.1.16 - Add support for homedir in realpath
29
- // 0.1.17 - Added widget class
30
- // 0.1.18 - Expand checked function
31
- // 0.1.19 - Make url() cope with sites with no trailing slash
32
- // 0.1.20 - Change init function to prevent overloading
33
- // 0.1.21 - Make widget work for WP 2.1
34
- // 0.1.22 - Make select work with option groups, RSS compatability fix
35
- // 0.1.23 - Make widget count work better, fix widgets in K2
36
- // 0.1.24 - Make realpath better
37
- // 0.1.25 - Support for new WP2.6 config location
38
- // ======================================================================================
39
-
40
-
41
- /**
42
- * Wraps up several useful functions for WordPress plugins and provides a method to separate
43
- * display HTML from PHP code.
44
- *
45
- * <h4>Display Rendering</h4>
46
- * The class uses a similar technique to Ruby On Rails views, whereby the display HTML is kept
47
- * in a separate directory and file from the main code. A display is 'rendered' (sent to the browser)
48
- * or 'captured' (returned to the calling function).
49
- *
50
- * Template files are separated into two areas: admin and user. Admin templates are only for display in
51
- * the WordPress admin interface, while user templates are typically for display on the site (although neither
52
- * of these are enforced). All templates are PHP code, but are referred to without .php extension.
53
- *
54
- * The reason for this separation is that one golden rule of plugin creation is that someone will always want to change
55
- * the formatting and style of your output. Rather than forcing them to modify the plugin (bad), or modify files within
56
- * the plugin (equally bad), the class allows user templates to be overridden with files contained within the theme.
57
- *
58
- * An additional benefit is that it leads to code re-use, especially with regards to Ajax (i.e. your display code can be called from
59
- * many locations)
60
- *
61
- * Template files are located within the 'view' subdirectory of the plugins base (specified when registering the plugin):
62
- *
63
- * <pre>myplugin/view/admin
64
- * myplugin/view/myplugin</pre>
65
- *
66
- * Admin templates are contained within 'admin', and user templates are contained within a directory of the same name as the plugin.
67
- *
68
- * User files can be overridden within the theme by creating a similar directory structure:
69
- *
70
- * <pre>/themes/mytheme/view/myplugin</pre>
71
- *
72
- * The class will first look in the theme and then defaults to the plugin. A plugin should always provide default templates.
73
- *
74
- * <h4>Display Parameters</h4>
75
- * Also similar to Ruby On Rails, when you display a template you must supply the parameters that the template has access to. This tries
76
- * to ensure a very clean separation between code and display. Parameters are supplied as an associative array mapping variable name to variable value.
77
- *
78
- * For example,
79
- *
80
- * array ('message' => 'Your data was processed', 'items' => 103);
81
- *
82
- * <h4>How it works in practice</h4>
83
- * You create a template file to display how many items have been processed. You store this in 'view/admin/processed.php':
84
- *
85
- * <pre>&lt;p&gt;You processed &lt;?php echo $items ?&gt; items&lt;/p&gt;</pre>
86
- *
87
- * When you want to display this in your plugin you use:
88
- *
89
- * <pre> $this->render_admin ('processed', array ('items' => 100));
90
- *
91
- * @package WordPress base library
92
- * @author John Godley
93
- * @copyright Copyright (C) John Godley
94
- **/
95
-
96
- class CustomPostTemplates_Plugin
97
- {
98
- /**
99
- * Plugin name
100
- * @var string
101
- **/
102
- var $plugin_name;
103
-
104
- /**
105
- * Plugin 'view' directory
106
- * @var string Directory
107
- **/
108
- var $plugin_base;
109
-
110
-
111
- /**
112
- * Register your plugin with a name and base directory. This <strong>must</strong> be called once.
113
- *
114
- * @param string $name Name of your plugin. Is used to determine the plugin locale domain
115
- * @param string $base Directory containing the plugin's 'view' files.
116
- * @return void
117
- **/
118
-
119
- function register_plugin ($name, $base)
120
- {
121
- $this->plugin_base = rtrim (dirname ($base), '/');
122
- $this->plugin_name = $name;
123
-
124
- $this->add_action ('init', 'load_locale');
125
- }
126
-
127
- function load_locale ()
128
- {
129
- // Here we manually fudge the plugin locale as WP doesnt allow many options
130
- $locale = get_locale ();
131
- if ( empty($locale) )
132
- $locale = 'en_US';
133
-
134
- $mofile = dirname (__FILE__)."/locale/$locale.mo";
135
- load_textdomain ($this->plugin_name, $mofile);
136
- }
137
-
138
-
139
- /**
140
- * Register a WordPress action and map it back to the calling object
141
- *
142
- * @param string $action Name of the action
143
- * @param string $function Function name (optional)
144
- * @param int $priority WordPress priority (optional)
145
- * @param int $accepted_args Number of arguments the function accepts (optional)
146
- * @return void
147
- **/
148
-
149
- function add_action ($action, $function = '', $priority = 10, $accepted_args = 1)
150
- {
151
- add_action ($action, array (&$this, $function == '' ? $action : $function), $priority, $accepted_args);
152
- }
153
-
154
-
155
- /**
156
- * Register a WordPress filter and map it back to the calling object
157
- *
158
- * @param string $action Name of the action
159
- * @param string $function Function name (optional)
160
- * @param int $priority WordPress priority (optional)
161
- * @param int $accepted_args Number of arguments the function accepts (optional)
162
- * @return void
163
- **/
164
-
165
- function add_filter ($filter, $function = '', $priority = 10, $accepted_args = 1)
166
- {
167
- add_filter ($filter, array (&$this, $function == '' ? $filter : $function), $priority, $accepted_args);
168
- }
169
-
170
-
171
- /**
172
- * Register a WordPress meta box
173
- *
174
- * @param string $id ID for the box, also used as a function name if none is given
175
- * @param string $title Title for the box
176
- * @param int $page WordPress priority (optional)
177
- * @param string $function Function name (optional)
178
- * @param string $context e.g. 'advanced' or 'core' (optional)
179
- * @param int $priority Priority, rough effect on the ordering (optional)
180
- * @return void
181
- **/
182
-
183
- function add_meta_box($id, $title, $function = '', $page, $context = 'advanced', $priority = 'default')
184
- {
185
- require_once( ABSPATH . 'wp-admin/includes/template.php' );
186
- add_meta_box( $id, $title, array( &$this, $function == '' ? $id : $function ), $page, $context, $priority );
187
- }
188
-
189
- /**
190
- * Special activation function that takes into account the plugin directory
191
- *
192
- * @param string $pluginfile The plugin file location (i.e. __FILE__)
193
- * @param string $function Optional function name, or default to 'activate'
194
- * @return void
195
- **/
196
-
197
- function register_activation ($pluginfile, $function = '')
198
- {
199
- add_action ('activate_'.basename (dirname ($pluginfile)).'/'.basename ($pluginfile), array (&$this, $function == '' ? 'activate' : $function));
200
- }
201
-
202
-
203
- /**
204
- * Special deactivation function that takes into account the plugin directory
205
- *
206
- * @param string $pluginfile The plugin file location (i.e. __FILE__)
207
- * @param string $function Optional function name, or default to 'deactivate'
208
- * @return void
209
- **/
210
-
211
- function register_deactivation ($pluginfile, $function = '')
212
- {
213
- add_action ('deactivate_'.basename (dirname ($pluginfile)).'/'.basename ($pluginfile), array (&$this, $function == '' ? 'deactivate' : $function));
214
- }
215
-
216
-
217
- /**
218
- * Renders an admin section of display code
219
- *
220
- * @param string $ug_name Name of the admin file (without extension)
221
- * @param string $array Array of variable name=>value that is available to the display code (optional)
222
- * @return void
223
- **/
224
-
225
- function render_admin ($ug_name, $ug_vars = array ())
226
- {
227
- global $plugin_base;
228
- foreach ($ug_vars AS $key => $val)
229
- $$key = $val;
230
-
231
- if (file_exists ("{$this->plugin_base}/view/admin/$ug_name.php"))
232
- include ("{$this->plugin_base}/view/admin/$ug_name.php");
233
- else
234
- echo "<p>Rendering of admin template {$this->plugin_base}/view/admin/$ug_name.php failed</p>";
235
- }
236
-
237
-
238
- /**
239
- * Renders a section of user display code. The code is first checked for in the current theme display directory
240
- * before defaulting to the plugin
241
- *
242
- * @param string $ug_name Name of the admin file (without extension)
243
- * @param string $array Array of variable name=>value that is available to the display code (optional)
244
- * @return void
245
- **/
246
-
247
- function render ($ug_name, $ug_vars = array ())
248
- {
249
- foreach ($ug_vars AS $key => $val)
250
- $$key = $val;
251
-
252
- if (file_exists (TEMPLATEPATH."/view/{$this->plugin_name}/$ug_name.php"))
253
- include (TEMPLATEPATH."/view/{$this->plugin_name}/$ug_name.php");
254
- else if (file_exists ("{$this->plugin_base}/view/{$this->plugin_name}/$ug_name.php"))
255
- include ("{$this->plugin_base}/view/{$this->plugin_name}/$ug_name.php");
256
- else
257
- echo "<p>Rendering of template $ug_name.php failed</p>";
258
- }
259
-
260
-
261
- /**
262
- * Renders a section of user display code. The code is first checked for in the current theme display directory
263
- * before defaulting to the plugin
264
- *
265
- * @param string $ug_name Name of the admin file (without extension)
266
- * @param string $array Array of variable name=>value that is available to the display code (optional)
267
- * @return void
268
- **/
269
-
270
- function capture ($ug_name, $ug_vars = array ())
271
- {
272
- ob_start ();
273
- $this->render ($ug_name, $ug_vars);
274
- $output = ob_get_contents ();
275
- ob_end_clean ();
276
- return $output;
277
- }
278
-
279
-
280
- /**
281
- * Captures an admin section of display code
282
- *
283
- * @param string $ug_name Name of the admin file (without extension)
284
- * @param string $array Array of variable name=>value that is available to the display code (optional)
285
- * @return string Captured code
286
- **/
287
-
288
- function capture_admin ($ug_name, $ug_vars = array ())
289
- {
290
- ob_start ();
291
- $this->render_admin ($ug_name, $ug_vars);
292
- $output = ob_get_contents ();
293
- ob_end_clean ();
294
- return $output;
295
- }
296
-
297
-
298
- /**
299
- * Display a standard error message (using CSS ID 'message' and classes 'fade' and 'error)
300
- *
301
- * @param string $message Message to display
302
- * @return void
303
- **/
304
-
305
- function render_error ($message)
306
- {
307
- ?>
308
- <div class="fade error" id="message">
309
- <p><?php echo $message ?></p>
310
- </div>
311
- <?php
312
- }
313
-
314
-
315
- /**
316
- * Display a standard notice (using CSS ID 'message' and class 'updated').
317
- * Note that the notice can be made to automatically disappear, and can be removed
318
- * by clicking on it.
319
- *
320
- * @param string $message Message to display
321
- * @param int $timeout Number of seconds to automatically remove the message (optional)
322
- * @return void
323
- **/
324
-
325
- function render_message ($message, $timeout = 0)
326
- {
327
- ?>
328
- <div class="updated" id="message" onclick="this.parentNode.removeChild (this)">
329
- <p><?php echo $message ?></p>
330
- </div>
331
- <?php
332
- }
333
-
334
-
335
- /**
336
- * Get the plugin's base directory
337
- *
338
- * @return string Base directory
339
- **/
340
-
341
- function dir ()
342
- {
343
- return $this->plugin_base;
344
- }
345
-
346
-
347
- /**
348
- * Get a URL to the plugin. Useful for specifying JS and CSS files
349
- *
350
- * For example, <img src="<?php echo $this->url () ?>/myimage.png"/>
351
- *
352
- * @return string URL
353
- **/
354
-
355
- function url ($url = '')
356
- {
357
- if ($url)
358
- return str_replace ('\\', urlencode ('\\'), str_replace ('&amp;amp', '&amp;', str_replace ('&', '&amp;', $url)));
359
- else
360
- {
361
- $root = ABSPATH;
362
- if (defined ('WP_PLUGIN_DIR'))
363
- $root = WP_PLUGIN_DIR;
364
-
365
- $url = substr ($this->plugin_base, strlen ($this->realpath ($root)));
366
- if (DIRECTORY_SEPARATOR != '/')
367
- $url = str_replace (DIRECTORY_SEPARATOR, '/', $url);
368
-
369
- if (defined ('WP_PLUGIN_URL'))
370
- $url = WP_PLUGIN_URL.'/'.ltrim ($url, '/');
371
- else
372
- $url = get_bloginfo ('wpurl').'/'.ltrim ($url, '/');
373
-
374
- // Do an SSL check - only works on Apache
375
- global $is_IIS;
376
- if (isset ($_SERVER['HTTPS']) && !$is_IIS)
377
- $url = str_replace ('http://', 'https://', $url);
378
- }
379
- return $url;
380
- }
381
-
382
- /**
383
- * Performs a version update check using an RSS feed. The function ensures that the feed is only
384
- * hit once every given number of days, and the data is cached using the WordPress Magpie library
385
- *
386
- * @param string $url URL of the RSS feed
387
- * @param int $days Number of days before next check
388
- * @return string Text to display
389
- **/
390
-
391
- function version_update ($url, $days = 7)
392
- {
393
- if (!function_exists ('fetch_rss'))
394
- {
395
- if (!file_exists (ABSPATH.'wp-includes/rss.php'))
396
- return '';
397
- include (ABSPATH.'wp-includes/rss.php');
398
- }
399
-
400
- $now = time ();
401
-
402
- $checked = get_option ('plugin_urbangiraffe_rss');
403
-
404
- // Use built-in Magpie caching
405
- if (function_exists ('fetch_rss') && (!isset ($checked[$this->plugin_name]) || $now > $checked[$this->plugin_name] + ($days * 24 * 60 * 60)))
406
- {
407
- $rss = fetch_rss ($url);
408
- if (count ($rss->items) > 0)
409
- {
410
- foreach ($rss->items AS $pos => $item)
411
- {
412
- if (isset ($checked[$this->plugin_name]) && strtotime ($item['pubdate']) < $checked[$this->plugin_name])
413
- unset ($rss->items[$pos]);
414
- }
415
- }
416
-
417
- $checked[$this->plugin_name] = $now;
418
- update_option ('plugin_urbangiraffe_rss', $checked);
419
- return $rss;
420
- }
421
- }
422
-
423
-
424
- /**
425
- * Version of realpath that will work on systems without realpath
426
- *
427
- * @param string $path The path to canonicalize
428
- * @return string Canonicalized path
429
- **/
430
-
431
- function realpath ($path)
432
- {
433
- if (function_exists ('realpath'))
434
- return realpath ($path);
435
- else if (DIRECTORY_SEPARATOR == '/')
436
- {
437
- $path = preg_replace ('/^~/', $_SERVER['DOCUMENT_ROOT'], $path);
438
-
439
- // canonicalize
440
- $path = explode (DIRECTORY_SEPARATOR, $path);
441
- $newpath = array ();
442
- for ($i = 0; $i < sizeof ($path); $i++)
443
- {
444
- if ($path[$i] === '' || $path[$i] === '.')
445
- continue;
446
-
447
- if ($path[$i] === '..')
448
- {
449
- array_pop ($newpath);
450
- continue;
451
- }
452
-
453
- array_push ($newpath, $path[$i]);
454
- }
455
-
456
- $finalpath = DIRECTORY_SEPARATOR.implode (DIRECTORY_SEPARATOR, $newpath);
457
- return $finalpath;
458
- }
459
-
460
- return $path;
461
- }
462
-
463
-
464
- function checked ($item, $field = '')
465
- {
466
- if ($field && is_array ($item))
467
- {
468
- if (isset ($item[$field]) && $item[$field])
469
- echo ' checked="checked"';
470
- }
471
- else if (!empty ($item))
472
- echo ' checked="checked"';
473
- }
474
-
475
- function select ($items, $default = '')
476
- {
477
- if (count ($items) > 0)
478
- {
479
- foreach ($items AS $key => $value)
480
- {
481
- if (is_array ($value))
482
- {
483
- echo '<optgroup label="'.$key.'">';
484
- foreach ($value AS $sub => $subvalue)
485
- echo '<option value="'.$sub.'"'.($sub == $default ? ' selected="selected"' : '').'>'.$subvalue.'</option>';
486
- echo '</optgroup>';
487
- }
488
- else
489
- echo '<option value="'.$key.'"'.($key == $default ? ' selected="selected"' : '').'>'.$value.'</option>';
490
- }
491
- }
492
- }
493
- }
494
-
495
- if (!function_exists ('pr'))
496
- {
497
- function pr ($thing)
498
- {
499
- echo '<pre>';
500
- print_r ($thing);
501
- echo '</pre>';
502
- }
503
- }
504
-
505
- if (!class_exists ('Widget_SU'))
506
- {
507
- class Widget_SU
508
- {
509
- function Widget_SU ($name, $max = 1, $id = '', $args = '')
510
- {
511
- $this->name = $name;
512
- $this->id = $id;
513
- $this->widget_max = $max;
514
- $this->args = $args;
515
-
516
- if ($this->id == '')
517
- $this->id = strtolower (preg_replace ('/[^A-Za-z]/', '-', $this->name));
518
-
519
- $this->widget_available = 1;
520
- if ($this->widget_max > 1)
521
- {
522
- $this->widget_available = get_option ('widget_available_'.$this->id ());
523
- if ($this->widget_available === false)
524
- $this->widget_available = 1;
525
- }
526
-
527
- add_action ('init', array (&$this, 'initialize'));
528
- }
529
-
530
- function initialize ()
531
- {
532
- // Compatability functions for WP 2.1
533
- if (!function_exists ('wp_register_sidebar_widget'))
534
- {
535
- function wp_register_sidebar_widget ($id, $name, $output_callback, $classname = '')
536
- {
537
- register_sidebar_widget($name, $output_callback, $classname);
538
- }
539
- }
540
-
541
- if (!function_exists ('wp_register_widget_control'))
542
- {
543
- function wp_register_widget_control($name, $control_callback, $width = 300, $height = 200)
544
- {
545
- register_widget_control($name, $control_callback, $width, $height);
546
- }
547
- }
548
-
549
- if (function_exists ('wp_register_sidebar_widget'))
550
- {
551
- if ($this->widget_max > 1)
552
- {
553
- add_action ('sidebar_admin_setup', array (&$this, 'setup_save'));
554
- add_action ('sidebar_admin_page', array (&$this, 'setup_display'));
555
- }
556
-
557
- $this->load_widgets ();
558
- }
559
- }
560
-
561
- function load_widgets ()
562
- {
563
- for ($pos = 1; $pos <= $this->widget_max; $pos++)
564
- {
565
- wp_register_sidebar_widget ($this->id ($pos), $this->name ($pos), $pos <= $this->widget_available ? array (&$this, 'show_display') : '', $this->args (), $pos);
566
-
567
- if ($this->has_config ())
568
- wp_register_widget_control ($this->id ($pos), $this->name ($pos), $pos <= $this->widget_available ? array (&$this, 'show_config') : '', $this->args (), $pos);
569
- }
570
- }
571
-
572
- function args ()
573
- {
574
- if ($this->args)
575
- return $args;
576
- return array ('classname' => '');
577
- }
578
-
579
- function name ($pos)
580
- {
581
- if ($this->widget_available > 1)
582
- return $this->name.' ('.$pos.')';
583
- return $this->name;
584
- }
585
-
586
- function id ($pos = 0)
587
- {
588
- if ($pos == 0)
589
- return $this->id;
590
- return $this->id.'-'.$pos;
591
- }
592
-
593
- function show_display ($args, $number = 1)
594
- {
595
- $config = get_option ('widget_config_'.$this->id ($number));
596
- if ($config === false)
597
- $config = array ();
598
-
599
- $this->load ($config);
600
- $this->display ($args);
601
- }
602
-
603
- function show_config ($position)
604
- {
605
- if (isset ($_POST['widget_config_save_'.$this->id ($position)]))
606
- {
607
- $data = $_POST[$this->id ()];
608
- if (count ($data) > 0)
609
- {
610
- $newdata = array ();
611
- foreach ($data AS $item => $values)
612
- $newdata[$item] = $values[$position];
613
- $data = $newdata;
614
- }
615
-
616
- update_option ('widget_config_'.$this->id ($position), $this->save ($data));
617
- }
618
-
619
- $options = get_option ('widget_config_'.$this->id ($position));
620
- if ($options === false)
621
- $options = array ();
622
-
623
- $this->config ($options, $position);
624
- echo '<input type="hidden" name="widget_config_save_'.$this->id ($position).'" value="1" />';
625
- }
626
-
627
- function has_config () { return false; }
628
- function save ($data)
629
- {
630
- return array ();
631
- }
632
-
633
- function setup_save ()
634
- {
635
- if (isset ($_POST['widget_setup_save_'.$this->id ()]))
636
- {
637
- $this->widget_available = intval ($_POST['widget_setup_count_'.$this->id ()]);
638
- if ($this->widget_available < 1)
639
- $this->widget_available = 1;
640
- else if ($this->widget_available > $this->widget_max)
641
- $this->widget_available = $this->widget_max;
642
-
643
- update_option ('widget_available_'.$this->id (), $this->widget_available);
644
-
645
- $this->load_widgets ();
646
- }
647
- }
648
-
649
- function config_name ($field, $pos)
650
- {
651
- return $this->id ().'['.$field.']['.$pos.']';
652
- }
653
-
654
- function setup_display ()
655
- {
656
- ?>
657
- <div class="wrap">
658
- <form method="post">
659
- <h2><?php echo $this->name ?></h2>
660
- <p style="line-height: 30px;"><?php _e('How many widgets would you like?', $this->id); ?>
661
- <select name="widget_setup_count_<?php echo $this->id () ?>" value="<?php echo $options; ?>">
662
- <?php for ( $i = 1; $i <= $this->widget_max; ++$i ) : ?>
663
- <option value="<?php echo $i ?>"<?php if ($this->widget_available == $i) echo ' selected="selected"' ?>><?php echo $i ?></option>
664
- <?php endfor; ?>
665
- </select>
666
- <span class="submit">
667
- <input type="submit" name="widget_setup_save_<?php echo $this->id () ?>" value="<?php echo attribute_escape(__('Save', $this->id)); ?>" />
668
- </span>
669
- </p>
670
- </form>
671
- </div>
672
- <?php
673
- }
674
- }
675
- }
676
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/readme.txt DELETED
@@ -1,83 +0,0 @@
1
- === Custom Post Template ===
2
- Contributors: simonwheatley
3
- Donate link: http://www.simonwheatley.co.uk/wordpress/
4
- Tags: post, template, theme
5
- Requires at least: 2.9
6
- Tested up to: 2.9.1
7
- Stable tag: 1.0
8
-
9
- Provides a drop-down to select different templates for posts from the post edit screen. The templates replace single.php for the specified post.
10
-
11
- == Description ==
12
-
13
- **This plugin requires PHP5 (see Other Notes > PHP4 for more).**
14
-
15
- Provides a drop-down to select different templates for posts from the post edit screen. The templates are defined similarly to page templates, and will replace single.php for the specified post.
16
-
17
- Post templates, as far as this plugin is concerned, are configured similarly to [page templates](http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates) in that they have a particular style of PHP comment at the top of them. Each post template must contain the following, or similar, at the top:
18
- <code>
19
- <?php
20
- /*
21
- Template Name Posts: Snarfer
22
- */
23
- ?>
24
- </code>
25
-
26
- Note that *page* templates use "_Template Name:_", whereas *post* templates use "_Template Name Posts:_".
27
-
28
- Plugin initially produced on behalf of [Words & Pictures](http://www.wordsandpics.co.uk/).
29
-
30
- Is this plugin lacking a feature you want? I'm happy to discuss ideas, or to accept offers of feature sponsorship: [contact me](http://www.simonwheatley.co.uk/contact-me/) and we can have a chat.
31
-
32
- Any issues: [contact me](http://www.simonwheatley.co.uk/contact-me/).
33
-
34
- == Installation ==
35
-
36
- The plugin is simple to install:
37
-
38
- 1. Download the plugin, it will arrive as a zip file
39
- 1. Unzip it
40
- 1. Upload `custom-post-template` directory to your WordPress Plugin directory
41
- 1. Go to the plugin management page and enable the plugin
42
- 1. Upload your post template files (see the Description for details on configuring these), and choose them through the new menu
43
- 1. Give yourself a pat on the back
44
-
45
- == PHP4 ==
46
-
47
- Many of my plugin now require at least PHP5. I know that WordPress officially supports PHP4, but I don't. PHP4 is a mess and makes coding a lot less efficient, and when you're releasing stuff for free these things matter. PHP5 has been out for several years now and is fully production ready, as well as being naturally more secure and performant.
48
-
49
- If you're still running PHP4, I strongly suggest you talk to your hosting company about upgrading your servers. All reputable hosting companies should offer PHP5 as well as PHP4.
50
-
51
- Right, that's it. Grump over. ;)
52
-
53
- == Change Log ==
54
-
55
- = v1b 2010/01/15 =
56
-
57
- * BUGFIX: Theme templates now come with a complete filepath, so no need to add WP_CONTENT_DIR constant to the beginning.
58
- * ENHANCEMENT: Metabox now shows up on the side, under the publish box... where you'd expect.
59
-
60
- = v0.9b 2008/11/26 =
61
-
62
- * Plugin first released
63
-
64
- = v0.91b 2008/11/28 =
65
-
66
- * BUGFIX: The plugin was breaking posts using the "default" template, this is now fixed. Apologies for the inconvenience.
67
- * Tested up to WordPress 2.7-beta3-9922
68
-
69
- = v0.91b 2008/11/28 =
70
-
71
- * BUGFIX: The plugin was breaking posts using the "default" template, this is now fixed. Apologies for the inconvenience.
72
- * Tested up to WordPress 2.7-beta3-9922* Tested up to WordPress 2.7-beta3-9922
73
-
74
- = v0.92b 2008/12/04 =
75
-
76
- * Minor code tweaks
77
- * Blocked direct access to templates
78
-
79
- == Frequently Asked Questions ==
80
-
81
- = I get an error like this: <code>Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /web/wp-content/plugins/custom-post-template/custom-post-templates.php</code> =
82
-
83
- This is because your server is running PHP4. Please see "Other Notes > PHP4" for more information.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/view/admin/select_post_template.php DELETED
@@ -1,22 +0,0 @@
1
- <?php if (!defined ('ABSPATH')) die ('No direct access allowed'); ?>
2
- <label class="hidden" for="page_template"><?php _e( 'Post Template' ); ?></label>
3
- <input type="hidden" name="custom_post_template_present" value="1" />
4
- <select name="custom_post_template" id="custom_post_template">
5
- <option
6
- value='default'
7
- <?php
8
- if ( ! $custom_template ) {
9
- echo "selected='selected'";
10
- }
11
- ?>><?php _e( 'Default Template' ); ?></option>
12
- <?php foreach( $templates AS $name => $filename ) { ?>
13
- <option
14
- value='<?php echo $filename; ?>'
15
- <?php
16
- if ( $custom_template == $filename ) {
17
- echo "selected='selected'";
18
- }
19
- ?>><?php echo $name; ?></option>
20
- <?php } ?>
21
- </select>
22
- <p><?php _e( 'Some themes have custom templates you can use for certain posts that might have additional features or custom layouts. If so, you&#8217;ll see them above.' ); ?></p>