0

what I'm trying to do is add a new coloumn to Edit post page (done) and in that coloumn show data taken from a set of custom fields (partially done).

This is my code (I use it as a plugin so it simpler to modify it). It adds the metabox in posts so I can easily add custom fields.

<?php
// the plugin base directory
global $maismeta_base_dir;
$maismeta_base_dir = plugin_dir_url(__FILE__);

// Add the Meta Box
function add_custom_meta_box() {
    add_meta_box(
        'custom_meta_box', // $id
        'Impostazioni di ricerca', // $title 
        'show_custom_meta_box', // $callback
        'post', // $page
        'normal', // $context
        'high'); // $priority
}
add_action('add_meta_boxes', 'add_custom_meta_box');

// Field Array
$prefix = 'custom_';
$custom_meta_fields = array(
    array (
        'label' => __('Proprietario','maismeta'),
        'desc'  => __('Inserisci le informazioni sul proprietario.','maismeta'),
        'id'    => $prefix.'textarea_proprietario',
        'type'  => 'textarea',
    ),
    array (
        'label' => __('Sesso affittuario','maismeta'),
        'desc'  => __('Inserisci il sesso disponibile.','maismeta'),
        'id'    => $prefix.'checkbox_group_sesso',
        'type'  => 'checkbox_group',
        'options' => array (
            'Uomo' => array (
                'label' => __('Uomo','maismeta'),
                'value' => 'Uomo'
            ),
            'Donna' => array (
                'label' => __('Donna','maismeta'),
                'value' => 'Donna'
            ),
            'Altro' => array (
                'label' => __('Altro','maismeta'),
                'value' => 'Altro'
            )
        )
    ),
    array (
        'label' => __('Numero occupanti','maismeta'),
        'desc'  => __('Inserisci il numero degli occupanti.','maismeta'),
        'id'    => $prefix.'checkbox_group_occupanti',
        'type'  => 'checkbox_group',
        'options' => array (
            '1' => array (
                'label' => __('1','maismeta'),
                'value' => '1'
            ),
            '2' => array (
                'label' => __('2','maismeta'),
                'value' => '2'
            ),
            '3' => array (
                'label' => __('3','maismeta'),
                'value' => '3'
            ),
            '4' => array (
                'label' => __('4','maismeta'),
                'value' => '4'
            ),
            '5' => array (
                'label' => __('5','maismeta'),
                'value' => '5'
            ),
            '6' => array (
                'label' => __('6','maismeta'),
                'value' => '6'
            ),
            '7' => array (
                'label' => __('7','maismeta'),
                'value' => '7'
            ),
            '8' => array (
                'label' => __('8','maismeta'),
                'value' => '8'
            ),
        )
    ),
    array (
        'label' => __('Facolt&agrave; di riferimento','maismeta'),
        'desc'  => __('Scegli le facolt&agrave; di riferimento.','maismeta'),
        'id'    => $prefix.'checkbox_group_facolta',
        'type'  => 'checkbox_group',
        'options' => array (
            'Agraria' => array (
                'label' => __('Agraria','maismeta'),
                'value' => 'Agraria'
            ),
            'Economia' => array (
                'label' => __('Economia','maismeta'),
                'value' => 'Economia'
            ),
            'Farmacia' => array (
                'label' => __('Farmacia','maismeta'),
                'value' => 'Farmacia'
            ),
            'Giurisprudenza' => array (
                'label' => __('Giurisprudenza','maismeta'),
                'value' => 'Giurisprudenza'
            ),
            'Ingegneriea' => array (
                'label' => __('Ingegneriea','maismeta'),
                'value' => 'Ingegneriea'
            ),
            'Lettere e Filosofia' => array (
                'label' => __('Lettere e Filosofia','maismeta'),
                'value' => 'Lettere e Filosofia'
            ),
            'Lingue e letteratura straniera' => array (
                'label' => __('Lingue e letteratura straniera','maismeta'),
                'value' => 'Lingue e letteratura straniera'
            ),
            'Medicina e chirurgia' => array (
                'label' => __('Medicina e chirurgia','maismeta'),
                'value' => 'Medicina e chirurgia'
            ),
            'Scienze della formazione' => array (
                'label' => __('Scienze della formazione','maismeta'),
                'value' => 'Scienze della formazione'
            ),
            'Scienze matematiche fisiche e naturali' => array (
                'label' => __('Scienze matematiche fisiche e naturali','maismeta'),
                'value' => 'Scienze matematiche fisiche e naturali'
            ),
            'Scienze politiche' => array (
                'label' => __('Scienze politiche','maismeta'),
                'value' => 'Scienze politiche'
            )
        )
    ),

);

/* jQuery era qui */

