0

I have created custom metafields like the following and it was working fine. I want to show the metafield only when an particular page template is used. but it was not working.

class contactdetailsMetabox {
    private $screen = array(
        'page',
    );
    private $meta_fields = array(
        array(
            'label' => 'Business Title',
            'id' => 'business-title',
            'default' => 'Business Title',
            'type' => 'text',
        ),
        array(
            'label' => 'Business Logo',
            'id' => 'business-logo',
            'type' => 'media',
        ),
        array(
            'label' => 'Street Address',
            'id' => 'street-address',
            'type' => 'wysiwyg',
        ),
        array(
            'label' => 'Postal code',
            'id' => 'postal-code',
            'type' => 'text',
        ),
        array(
            'label' => 'Address Locality',
            'id' => 'address-locality',
            'type' => 'text',
        ),
        array(
            'label' => 'Business Phone No',
            'id' => 'business-phone',
            'type' => 'text',
        ),
        array(
            'label' => 'Business Mobile',
            'id' => 'business-mobile',
            'type' => 'tel',
        ),
        array(
            'label' => 'Business Email',
            'id' => 'business-email',
            'type' => 'email',
        ),
        array(
            'label' => 'Business Website',
            'id' => 'business-website',
            'type' => 'url',
        ),
        array(
            'label' => 'Latitude',
            'id' => 'map-latitude',
            'type' => 'text',
        ),
        array(
            'label' => 'Longitude',
            'id' => 'map-longitude',
            'type' => 'text',
        ),
        array(
            'label' => 'Zoom Level',
            'id' => 'zoom-level',
            'type' => 'text',
        ),
    );


    public function __construct() {
        add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
        add_action( 'admin_footer', array( $this, 'media_fields' ) );
        add_action( 'save_post', array( $this, 'save_fields' ) );
    }
    public function add_meta_boxes() {
        foreach ( $this->screen as $single_screen ) {
            add_meta_box(
                'contactdetails',
                __( 'Contact details', 'rjslwp' ),
                array( $this, 'meta_box_callback' ),
                $single_screen,
                'advanced',
                'high'
            );
        }
    }
    public function meta_box_callback( $post ) {
        wp_nonce_field( 'contactdetails_data', 'contactdetails_nonce' );
        echo 'Here you can add your business contact details.';
        $this->field_generator( $post );
    }
    public function media_fields() {
        ?><script>
            jQuery(document).ready(function($){
                if ( typeof wp.media !== 'undefined' ) {
                    var _custom_media = true,
                    _orig_send_attachment = wp.media.editor.send.attachment;
                    $('.contactdetails-media').click(function(e) {
                        var send_attachment_bkp = wp.media.editor.send.attachment;
                        var button = $(this);
                        var id = button.attr('id').replace('_button', '');
                        _custom_media = true;
                            wp.media.editor.send.attachment = function(props, attachment){
                            if ( _custom_media ) {
                                $('input#'+id).val(attachment.url);
                            } else {
                                return _orig_send_attachment.apply( this, [props, attachment] );
                            };
                        }
                        wp.media.editor.open(button);
                        return false;
                    });
                    $('.add_media').on('click', function(){
                        _custom_media = false;
                    });
                }
            });
        </script><?php
    }
    public function field_generator( $post ) {
        $output = '';
        foreach ( $this->meta_fields as $meta_field ) {
            $label = '<label for="' . $meta_field['id'] . '">' . $meta_field['label'] . '</label>';
            $meta_value = get_post_meta( $post->ID, $meta_field['id'], true );
            if ( empty( $meta_value ) ) {
                $meta_value = $meta_field['default']; }
            switch ( $meta_field['type'] ) {
                case 'media':
                    $input = sprintf(
                        '<input style="width: 80%%" id="%s" name="%s" type="text" value="%s"> <input style="width: 19%%" class="button contactdetails-media" id="%s_button" name="%s_button" type="button" value="Upload" />',
                        $meta_field['id'],
                        $meta_field['id'],
                        $meta_value,
                        $meta_field['id'],
                        $meta_field['id']
                    );
                    break;
                case 'wysiwyg':
                    ob_start();
                    wp_editor($meta_value, $meta_field['id']);
                    $input = ob_get_contents();
                    ob_end_clean();
                    break;
                default:
                    $input = sprintf(
                        '<input %s id="%s" name="%s" type="%s" value="%s">',
                        $meta_field['type'] !== 'color' ? 'style="width: 100%"' : '',
                        $meta_field['id'],
                        $meta_field['id'],
                        $meta_field['type'],
                        $meta_value
                    );
            }
            $output .= $this->format_rows( $label, $input );
        }
        echo '<table class="form-table"><tbody>' . $output . '</tbody></table>';
    }
    public function format_rows( $label, $input ) {
        return '<tr><th>'.$label.'</th><td>'.$input.'</td></tr>';
    }
    public function save_fields( $post_id ) {
        if ( ! isset( $_POST['contactdetails_nonce'] ) )
            return $post_id;
        $nonce = $_POST['contactdetails_nonce'];
        if ( !wp_verify_nonce( $nonce, 'contactdetails_data' ) )
            return $post_id;
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
            return $post_id;
        foreach ( $this->meta_fields as $meta_field ) {
            if ( isset( $_POST[ $meta_field['id'] ] ) ) {
                switch ( $meta_field['type'] ) {
                    case 'email':
                        $_POST[ $meta_field['id'] ] = sanitize_email( $_POST[ $meta_field['id'] ] );
                        break;
                    case 'text':
                        $_POST[ $meta_field['id'] ] = sanitize_text_field( $_POST[ $meta_field['id'] ] );
                        break;
                }
                update_post_meta( $post_id, $meta_field['id'], $_POST[ $meta_field['id'] ] );
            } else if ( $meta_field['type'] === 'checkbox' ) {
                update_post_meta( $post_id, $meta_field['id'], '0' );
            }
        }
    }
}
if (class_exists('contactdetailsMetabox')) {
    new contactdetailsMetabox;
};

The above code is for adding custom fields

What i have tried is

function remove_custom_meta_box() {
    global $post;

    if(!empty($post))
    {
        $pageTemplate = get_post_meta($post->ID, '_wp_page_template', true);

        if($pageTemplate == 'templates/contact-us.php' )
        {
    remove_meta_box( 'contactdetails' , 'page' , 'advanced' );
}
}
}
}
add_action( 'admin_menu', 'remove_custom_meta_box' );

For testing my code i tried to remove it from all page its also not working

function remove_custom_meta_box() {
    remove_meta_box( 'contactdetails' , 'page' , 'advanced' );
}
add_action( 'admin_menu', 'remove_custom_meta_box' );
2
  • admin_menu might fire too early, esp when meta boxes are registered via plugin, try do_meta_boxes. You could just add it conditionally, not needing to remove it. Commented Mar 8, 2018 at 14:12
  • @Nicolai i am using the code in functions.php all the above codes. After adding the metabox function only i have given remove function
    – J. Shabu
    Commented Mar 8, 2018 at 14:24

0

Your Answer

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