0

This is the first time I'm building meta box using OOP way, the problem is when I save the post (product) or update it the input text is not saved to the database. Here is my code:

<?php 

/**
* 
*/
class Custom_Meta_Boxes{

    public function __construct(){

        add_action( 'add_meta_boxes', array( $this, 'iam_add_meta_box' ) );
        add_action( 'save_post', array( $this, 'iam_save_meta_box_data' ) );

    }

    /**
     * Adds a meta box to the post editing screen
     */
    public function iam_add_meta_box(){

        add_meta_box(
            'custom_meta_box',
            __( 'Meta Box Title', 'iamtheme' ),
            array( $this, 'iam_display_custom_meta_box' ),
            'post',
            'normal',
            'high'
        );

    }

    /**
     * Render Meta Box content.
     */
    public function iam_display_custom_meta_box() {

        $html = '';

        // Add an nonce field so we can check for it later.
        wp_nonce_field( 'iam_nonce_check', 'iam_nonce_check_value' );

        $html = '<label for="link-text" class="prfx-row-title">Link: </label>';
        $html .= '<input type="text" name="link-text" id="link-text" value="' . get_post_meta( get_the_ID(), 'link-text', true ) . '" placeholder="Enter your link here." />';

        echo $html;
    }

    /**
     * Save the meta when the post is saved.
     */
    public function iam_save_meta_box_data( $post_id ){

        var_dump( $post_id );

        if ( $this->iam_user_can_save( $post_id, 'iam_nonce_check_value' ) ){

            // Checks for input and sanitizes/saves if needed
            if( isset( $_POST[ 'link-text' ] ) && 0 < count( strlen( trim( $_POST['link-text'] ) ) ) ) {

                update_post_meta( $post_id, 'link-text', sanitize_text_field( $_POST[ 'link-text' ] ) );

            }

        }

    }

    /**
     * Determines whether or not the current user has the ability to save meta 
     * data associated with this post.
     *
     * @param       int     $post_id    The ID of the post being save
     * @param       bool                Whether or not the user has the ability to save this post.
    */
    public function iam_user_can_save( $post_id, $nonce ){

        var_dump( $post_id );

        // Checks save status
        $is_autosave = wp_is_post_autosave( $post_id );
        $is_revision = wp_is_post_revision( $post_id );
        $is_valid_nonce = ( isset( $_POST[ $nonce ] ) && wp_verify_nonce( $_POST[ $nonce ], 'iam_nonce_check' ) ) ? 'true' : 'false';

        // Return true if the user is able to save; otherwise, false.
        if ( $is_autosave || $is_revision || !$is_valid_nonce ) {
            return;
        }

    }

}

// Instantiate theme
if ( class_exists( 'Custom_Meta_Boxes' ) ){
    $i_am = new Custom_Meta_Boxes();
}

?>

Please could you tell me what is the problem in this code.

0

You method iam_user_can_save is incorrectly used as you are returning nothing to check in that method. Try this (not sure what behaviour you really want, the following code is just a working example from your code):

public function iam_user_can_save( $post_id, $nonce ){

    // Checks save status
    $is_autosave = wp_is_post_autosave( $post_id );
    $is_revision = wp_is_post_revision( $post_id );
    $is_valid_nonce = ( isset( $_POST[ $nonce ] ) && wp_verify_nonce( $_POST[ $nonce ], 'iam_nonce_check' ) ) ? 'true' : 'false';

    if ( $is_autosave || $is_revision || !$is_valid_nonce ) {

        return false;

    }

    return true;

}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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