// The Callback
function show_custom_meta_box() {
    global $custom_meta_fields, $post;
    // Use nonce for verification
    echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';

    // Begin the field table and loop
    echo '<table class="form-table">';
    foreach ($custom_meta_fields as $field) {
        // get value of this field if it exists for this post
        $meta = get_post_meta($post->ID, $field['id'], true);
        // begin a table row with
        echo '<tr>
                <th><label for="'.$field['id'].'">'.$field['label'].'</label></th>
                <td>';
                switch($field['type']) {
                    // text
                    case 'text':
                        echo '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
                                <br /><span class="description">'.$field['desc'].'</span>';
                    break;
                    // textarea
                    case 'textarea':
                        echo '<textarea name="'.$field['id'].'" id="'.$field['id'].'" cols="60" rows="4">'.$meta.'</textarea>
                                <br /><span class="description">'.$field['desc'].'</span>';
                    break;
                    // checkbox
                    case 'checkbox':
                        echo '<input type="checkbox" name="'.$field['id'].'" id="'.$field['id'].'" ',$meta ? ' checked="checked"' : '','/>
                                <label for="'.$field['id'].'">'.$field['desc'].'</label>';
                    break;
                    // select
                    case 'select':
                        echo '<select name="'.$field['id'].'" id="'.$field['id'].'">';
                        foreach ($field['options'] as $option) {
                            echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>';
                        }
                        echo '</select><br /><span class="description">'.$field['desc'].'</span>';
                    break;
                    // radio
                    case 'radio':
                        foreach ( $field['options'] as $option ) {
                            echo '<input type="radio" name="'.$field['id'].'" id="'.$option['value'].'" value="'.$option['value'].'" ',$meta == $option['value'] ? ' checked="checked"' : '',' />
                                    <label for="'.$option['value'].'">'.$option['label'].'</label><br />';
                        }
                        echo '<span class="description">'.$field['desc'].'</span>';
                    break;
                    // checkbox_group
                    case 'checkbox_group':
                        foreach ($field['options'] as $option) {
                            echo '<input type="checkbox" value="'.$option['value'].'" name="'.$field['id'].'[]" id="'.$option['value'].'"',$meta && in_array($option['value'], $meta) ? ' checked="checked"' : '',' /> 
                                    <label for="'.$option['value'].'">'.$option['label'].'</label><br />';
                        }
                        echo '<span class="description">'.$field['desc'].'</span>';
                    break;
                    // tax_select
                    case 'tax_select':
                        echo '<select name="'.$field['id'].'" id="'.$field['id'].'">
                                <option value="">Select One</option>'; // Select One
                        $terms = get_terms($field['id'], 'get=all');
                        $selected = wp_get_object_terms($post->ID, $field['id']);
                        foreach ($terms as $term) {
                            if (!empty($selected) && !strcmp($term->slug, $selected[0]->slug)) 
                                echo '<option value="'.$term->slug.'" selected="selected">'.$term->name.'</option>'; 
                            else
                                echo '<option value="'.$term->slug.'">'.$term->name.'</option>'; 
                        }
                        $taxonomy = get_taxonomy($field['id']);
                        echo '</select><br /><span class="description"><a href="'.get_bloginfo('home').'/wp-admin/edit-tags.php?taxonomy='.$field['id'].'">Manage '.$taxonomy->label.'</a></span>';
                    break;
                    // post_list
                    case 'post_list':
                    $items = get_posts( array (
                        'post_type' => $field['post_type'],
                        'posts_per_page' => -1
                    ));
                        echo '<select name="'.$field['id'].'" id="'.$field['id'].'">
                                <option value="">Select One</option>'; // Select One
                            foreach($items as $item) {
                                echo '<option value="'.$item->ID.'"',$meta == $item->ID ? ' selected="selected"' : '','>'.$item->post_type.': '.$item->post_title.'</option>';
                            } // end foreach
                        echo '</select><br /><span class="description">'.$field['desc'].'</span>';
                    break;
                    // date
                    case 'date':
                        echo '<input type="text" class="datepicker" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
                                <br /><span class="description">'.$field['desc'].'</span>';
                    break;
                    // slider
                    case 'slider':
                    $value = $meta != '' ? $meta : '0';
                        echo '<div id="'.$field['id'].'-slider"></div>
                                <input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$value.'" size="5" />
                                <br /><span class="description">'.$field['desc'].'</span>';
                    break;
                    // image
                    global $secondazona;$secondazona = plugin_dir_url(__FILE__);
                    case 'image':
                        $zonaimmi = $secondazona.'images/image.png';    
                        echo '<span class="custom_default_image" style="display:none">'.$zonaimmi.'</span>';
                        if ($meta) { $zonaimmi = wp_get_attachment_image_src($meta, 'medium');  $zonaimmi = $zonaimmi[0]; }             
                        echo    '<input name="'.$field['id'].'" type="hidden" class="custom_upload_image" value="'.$meta.'" />
                                    <img src="'.$zonaimmi.'" class="custom_preview_image" alt="" /><br />
                                        <input class="custom_upload_image_button button" type="button" value="Choose Image" />
                                        <small>&nbsp;<a href="#" class="custom_clear_image_button">Remove Image</a></small>
                                        <br clear="all" /><span class="description">'.$field['desc'].'</span>';
                    break;
                    // repeatable
                    case 'repeatable':
                        echo '<a class="repeatable-add button" href="#">+</a>
                                <ul id="'.$field['id'].'-repeatable" class="custom_repeatable">';
                        $i = 0;
                        if ($meta) {
                            foreach($meta as $row) {
                                echo '<li><span class="sort hndle">|||</span>
                                            <input type="text" name="'.$field['id'].'['.$i.']" id="'.$field['id'].'" value="'.$row.'" size="30" />
                                            <a class="repeatable-remove button" href="#">-</a></li>';
                                $i++;
                            }
                        } else {
                            echo '<li><span class="sort hndle">|||</span>
                                        <input type="text" name="'.$field['id'].'['.$i.']" id="'.$field['id'].'" value="" size="30" />
                                        <a class="repeatable-remove button" href="#">-</a></li>';
                        }
                        echo '</ul>
                            <span class="description">'.$field['desc'].'</span>';
                    break;
                } //end switch
        echo '</td></tr>';
    } // end foreach
    echo '</table>'; // end table
}

