1. Advertising
    y u no do it?

    Advertising (learn more)

    Advertise virtually anything here, with CPM banner ads, CPM email ads and CPC contextual links. You can target relevant areas of the site and show ads based on geographical location of the user if you wish.

    Starts at just $1 per CPM or $0.10 per CPC.

Issue with custom meta boxes.

Discussion in 'WordPress' started by fotogrph, Jul 26, 2012.

  1. #1
    I'm having a wierd issue with my custom meta boxes. They appear correctly on posts and on custom page templates. But, on the default page template they will load when you create a new page. After you hit publish or save the meta boxes dissappear.

    This is the Meta Class

    
    
    class ARIXWP_Meta {
        
        private $meta     = null;
        public $postid    = null;
        private $template = null;
        
        function __construct() {
            add_action('save_post',array(&$this, 'save_meta_data'));
        }
        
        function __destruct() {
            $this->meta     = null;
            $this->postid   = null;
            $this->template = null;
        }
        
        public function init_meta() {
            add_action('admin_init',array(&$this, 'add_meta'));
        }
        
        public function add_meta() {
            if ($this->meta['template'] == $this->template) {
                add_meta_box($this->meta['id'], $this->meta['title'],  array(&$this, 'format_meta'), $this->meta['post_type'],  $this->meta['context'], $this->meta['priority']);    
            }
        }
        
        public function format_meta() {
            global $post;
            
            if (!isset($post)) return false;
            
            if ($this->meta['post_type'] != $post->post_type) return false;
            
            $this->set_postid($post->ID);
            
            // Use nonce for verification
            echo '<input type="hidden" name="' .  $this->meta['nonce_name'] . '" value="',  wp_create_nonce(basename(__FILE__)), '" />';
            
            foreach ($this->meta['fields'] as $field) {
                // get current post meta data
                $meta = get_post_meta($post->ID, $field['id'], true);
           
                if (isset($field['before']) && $field['before'] != "") {
                  echo '<p class="heading">' . $field['before'] . '</p>';
                }
                
                echo '<label for="'. $field['id'] .'" class="arixwp_label">'. $field['name']. '</label><p>';
                
                if (isset($field['desc']) && $field['desc'] != "") {
                  echo '<p class="arixwp_text">' . $field['desc'] . '</p>';
                }
                
                if ( $field['type'] == 'radio' )
                    echo '<div class="arixwp_radio">';
                
                switch ($field['type']) {
                    case 'text':
                        echo '<input type="text" name="'. $field['id'].  '" id="'. $field['id'] .'" value="'. ($meta ? $meta : $field['default'])  . '" class="arixwp_admin_input" />'. '<br />';
                        break;
                    case 'textarea':
                        echo '<textarea name="'. $field['id']. '" id="'.  $field['id']. '" cols="60" rows="4" class="arixwp_admin_input">'.  ($meta ? $meta : $field['default']) . '</textarea>'. '<br  />';
                        break;
                    case 'select':
                        echo '<select name="'. $field['id'] . '" id="'. $field['id'] . '" class="arixwp_admin_select">';
                        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'] . '<br />';
                            echo '<input type="radio" id="' . $field[  'id' ] . $option['value'] . '" name="' . $field[ 'id' ] . '" value="' .  $option['value'] . '"' . ( $meta == $option[ 'value' ] ? '  checked="checked"' : '' ) . ' /><label for="' . $field[ 'id' ] .  $option['value'] . '">' . $option[ 'name' ] . '</label>'; 
                        }
                        break;
                    case 'checkbox':
                        echo '<input type="checkbox" name="' .  $field['id'] . '" id="' . $field['id'] . '"' . ( $meta ? '  checked="checked"' : '' ) . ' />';
                        break;
                }
                
                if ( $field['type'] == 'radio' )
                    echo '</div>';
                    
               // echo     '</p>';
            }
        }
        
        public function save_meta_data($post_id) {
            global $post;
            
            if (!isset($post->ID)) {
                $post = get_post($post_id);
            }
            
            $this->set_postid($post->ID);
            $this->meta = $this->get_meta();
            
            if ($this->meta['post_type'] != $post->post_type) return $post_id;
                    
            $_POST[$this->meta['nonce_name']] =  isset($_POST[$this->meta['nonce_name']]) ?  $_POST[$this->meta['nonce_name']] : "";
            
            //Verify nonce
            if (!wp_verify_nonce($_POST[$this->meta['nonce_name']], basename(__FILE__))) {
                return $post_id;
            }
                    
            //Check autosave
            if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
                return $post_id;
            }
         
            //Check permissions
            if (isset($_POST['post_type']) && '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 ($this->meta['fields'] as $field) {
                
                $old = get_post_meta($post_id, $field['id'], true);
                $new = isset($_POST[$field['id']]) ? $_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);
                }
            }
        }
        
        public function set_postid($axPostId = 0) {
            $postID  = null;
            $postID2 = null;
            
            if ($axPostId > 0) {
                $this->postid = $axPostId;
            } else {
                
                if ( isset( $_GET['post'] ) ) {
                    
                    $postID  = filter_var( $_GET['post'], FILTER_VALIDATE_INT );
                
                    if ( isset( $_POST['post_ID'] ) ) {
                        $postID2 = filter_var( $_POST['post_ID'], FILTER_VALIDATE_INT );
                    } else {
                        $postID2 = '';
                    }
                
                    $this->postid = $postID ? $postID : $postID2 ;        
                }
            }
        }
        
        public function get_postid() {
            return $this->postid;
        }
        
        public function set_template() {
            $this->template = get_post_meta($this->postid,'_wp_page_template',TRUE);
        }
        
        public function get_template() {
            return $this->template;
        }
        
        public function set_meta($axMeta) {
            update_post_meta($this->postid, '_arixwp_field_meta', serialize($axMeta));
            $this->meta = $axMeta;
        }
        
        public function get_meta() {
            if (is_null(($this->meta))) {
                $this->meta = unserialize(get_post_meta($this->postid,'_arixwp_field_meta',TRUE));
            }
            return $this->meta;
        }
    }
    
    PHP:
    This is how i am calling the meta boxes:

    
        $meta_template = '';
        $meta_posttype = 'page';
        $meta_title    = 'Page Options';
        $meta_context  = 'normal';
        $meta_priority = 'high';
        $meta_id       = 'page-meta';
        $meta_nonce    = $meta_id . '-nonce';
        $arixwp_meta       = new ARIXWP_Meta();
        
        $arixwp_meta->set_postId();
        $arixwp_meta->set_template();
        $arixwp_template  = $arixwp_meta->get_template();
        
        if ($arixwp_template == $meta_template) {
            $arixwp_meta->set_meta(array(
               
                //This is the id applied to the meta box
                'id'         => $meta_id,
                
                //This is the post type the meta is for
                'post_type'  => $meta_posttype,
                
                //This is the template to show the meta for
                'template'   => $meta_template,
                
                //This is the nonce for this meta
                'nonce_name' => $meta_nonce,
               
                //This is the title that appears on the meta box container
                'title'      => $meta_title,
        
                //This defines the part of the page where the edit screen section should be shown
                'context'    => $meta_context,    
               
                //This sets the priority within the context where the boxes should show
                'priority'   => $meta_priority,
               
                //Here we define all the fields we want in the meta box
                'fields' => array(    
                            
                // Show or hide featured posts
                            
                    array(
                        'before'     => '',
                        'after'     => '',
                        'name'         => __( 'Show Featured Posts', THEMENAME ),
                        'desc'         => __( 'This allows you to show or  hide the featured posts banner on this page. ( Note: this will override  the setting in the themes control panel. )', THEMENAME ),
                        'id'        => '_arixwp_featured_show_page',
                        'type'         => 'radio', // text,textarea,select,radio,checkbox
                        'default'     => 'home',
                        'options'     => array(
                            array('name' => __( ' Yes', THEMENAME ), 'value' => 'yes'),
                            array('name' => __( ' No', THEMENAME ), 'value' => 'no')
                        )                                
                    ),    
                            
                // Featured Posts Display Method
                            
                    array(
                        'before'     => '',
                        'after'     => '',
                        'name'         => __( 'Featured Post Display', THEMENAME ),
                        'desc'         => __( 'This controls how your  featured posts are displayed. You can show one main feature and 3 normal  features, one main feature only, three normal features only, or a  jQuery slider that slides through the latest 4 posts in the featured  category. ', THEMENAME ),
                        'id'        => '_arixwp_featured_display_page',
                        'type'         => 'radio', // text,textarea,select,radio,checkbox
                        'default'     => 'four',
                        'options'     => array(
                            array('name' => __( ' Main Feature &amp; 3  Normal Features', THEMENAME ), 'value' => 'four', 'class' =>  'wparix_feature_four' ),
                            array('name' => __( ' Main Feature Only',  THEMENAME ), 'value' => 'one', 'class' => 'wparix_feature_one' ),
                            array('name' => __( ' 3 Normal Features  Only', THEMENAME ), 'value' => 'three', 'class' =>  'wparix_feature_three' ),
                            array('name' => __( ' Slidertron Slider',  THEMENAME ), 'value' => 'slide', 'class' => 'wparix_feature_slide'  )
                        )                                
                    ),
                                
                // Sidebar Location
                            
                    array (
                        'before'     => '',
                        'after'     => '',
                        'name'         => __( 'Sidebar Location', THEMENAME ),
                        'desc'         => __( 'This allows you to override the default sidebar settings.', THEMENAME ),
                        'id'         => '_arixwp_sidebar_page',
                        'type'         => 'radio', // text,textarea,select,radio,checkbox
                        'default'     => 'left',
                        'options'     => array(
                            array('name' => ' Left', 'value' => 'left'),
                            array('name' => ' Right', 'value' => 'right'),
                            array('name' => ' None', 'value' => 'none')
                        )                                
                    ),                                    
                    
                )
            ));
            
            $arixwp_meta->init_meta();
        }
        
        $arixwp_meta = null;
    
    PHP:
    If i switch the $meta_posttype to post or leave it as page and set the $meta_template it works fine. Please help I am totally stumped.
     
    fotogrph, Jul 26, 2012 IP