/** * Adds meta box with additional advert information * * @uses Adverts * @uses Adverts_Form * @see add_meta_box() * * @param WP_Post $post * @since 0.1 * @return void */ function adverts_data_box_content($post) { wp_nonce_field(plugin_basename(__FILE__), 'product_price_box_content_nonce'); $exclude = array("_adverts_account", "advert_category", "post_title", "gallery", "post_content"); // Load form data $form = new Adverts_Form(); $form->load(Adverts::instance()->get("form")); // Get list of fields from post meta table $bind = array(); foreach ($form->get_fields(array("exclude" => $exclude)) as $f) { $bind[$f["name"]] = get_post_meta($post->ID, $f["name"], true); } // Bind data $form->bind($bind); // Validate if message 21 will be displayed, that is if form already failed // validation in adverts_save_post_validator() function if (isset($_GET['message']) && $_GET['message'] == 21) { $form->validate(); } ?> <style type="text/css"> .adverts-data-table th.adverts-data-header { font-size:1.4em; font-weight: normal; font-variant: small-caps; padding: 20px 10px 0px 0px } .adverts-data-table input[type="text"], .adverts-data-table textarea { width: 99%; } </style> <table class="form-table adverts-data-table"> <tbody> <?php foreach ($form->get_fields(array("exclude" => $exclude)) as $field) { ?> <tr class="<?php if (isset($field["error"]) && !empty($field["error"])) { ?> form-invalid<?php } ?> "> <?php if ($field["type"] == "adverts_field_header") { ?> <th scope="row" colspan="2" class="adverts-data-header"> <?php esc_html_e($field["label"]); ?> </th> <?php } else { ?> <th scope="row"> <label for="<?php esc_attr_e($field["name"]); ?> "><?php esc_html_e($field["label"]); ?> </label></th> <td> <?php call_user_func(adverts_field_get_renderer($field), $field); ?> <?php if (isset($field["error"]) && !empty($field["error"])) { ?> <ul> <?php foreach ($field["error"] as $error) { ?> <li><?php esc_html_e($error); ?> </li> <?php } ?> </ul> <?php } ?> </td> <?php } ?> </tr> <?php } ?> </tbody> </table> <?php }
/** * Generates HTML for ad edit form (in [adverts_manage] shortcode) * * @param array $atts Shortcode attributes * @since 0.1 * @return void * @access private */ function _adverts_manage_edit($atts) { wp_enqueue_style('adverts-frontend'); wp_enqueue_style('adverts-icons'); wp_enqueue_style('adverts-icons-animate'); wp_enqueue_script('adverts-frontend'); wp_enqueue_script('adverts-auto-numeric'); extract(shortcode_atts(array('name' => 'default', 'moderate' => false), $atts)); include_once ADVERTS_PATH . 'includes/class-html.php'; include_once ADVERTS_PATH . 'includes/class-form.php'; $form = new Adverts_Form(Adverts::instance()->get("form")); $valid = null; $error = array(); $info = array(); $bind = array(); $action = apply_filters('adverts_action', adverts_request("_adverts_action", ""), __FUNCTION__); $post_id = adverts_request("advert_id", null); // $post_id hijack attempt protection here! $post = get_post($post_id); if ($post === null) { $error[] = __("Ad does not exist.", "adverts"); adverts_flash(array("error" => $error)); return; } if ($post->post_author != get_current_user_id()) { $error[] = __("You do not own this Ad.", "adverts"); adverts_flash(array("error" => $error)); return; } $slist = apply_filters("adverts_sh_manage_list_statuses", array('publish', 'expired', 'pending', 'draft')); if (!in_array($post->post_status, $slist)) { $error[] = sprintf(__("Incorrect post status [%s].", "adverts"), $post->post_status); adverts_flash(array("error" => $error)); return; } foreach ($form->get_fields() as $f) { $bind[$f["name"]] = get_post_meta($post_id, $f["name"], true); } $bind["_adverts_action"] = "update"; $bind["_post_id"] = $post_id; $bind["post_title"] = $post->post_title; $bind["post_content"] = $post->post_content; $bind["advert_category"] = array(); $terms = get_the_terms($post_id, 'advert_category'); if (is_array($terms)) { foreach ($terms as $term) { $bind["advert_category"][] = $term->term_id; } } $form->bind($bind); if ($action == "update") { $form->bind((array) stripslashes_deep($_POST)); $valid = $form->validate(); if ($valid) { $post_id = Adverts_Post::save($form, $post_id); if (is_wp_error($post_id)) { $error[] = $post_id->get_error_message(); } else { $info[] = __("Post has been updated.", "adverts"); } } else { $error[] = __("Cannot update. There are errors in your form.", "adverts"); } } $adverts_flash = array("error" => $error, "info" => $info); // adverts/templates/manage-edit.php include apply_filters("adverts_template_load", ADVERTS_PATH . 'templates/manage-edit.php'); }
/** * Layout for forms generated by Adverts in wp-admin panel. * * @param Adverts_Form $form * @param array $options * @since 0.1 * @return void */ function adverts_form_layout_config(Adverts_Form $form, $options = array()) { $a = array(); ?> <?php foreach ($form->get_fields(array("type" => array("adverts_field_hidden"))) as $field) { ?> <?php call_user_func(adverts_field_get_renderer($field), $field); ?> <?php } ?> <?php foreach ($form->get_fields($options) as $field) { ?> <?php if ($field["type"] == "adverts_field_header") { ?> <tr valign="top"> <th colspan="2" style="padding-bottom:0px"> <h3 style="border-bottom:1px solid #dfdfdf; line-height:1.4em; font-size:15px"><?php esc_html_e($field["title"]); ?> </h3> </th> </tr> <?php } else { ?> <tr valign="top" class="<?php if (adverts_field_has_errors($field)) { ?> adverts-field-error<?php } ?> "> <th scope="row"> <label <?php if (!in_array($field['type'], $a)) { ?> for="<?php esc_attr_e($field["name"]); ?> "<?php } ?> > <?php esc_html_e($field["label"]); ?> <?php if (adverts_field_has_validator($field, "is_required")) { ?> <span class="adverts-red"> *</span><?php } ?> </label> </th> <td class=""> <?php switch ($field["type"]) { case "adverts_field_text": $field["class"] = (isset($field["class"]) ? $field["class"] : '') . ' regular-text'; break; } ?> <?php call_user_func(adverts_field_get_renderer($field), $field); ?> <?php if (isset($field['hint']) && !empty($field['hint'])) { ?> <br/><span class="description"><?php echo $field['hint']; ?> </span> <?php } ?> <?php if (adverts_field_has_errors($field)) { ?> <ul class="updated adverts-error-list"> <?php foreach ($field["error"] as $k => $v) { ?> <li><?php esc_html_e($v); ?> </li> <?php } ?> </ul> <?php } ?> </td> </tr> <?php } ?> <?php } ?> <?php }
/** * Saves data in DB * * @param Adverts_Form $form * @param WP_Post $post * @param array $defaults */ public static function save(Adverts_Form $form, $post = null, $init = array()) { if (is_numeric($post)) { $post = get_post($post); } // Change Post GUID using post_guid filter if the post is already saved in DB // (otherwise guid will be set automatically) if (isset($init["post"]["ID"]) && isset($init["post"]["guid"]) && $init["post"]["guid"] == "") { self::$_tmp_guid = get_post_permalink($init["post"]["ID"]); add_filter("post_guid", array(__CLASS__, "tmp_guid")); } $data = array(); $meta = array(); $taxo = array(); // Set default values if (isset($init["post"]) && is_array($init["post"])) { $data = $init["post"]; } if (isset($init["meta"]) && is_array($init["meta"])) { $meta = $init["meta"]; } if (isset($init["taxo"]) && is_array($init["taxo"])) { $taxo = $init["taxo"]; } // Merge defaults with data from the Adverts_Form foreach ($form->get_fields() as $field) { if (property_exists("WP_Post", $field["name"])) { $data[$field["name"]] = $field["value"]; } elseif (taxonomy_exists($field["name"])) { $taxo[$field["name"]] = $field["value"]; } elseif (isset($field["value"])) { $meta[$field["name"]] = array("field" => $field, "value" => $field["value"]); } } if ($post && $post->ID > 0) { // Post already exists, update only. $data["ID"] = $post->ID; $post_id = wp_update_post(apply_filters("adverts_update_post", $data)); } else { // Post does not exist, insert it. $data["comment_status"] = "closed"; $post_id = wp_insert_post(apply_filters("adverts_insert_post", $data)); } if (is_wp_error($post_id)) { return $post_id; } // Save meta data values $fields = Adverts::instance()->get("form_field"); foreach ($meta as $key => $data) { $field = $data["field"]; $field_type = $field["type"]; $value = $data["value"]; $callback_save = $fields[$field_type]["callback_save"]; if (is_callable($callback_save)) { call_user_func($callback_save, $post_id, $key, $value); } } // Save taxonomies foreach ($taxo as $key => $tax) { wp_set_post_terms($post_id, $tax, $key); } if (self::$_tmp_guid) { // After save tmp_guid filter is no longer needed, remove it. self::$_tmp_guid = null; remove_filter("post_guid", array(__CLASS__, "tmp_guid")); } return $post_id; }