Version Description
Download this release
Release Info
Developer | simonwheatley |
Plugin | Custom Post Template |
Version | 0.92b |
Comparing to | |
See all releases |
Code changes from version 0.91b to 0.92b
- custom-post-templates.php +5 -2
- readme.txt +11 -1
- trunk/custom-post-templates.php +149 -0
- trunk/plugin.php +676 -0
- trunk/readme.txt +78 -0
- trunk/view/admin/select_post_template.php +22 -0
- view/admin/select_post_template.php +1 -0
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: 0.
|
8 |
Author URI: http://simonwheatley.co.uk/wordpress/
|
9 |
*/
|
10 |
|
@@ -35,11 +35,14 @@ require_once( dirname (__FILE__) . '/plugin.php' );
|
|
35 |
**/
|
36 |
class CustomPostTemplates extends CustomPostTemplates_Plugin
|
37 |
{
|
38 |
-
private $tpl_meta_key
|
39 |
private $post_ID;
|
40 |
|
41 |
function __construct()
|
42 |
{
|
|
|
|
|
|
|
43 |
$this->register_plugin ( 'post-templates', __FILE__ );
|
44 |
$this->add_meta_box( 'select_post_template', __('Post Template'), 'select_post_template', 'post', 'normal', 'core' );
|
45 |
$this->add_action( 'save_post' );
|
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: 0.92b
|
8 |
Author URI: http://simonwheatley.co.uk/wordpress/
|
9 |
*/
|
10 |
|
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', 'normal', 'core' );
|
48 |
$this->add_action( 'save_post' );
|
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.6
|
6 |
Tested up to: 2.7-beta3
|
7 |
-
Stable tag: 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 |
|
@@ -61,6 +61,16 @@ Right, that's it. Grump over. ;)
|
|
61 |
* BUGFIX: The plugin was breaking posts using the "default" template, this is now fixed. Apologies for the inconvenience.
|
62 |
* Tested up to WordPress 2.7-beta3-9922
|
63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
== Frequently Asked Questions ==
|
65 |
|
66 |
= 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> =
|
4 |
Tags: post, template, theme
|
5 |
Requires at least: 2.6
|
6 |
Tested up to: 2.7-beta3
|
7 |
+
Stable tag: 0.92b
|
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 |
|
61 |
* BUGFIX: The plugin was breaking posts using the "default" template, this is now fixed. Apologies for the inconvenience.
|
62 |
* Tested up to WordPress 2.7-beta3-9922
|
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* Tested up to WordPress 2.7-beta3-9922
|
68 |
+
|
69 |
+
= v0.92b 2008/12/04 =
|
70 |
+
|
71 |
+
* Code tweaks
|
72 |
+
* Blocked direct access to templates
|
73 |
+
|
74 |
== Frequently Asked Questions ==
|
75 |
|
76 |
= 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> =
|
trunk/custom-post-templates.php
ADDED
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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: 0.92b
|
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', 'normal', 'core' );
|
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( 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 |
+
}
|
135 |
+
}
|
136 |
+
|
137 |
+
return $page_templates;
|
138 |
+
}
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Instantiate the plugin
|
143 |
+
*
|
144 |
+
* @global
|
145 |
+
**/
|
146 |
+
|
147 |
+
$CustomPostTemplates = new CustomPostTemplates();
|
148 |
+
|
149 |
+
?>
|
trunk/plugin.php
ADDED
@@ -0,0 +1,676 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 © 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><p>You processed <?php echo $items ?> items</p></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', '&', str_replace ('&', '&', $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
ADDED
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.6
|
6 |
+
Tested up to: 2.7-beta3
|
7 |
+
Stable tag: 0.92b
|
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 |
+
= v0.9b 2008/11/26 =
|
56 |
+
|
57 |
+
* Plugin first released
|
58 |
+
|
59 |
+
= v0.91b 2008/11/28 =
|
60 |
+
|
61 |
+
* BUGFIX: The plugin was breaking posts using the "default" template, this is now fixed. Apologies for the inconvenience.
|
62 |
+
* Tested up to WordPress 2.7-beta3-9922
|
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* Tested up to WordPress 2.7-beta3-9922
|
68 |
+
|
69 |
+
= v0.92b 2008/12/04 =
|
70 |
+
|
71 |
+
* Minor code tweaks
|
72 |
+
* Blocked direct access to templates
|
73 |
+
|
74 |
+
== Frequently Asked Questions ==
|
75 |
+
|
76 |
+
= 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> =
|
77 |
+
|
78 |
+
This is because your server is running PHP4. Please see "Other Notes > PHP4" for more information.
|
trunk/view/admin/select_post_template.php
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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’ll see them above.' ); ?></p>
|
view/admin/select_post_template.php
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
<label class="hidden" for="page_template"><?php _e( 'Post Template' ); ?></label>
|
2 |
<input type="hidden" name="custom_post_template_present" value="1" />
|
3 |
<select name="custom_post_template" id="custom_post_template">
|
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">
|