1

I've read many related questions and have tried all that I could so make sure it's actually a duplicate before flagging please.

I've been using WordPress for about 6 years so when I say I'm stuck, I really mean it.

I'm trying to add custom meta boxes to a CPT, boat. Below is my code and the error I'm getting.

Error message:

Notice: Undefined variable: boat_make in /path/to/file/wp-content/plugins/syb/admin/class-syb-admin.php on line 150

This error message is the same for both fields.

Here is my code:

/**
 * Register all of the hooks related to the admin area functionality
 * of the plugin.
 *
 * @since    1.0.0
 * @access   private
 */
private function define_admin_hooks() {

    ...

    /**
     * Add metabox and register custom fields
     *
     * @link https://code.tutsplus.com/articles/rock-solid-wordpress-30-themes-using-custom-post-types--net-12093
     */
    $this->loader->add_action( 'add_meta_boxes', $plugin_admin, 'rerender_meta_options' );
    $this->loader->add_action( 'save_post', $plugin_admin, 'save_meta_options' );

}

...

/**
 * Save Custom Fields
 *
 * @since    1.0.0
 */
public function save_meta_options() {
    if ( ! current_user_can( '' ) ) return;
    global $post;

    update_post_meta($post->ID, "customer_id", $_POST["customer_id"]);
    update_post_meta($post->ID, "boat_make", $_POST["boat_make"]);
}

/**
 * Create a meta box for our custom fields
 *
 * @since    1.0.0
 */ 
public function rerender_meta_options() {
    add_meta_box("boat-meta", "Boat Details", array($this, "display_meta_options"), "boat", "normal", "low");
}

/**
 * Display meta box and custom fields
 *
 * @since    1.0.0
 */  
public function display_meta_options() {
    global $post; 

    $custom = get_post_custom($post->ID);
    var_dump($custom);

    if (isset($custom["customer_id"][0])) {
        $customer_id = $custom["customer_id"][0];
    }  

    ?>
    <label><?php _e( 'Boat Colour:', $this->plugin_name ); ?></label><input name="customer_id" value="<?php echo $customer_id; ?>" /><br>
    <?php 

    if (isset($custom["boat_make"][0])) {
        $boat_make = $custom["boat_make"][0];
    }  

    ?>
    <label><?php _e( 'Boat Make:', $this->plugin_name ); ?></label><textarea name="boat_make"><?php echo $boat_make; ?></textarea>
    <?php
}

Loader method:

class Syb_Loader {

/**
 * The array of actions registered with WordPress.
 *
 * @since    1.0.0
 * @access   protected
 * @var      array    $actions    The actions registered with WordPress to fire when the plugin loads.
 */
protected $actions;

/**
 * The array of filters registered with WordPress.
 *
 * @since    1.0.0
 * @access   protected
 * @var      array    $filters    The filters registered with WordPress to fire when the plugin loads.
 */
protected $filters;

/**
 * Initialize the collections used to maintain the actions and filters.
 *
 * @since    1.0.0
 */
public function __construct() {

    $this->actions = array();
    $this->filters = array();

}

/**
 * Add a new action to the collection to be registered with WordPress.
 *
 * @since    1.0.0
 * @param    string               $hook             The name of the WordPress action that is being registered.
 * @param    object               $component        A reference to the instance of the object on which the action is defined.
 * @param    string               $callback         The name of the function definition on the $component.
 * @param    int                  $priority         Optional. The priority at which the function should be fired. Default is 10.
 * @param    int                  $accepted_args    Optional. The number of arguments that should be passed to the $callback. Default is 1.
 */
public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
    $this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args );
}

/**
 * Add a new filter to the collection to be registered with WordPress.
 *
 * @since    1.0.0
 * @param    string               $hook             The name of the WordPress filter that is being registered.
 * @param    object               $component        A reference to the instance of the object on which the filter is defined.
 * @param    string               $callback         The name of the function definition on the $component.
 * @param    int                  $priority         Optional. The priority at which the function should be fired. Default is 10.
 * @param    int                  $accepted_args    Optional. The number of arguments that should be passed to the $callback. Default is 1
 */
public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
    $this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args );
}

/**
 * A utility function that is used to register the actions and hooks into a single
 * collection.
 *
 * @since    1.0.0
 * @access   private
 * @param    array                $hooks            The collection of hooks that is being registered (that is, actions or filters).
 * @param    string               $hook             The name of the WordPress filter that is being registered.
 * @param    object               $component        A reference to the instance of the object on which the filter is defined.
 * @param    string               $callback         The name of the function definition on the $component.
 * @param    int                  $priority         The priority at which the function should be fired.
 * @param    int                  $accepted_args    The number of arguments that should be passed to the $callback.
 * @return   array                                  The collection of actions and filters registered with WordPress.
 */
private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) {

    $hooks[] = array(
        'hook'          => $hook,
        'component'     => $component,
        'callback'      => $callback,
        'priority'      => $priority,
        'accepted_args' => $accepted_args
    );

    return $hooks;

}

/**
 * Register the filters and actions with WordPress.
 *
 * @since    1.0.0
 */
public function run() {

    foreach ( $this->filters as $hook ) {
        add_filter( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
    }

    foreach ( $this->actions as $hook ) {
        add_action( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
    }

}

}
  • 3
    if the $custom[boat_make][0] is not set, then the variable is never created, no default value is ever set! – Tom J Nowell Aug 21 '18 at 21:17
  • @TomJNowell the question is why, it should of been set with save_meta_options() – yobddigi Aug 21 '18 at 21:21
  • 1
    After the initial save yes, but beforehand.. – Tom J Nowell Aug 22 '18 at 15:35
  • Thanks @TomJNowell, figured it out. Was a simple mistake – yobddigi Aug 22 '18 at 18:46
1

Before saving your meta data, you have if ( ! current_user_can( '' ) ) return

I've never run current_user_can against and empty string of capabilities, so I'm not sure what your results are going to be, but it's very possible this returns a false, and you return at this point.

Also, be sure you sanitize your $_POST data before sticking it in the database.

  • this was it! don't know why that caused the problem – yobddigi Aug 21 '18 at 21:53
  • 1
    Probably because the empty string is not a valid capability, so you are asking if the user has this capability, and WP says no. If No, return. – De Coder Aug 21 '18 at 21:56
0

It's not even that $custom["boat_make"][0], but not even $custom["boat_make"] is set.

Because of that, you cannot ask: if (isset($custom["boat_make"][0]))

Check your database and see if the post meta exists for "boat_make"

What does it look like when you do your var_dump($custom); ?

  • No it’s not set – yobddigi Aug 21 '18 at 21:44

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.