ktschanz ktschanz - 3 months ago 15
PHP Question

Using the value of a checkbox from a wordpress metabox

I'm trying to disable the wpautop filter on pages where the metabox checkbox is selected.

Here is the code to add my checkbox, I know it's a bit verbose but it was originally taken from an example with multiple elements to add. I'm planning on editing it later.

$prefix = 'dbkt_';

$meta_box = array(
'id' => 'my-meta-box',
'title' => 'Disable Automatic formatting?',
'page' => 'page',
'context' => 'normal',
'priority' => 'high',
'fields' => array(
array(
'name' => 'Disable wpautop?',
'id' => $prefix . 'checkbox',
'type' => 'checkbox'
)
)
);

add_action('admin_menu', 'mytheme_add_box');

// Add meta box
function mytheme_add_box() {
global $meta_box;

add_meta_box($meta_box['id'], $meta_box['title'], 'mytheme_show_box', $meta_box['page'], $meta_box['context'], $meta_box['priority']);
}



// Callback function to show fields in meta box
function mytheme_show_box() {
global $meta_box, $post;

// Use nonce for verification
echo '<input type="hidden" name="mytheme_meta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />';

echo '<table class="form-table">';

foreach ($meta_box['fields'] as $field) {
// get current post meta data
$meta = get_post_meta($post->ID, $field['id'], true);

echo '<tr>',
'<th style="width:20%"><label for="', $field['id'], '">', $field['name'], '</label></th>',
'<td>';
switch ($field['type']) {
case 'text':
echo '<input type="text" name="', $field['id'], '" id="', $field['id'], '" value="', $meta ? $meta : $field['std'], '" size="30" style="width:97%" />', '<br />', $field['desc'];
break;
case 'textarea':
echo '<textarea name="', $field['id'], '" id="', $field['id'], '" cols="60" rows="4" style="width:97%">', $meta ? $meta : $field['std'], '</textarea>', '<br />', $field['desc'];
break;
case 'select':
echo '<select name="', $field['id'], '" id="', $field['id'], '">';
foreach ($field['options'] as $option) {
echo '<option ', $meta == $option ? ' selected="selected"' : '', '>', $option, '</option>';
}
echo '</select>';
break;
case 'radio':
foreach ($field['options'] as $option) {
echo '<input type="radio" name="', $field['id'], '" value="', $option['value'], '"', $meta == $option['value'] ? ' checked="checked"' : '', ' />', $option['name'];
}
break;
case 'checkbox':
echo '<input type="checkbox" name="', $field['id'], '" id="', $field['id'], '"', $meta ? ' checked="checked"' : '', ' />';
break;
}
echo '</td><td>',
'</td></tr>';
}

echo '</table>';
}


add_action('save_post', 'mytheme_save_data');

// Save data from meta box
function mytheme_save_data($post_id) {
global $meta_box;

// verify nonce
if (!wp_verify_nonce($_POST['mytheme_meta_box_nonce'], basename(__FILE__))) {
return $post_id;
}

// check autosave
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id;
}

// check permissions
if ('page' == $_POST['post_type']) {
if (!current_user_can('edit_page', $post_id)) {
return $post_id;
}
} elseif (!current_user_can('edit_post', $post_id)) {
return $post_id;
}

foreach ($meta_box['fields'] as $field) {
$old = get_post_meta($post_id, $field['id'], true);
$new = $_POST[$field['id']];

if ($new && $new != $old) {
update_post_meta($post_id, $field['id'], $new);
} elseif ('' == $new && $old) {
delete_post_meta($post_id, $field['id'], $old);
}
}
}


That is all working fine, the checkbox is added to the edit page where I want it, and it's state is saved correctly. The part I'm having issues with is actually getting the value of the checkbox and disabling wpautop based on this value.

Here is my (not working) code for disabling the filter based on the checkbox:

$is_checked = get_post_meta( $post->ID, 'my-meta-box', true );

if($is_checked){
remove_filter( 'the_content', 'wpautop' );
remove_filter( 'the_excerpt', 'wpautop' );
}


I'm really new to PHP and web programming in general so I'm having a really hard time trying to figure out how to debug my code. Is there an equivalent to a console I can print to in PHP? What is the general process to debug my code while working in a wordpress development environment?

Answer

Turns out I needed to wrap the check in a function & use an action call. Something about the order that the php is ran vs the value of the checkbox is recieved? If someone can explain why I had to do it this way that would be awesome.

Here is the working code:

add_action('template_redirect','my_function');
function my_function(){
  $is_checked = get_post_meta( get_the_ID(), 'dbkt_checkbox', true );
  if($is_checked) {
      remove_filter( 'the_content', 'wpautop' );
      remove_filter( 'the_excerpt', 'wpautop' );
}
}