WordPress.org

Make WordPress Core

Ticket #12414: dfcg-admin-metaboxes.php

File dfcg-admin-metaboxes.php, 8.4 KB (added by studiograsshopper, 4 years ago)

Sample code which shows problem in WP 3.0 alpha

Line 
1<?php
2/**
3* Functions for adding metaboxes to Post and Pages Write screen for display of custom fields
4*
5* @copyright Copyright 2008-2010  Ade WALKER  (email : info@studiograsshopper.ch)
6* @package dynamic_content_gallery
7* @version 3.2.2
8*
9* @since 3.2
10*/
11
12/* Prevent direct access to this file */
13if (!defined('ABSPATH')) {
14        exit("Sorry, you are not allowed to access this file directly.");
15}
16
17
18
19/**
20* Adds metaboxes to Post and Page screen
21*
22* Hooked to 'admin_menu'
23*
24* @global array $dfcg_options plugin options from db
25* @global array $dfcg_postmeta_upgrade plugin options from db
26* @since 3.2.1
27*/
28function dfcg_add_metabox() {
29
30        global $dfcg_options, $dfcg_postmeta_upgrade;
31       
32        if( $dfcg_options['populate-method'] == 'pages' && $dfcg_postmeta_upgrade['upgraded'] == 'completed' ) {
33       
34                add_meta_box( DFCG_FILE_HOOK . '_box', __( 'Dynamic Content Gallery', DFCG_DOMAIN ), 'dfcg_meta_box', 'page', 'side', 'low' );
35       
36        } elseif( $dfcg_options['populate-method'] !== 'pages' && $dfcg_postmeta_upgrade['upgraded'] == 'completed' ) {
37       
38                add_meta_box( DFCG_FILE_HOOK . '_box', __( 'Dynamic Content Gallery', DFCG_DOMAIN ), 'dfcg_meta_box', 'post', 'side', 'low' );
39        }
40}
41
42
43/**
44* Populates metaboxes in Post and Page screen
45*
46* Called by add_meta_box() in dfcg_add_metabox() function
47*
48* Note: Markup follows WP standards for Post/Page Editor sidebar
49*
50* @global array $dfcg_options plugin options from db
51* @param object $post object
52* @since 3.2.2
53*/
54function dfcg_meta_box($post) {
55
56        global $dfcg_options;
57       
58       
59        // Use nonce for verification
60        echo '<input type="hidden" name="dfcg_metabox_noncename" id="dfcg_metabox_noncename" value="' . 
61        wp_create_nonce( DFCG_FILE_HOOK ) . '" />';
62       
63       
64        // Actual content of metabox - same used for Post and Pages
65       
66        // Variables for use in the metabox
67        if( $dfcg_options['image-url-type'] == 'partial' ) {
68                $text = 'Partial URL';
69                $url = $dfcg_options['imageurl'];
70                if( $url == '' ) {
71                        $url = '<span style="color:#D53131;">Not defined. You must define this in the DCG Settings page.</span>';
72                }
73        } else {
74                $text = 'Full URL';
75                $url = 'not used';
76        }
77        ?>
78       
79<?php /* IMAGE BLOCK */ ?>
80        <div class="dfcg-form">
81                <h5><?php _e('Image URL', DFCG_DOMAIN); ?>:</h5>
82                <label class="screen-reader-text" for="_dfcg-image"><?php _e('Image URL', DFCG_DOMAIN); ?></label>
83                <textarea id="_dfcg-image" name="_dfcg-image" style="font-size:11px;" cols="38" rows="2"><?php echo get_post_meta($post->ID, '_dfcg-image', true); ?></textarea>
84                <p><em>You are using <?php echo $text; ?>.</em>
85                <?php if( $url !== 'not used' ) { ?>
86                        <br /><em>Images folder is: <?php echo $url; ?></em>
87                <?php } ?>
88                </p>
89        </div>
90       
91<?php /* DESC BLOCK */ ?>
92       
93        <?php if( $dfcg_options['desc-method'] == 'manual' ) : // Only show dfcg-desc if Slide Pane Description is manual ?>
94
95        <div class="dfcg-form">
96                <h5><?php _e('Slide Pane Description', DFCG_DOMAIN); ?>:</h5>
97                <label class="screen-reader-text" for="_dfcg-desc"><?php _e('Slide Pane Description', DFCG_DOMAIN); ?></label>
98                <textarea id="_dfcg-desc" name="_dfcg-desc" style="font-size:11px;" cols="38" rows="4"><?php echo get_post_meta($post->ID, '_dfcg-desc', true); ?></textarea>
99        </div>
100       
101        <?php else : // Slide Pane Description is Auto ?>
102               
103        <div class="dfcg-form">
104                <h5><?php _e('Slide Pane Description', DFCG_DOMAIN); ?>:</h5>
105                <p><em><?php _e('You are currently using', DFCG_DOMAIN); ?> <a href="<?php echo 'admin.php?page=' . DFCG_FILE_HOOK; ?>"><?php _e('Auto', DFCG_DOMAIN); ?></a> <?php _e('Slide Pane descriptions', DFCG_DOMAIN); ?>.</em></p>
106                <input id="_dfcg-desc" name="_dfcg-desc" type="hidden" value="<?php echo get_post_meta($post->ID, '_dfcg-desc', true); ?>" />
107        </div>
108        <?php endif; ?>
109       
110<?php /* EXTERNAL LINK BLOCK */ ?>
111
112        <div class="dfcg-form">
113                <h5><?php _e('External link for image', DFCG_DOMAIN ); ?>:</h5>
114                <label class="screen-reader-text" for="_dfcg-link"><?php _e('External link for image', DFCG_DOMAIN ); ?></label>
115                <input id="_dfcg-link" name="_dfcg-link" style="font-size:11px;" size="41" type="text" value="<?php echo get_post_meta($post->ID, '_dfcg-link', true); ?>" />
116        </div>
117       
118<?php /* PAGES SORT ORDER BLOCK */ ?>
119
120        <?php if( $dfcg_options['populate-method'] == 'pages' && $dfcg_options['pages-sort-control'] == 'true' ) : ?>
121        <div class="dfcg-form">
122                <h5><?php _e('Sort Order', DFCG_DOMAIN); ?>:</h5>
123                <label class="screen-reader-text" for="_dfcg-sort"><?php _e('Sort Order', DFCG_DOMAIN); ?></label>
124                <input name="_dfcg-sort" id="_dfcg-sort" size="3" type="text" value="<?php echo get_post_meta($post->ID, '_dfcg-sort', true); ?>" />
125                <p><em><?php _e('By default, Pages are arranged in the DCG in page/post ID number order. You can override this here by specifying a sort order.', DFCG_DOMAIN); ?></em></p>
126        </div>
127        <?php else : ?>
128                <input id="_dfcg-sort" name="_dfcg-sort" type="hidden" value="<?php echo get_post_meta($post->ID, '_dfcg-sort', true); ?>" />
129        <?php endif; ?>
130       
131<?php /* EXCLUDE POST BLOCK */ ?>
132       
133        <?php // Only show Exclude option for multi-option and one-category
134        if( $dfcg_options['populate-method'] !== 'pages' ) {
135                $exclude = false;
136                if( get_post_meta($post->ID,'_dfcg-exclude',true) == 'true' ) {
137                        $exclude = true;
138                } else {
139                        $exclude = false;
140                }
141        ?>
142        <div class="dfcg-form">
143                <h5><?php _e('Exclude from gallery?', DFCG_DOMAIN); ?></h5>
144                <input type="checkbox" id="_dfcg-exclude" name="_dfcg-exclude" <?php checked($exclude); ?> />
145                <label for="_dfcg-exclude" style="font-size:10px;">&nbsp;<?php _e('Check to exclude', DFCG_DOMAIN ); ?></label>
146        </div>
147<?php
148        }
149}
150
151
152/**
153* Saves data added/edited in metaboxes in Post and Page screen
154*
155* Hooked to 'save_post'
156*
157* Adapted from Write Panel plugin by Nathan Rice
158*
159* @param mixed $post_id Post ID
160* @param object $post object
161* @since 3.2.1
162*/
163function dfcg_save_metabox_data($post_id, $post) {
164       
165        // Check referrer is from DCG metabox
166        if ( !wp_verify_nonce( $_POST['dfcg_metabox_noncename'], DFCG_FILE_HOOK )) {
167        return $post->ID;
168        }
169
170        // Is the user allowed to edit the post or page?
171        if ( 'page' == $_POST['post_type'] ) {
172                if ( !current_user_can( 'edit_page', $post->ID ))
173                return $post->ID;
174        } else {
175                if ( !current_user_can( 'edit_post', $post->ID ))
176                return $post->ID;
177        }
178
179        // Build array from $_POST data
180        $newdata['_dfcg-image'] = $_POST['_dfcg-image'];
181        $newdata['_dfcg-desc'] = $_POST['_dfcg-desc'];
182        $newdata['_dfcg-link'] = $_POST['_dfcg-link'];
183        $newdata['_dfcg-sort'] = $_POST['_dfcg-sort'];
184       
185        if( isset( $_POST['_dfcg-exclude'] ) ) {
186                $newdata['_dfcg-exclude'] = $_POST['_dfcg-exclude'];
187        } else {
188                $newdata['_dfcg-exclude'] = false;
189        }
190       
191       
192        /* Sanitise data */
193       
194        // trim whitespace - all options
195        foreach( $newdata as $key => $value ) {
196                $input[$key] = trim($value);
197        }
198       
199       
200        // Deal with Image (could be partial or full)
201        $newdata['_dfcg-image'] = esc_attr( $newdata['_dfcg-image'] );
202        // If we are using Partial URL, check if first character in string is a /
203        if( substr( $newdata['_dfcg-image'], 0, 1 ) == '/' ) {
204                // Remove leading slash
205                $newdata['_dfcg-image'] = substr( $newdata['_dfcg-image'], 1 );
206        }
207       
208        // Deal with URLs
209        $newdata['_dfcg-link'] = esc_url_raw( $newdata['_dfcg-link'] );
210       
211       
212        // Deal with Description
213        $allowed_html = array( 'a' => array('href' => array(),'title' => array() ), 'br' => array(), 'em' => array(), 'strong' => array() );
214        $allowed_protocols = array( 'http', 'https', 'mailto', 'feed' );
215       
216        $newdata['_dfcg-desc'] = wp_kses( $newdata['_dfcg-desc'], $allowed_html, $allowed_protocols );
217       
218       
219        // Deal with Sort Order
220        $newdata['_dfcg-sort'] = substr( $newdata['_dfcg-sort'], 0, 4 );
221        $newdata['_dfcg-sort'] = esc_attr($newdata['_dfcg-sort']);
222       
223       
224        // Deal with checkbox - we don't want to save this postmeta if _dfcg-exclude is not true
225        $newdata['_dfcg-exclude'] = $newdata['_dfcg-exclude'] ? 'true' : NULL;
226       
227       
228        // Add values of $newdata as custom fields
229       
230        foreach ($newdata as $key => $value) {
231               
232                if( $post->post_type == 'revision' ) return; //don't store custom data twice
233               
234                $value = implode(',', (array)$value); //if $value is an array, make it a CSV (unlikely)
235               
236                if(get_post_meta($post->ID, $key, FALSE)) { //if the custom field already has a value
237                        update_post_meta($post->ID, $key, $value);
238                } else { //if the custom field doesn't have a value
239                        add_post_meta($post->ID, $key, $value);
240                }
241               
242                if(!$value) delete_post_meta($post->ID, $key); //delete if any are blank, eg _dfcg-exclude is NULL
243        }
244}