function remove_taxonomy_boxes() {
    remove_meta_box('categorydiv', 'post', 'side');
}
add_action( 'admin_menu' , 'remove_taxonomy_boxes' );

// Save the Data
function save_custom_meta($post_id) {
    global $custom_meta_fields;

    // verify nonce
    if (!wp_verify_nonce($_POST['custom_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;
    }

    // loop through fields and save the data
    foreach ($custom_meta_fields as $field) {
        if($field['type'] == 'tax_select') continue;
        $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);
        }
    } // enf foreach

    // save taxonomies
    $post = get_post($post_id);
    $category = $_POST['category'];
    wp_set_object_terms( $post_id, $category, 'category' );
}
add_action('save_post', 'save_custom_meta');


/* nuova posizione */
// enqueue scripts and styles, but only if is_admin

?>

As you can see I have 2 sets of checkboxes the first one with 3 possible values:

'Uomo','Donna','Altro' So the user can easily choose 1,2,3 or all the values.

Then I have this to show 2 more coloumns in my edit-post-page:

// ALL POST TYPES: posts AND custom post types
add_filter('manage_posts_columns', 'colonne_informative_head');
add_action('manage_posts_custom_column', 'colonna_proprietario', 10, 2);


// ADD NEW COLUMN
function colonne_informative_head($defaults) {
    $defaults['custom_textarea_proprietario'] = 'Proprietario';
    $defaults['custom_checkbox_group_sesso'] = 'Sesso occupanti';
    return $defaults;
};

// SHOW THE FEATURED IMAGE
function colonna_proprietario($column_name, $post_ID) {
    if ($column_name == 'custom_textarea_proprietario') {
        $post_colonna_proprietario = get_post_meta($post_ID, 'custom_textarea_proprietario', true);
        if ($post_colonna_proprietario) {
            echo $post_colonna_proprietario;
        }
    }; 

    if ($column_name == 'custom_checkbox_group_sesso') {
        $sesso_occupanti = get_post_meta($post_ID, "custom_checkbox_group_sesso", true);
      //check that we have a custom field
      if ($sesso_occupanti != "")
      {
        // Separate our comma separated list into an array
        $sesso_occupanti = explode(",", $sesso_occupanti);
        //loop through our new array
        foreach ($sesso_occupanti as $sesso)
        {
          echo $sesso ;
        }
      }
        }; 
    };

I have no problem with coloumn named: custom_textarea_proprietario because it was relatively easy to echo only 1 value.

But I have no idea about how to echo the values of second coloumn named: custom_checkbox_group_sesso actually it only echoes 'Array' and nothing else. If I open Php my admin and look for the data I'm storing I can see this:

a:3:{i:0;s:4:"Uomo";i:1;s:5:"Donna";i:2;s:14:"Giurisprudenza";}

What i would like to echo in my coloumn in that case is:

  • Uomo
  • Donna

Then one more coloumn with:

  • Giurisprudenza

I'm almost a newbie in this kind of things so please be nice with me and try to explain things step by step.

1 Answer 1

1

The error was here: (Thank you @Rarst)

 if ($column_name == 'custom_checkbox_group_sesso') {
            $sesso_occupanti = get_post_meta($post_ID, "custom_checkbox_group_sesso", true);
          //check that we have a custom field
          if ($sesso_occupanti != "")
          {
            // Separate our comma separated list into an array
            $sesso_occupanti = explode(",", $sesso_occupanti);
            //loop through our new array
            foreach ($sesso_occupanti as $sesso)
            {
              echo $sesso ;
            }
          }
            }; 

All I had to do was to delete this sentence:

$sesso_occupanti = explode(",", $sesso_occupanti);

Because, as @Rarst said:

if you are storing array then you get back array as well and don't need to explode it.

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.