我已经创建了一个插件,适用于现有的表wp_posts
内的WordPress数据库.为此,我已经创建了插件的代码,添加3个字段到现有的数据库时,当激活插件,也从现有的数据库中删除3个字段时,停用插件。
this is screenshot of my layout
我想当我点击更新后,在字段中添加值,然后地址,纬度和经度字段显示该数据到数据库。
代码如下:
<?php
/**
* Plugin Name: Hello World
* Plugin URI: https://example.com/my-plugin
* Description: This is a description of my hello world sample plugin.
* Version: 2.3.1
* Author: Selin
* Author URI: https://example.com
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
include_once WP_PLUGIN_DIR . '/form-data/connection.php';
include_once(__DIR__. '\Admin\Store\createfile.php');
include_once(__DIR__ . '\Admin\Store\view.php');
//global $post;
function db_activate() {
global $wpdb;
$table = $wpdb->prefix . 'posts';
$charset_collate = $wpdb->get_charset_collate();
$sql = "ALTER TABLE $table
ADD `address` VARCHAR(255) NOT NULL,
ADD `longitude` VARCHAR(20) NOT NULL,
ADD `latitude` VARCHAR(20) NOT NULL
;";
$wpdb->query($sql);
$wpdb->get_results("DESCRIBE $table");
}
register_activation_hook(__FILE__, 'db_activate');
function db_deactivate() {
global $wpdb;
$table = $wpdb->prefix . 'posts';
$sql = "ALTER TABLE $table DROP COLUMN `address`, DROP COLUMN `longitude`, DROP COLUMN `latitude`";
$wpdb->query($sql);
}
register_deactivation_hook(__FILE__, 'db_deactivate');
// custom-post-type
function custom_store_metaboxes() {
add_meta_box(
'store_location',
'Store Location',
'display_store',
'store',
'normal',
'high'
);
}
function display_store($post) {
// Get existing address, latitude, and longitude values (if any)
$address = get_post_meta($post->ID, 'address', true);
$latitude = get_post_meta($post->ID, 'latitude', true);
$longitude = get_post_meta($post->ID, 'longitude', true);
?>
<label for="address">Address:</label><br>
<input type="text" id="address" name="address" value="<?php echo esc_attr($address); ?>"/><br><br>
<label for="latitude">Latitude:</label><br>
<input type="text" name="latitude" id="latitude" value="<?php echo esc_attr($latitude); ?>" /><br><br>
<label for="longitude">Longitude:</label><br>
<input type="text" name="longitude" id="longitude" value="<?php echo esc_attr($longitude); ?>" /><br><br>
<?php
}
function save_store_location_fields($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
// Insert or update the address
if (isset($_POST['address'])) {
update_post_meta($post_id, 'address', sanitize_text_field($_POST['address']));
}
// Insert or update the latitude
if (isset($_POST['latitude'])) {
update_post_meta($post_id, 'latitude', sanitize_text_field($_POST['latitude']));
}
// Insert or update the longitude
if (isset($_POST['longitude'])) {
update_post_meta($post_id, 'longitude', sanitize_text_field($_POST['longitude']));
}
}
add_action('save_post_store', 'save_store_location_fields');
//wp_insert_post($address,$latitude,$longitude);
add_action('add_meta_boxes_store', 'custom_store_metaboxes');
//add_action('save_post_store', 'save_store_location_fields');
function register_custom_store_post_type() {
$labels = array(
'name' => _x( 'Store Locator', 'Post type general name', 'textdomain' ),
'singular_name' => _x( 'Store', 'Post type singular name', 'textdomain' ),
'menu_name' => _x( 'Stores', 'Admin Menu text', 'textdomain' ),
'name_admin_bar' => _x( 'Store', 'Add New on Toolbar', 'textdomain' ),
'add_new' => __( 'Add New', 'textdomain' ),
'add_new_item' => __( 'Add New Store', 'textdomain' ),
'new_item' => __( 'New Store', 'textdomain' ),
'edit_item' => __( 'Edit Store', 'textdomain' ),
'view_item' => __( 'View Store', 'textdomain' ),
'all_items' => __( 'All Stores', 'textdomain' ),
'search_items' => __( 'Search Stores', 'textdomain' ),
'parent_item_colon' => __( 'Parent Stores:', 'textdomain' ),
'not_found' => __( 'No stores found.', 'textdomain' ),
'not_found_in_trash' => __( 'No stores found in Trash.', 'textdomain' ),
'featured_image' => _x( 'Store Cover Image', 'Overrides the “Featured Image” phrase for this post type. Added in 4.3', 'textdomain' ),
'set_featured_image' => _x( 'Set cover image', 'Overrides the “Set featured image” phrase for this post type. Added in 4.3', 'textdomain' ),
'remove_featured_image' => _x( 'Remove cover image', 'Overrides the “Remove featured image” phrase for this post type. Added in 4.3', 'textdomain' ),
'use_featured_image' => _x( 'Use as cover image', 'Overrides the “Use as featured image” phrase for this post type. Added in 4.3', 'textdomain' ),
'archives' => _x( 'Store archives', 'The post type archive label used in nav menus. Default “Post Archives”. Added in 4.4', 'textdomain' ),
'insert_into_item' => _x( 'Insert into store', 'Overrides the “Insert into post”/”Insert into page” phrase (used when inserting media into a post). Added in 4.4', 'textdomain' ),
'uploaded_to_this_item' => _x( 'Uploaded to this store', 'Overrides the “Uploaded to this post”/”Uploaded to this page” phrase (used when viewing media attached to a post). Added in 4.4', 'textdomain' ),
'filter_items_list' => _x( 'Filter stores list', 'Screen reader text for the filter links heading on the post type listing screen. Default “Filter posts list”/”Filter pages list”. Added in 4.4', 'textdomain' ),
'items_list_navigation' => _x( 'Stores list navigation', 'Screen reader text for the pagination heading on the post type listing screen. Default “Posts list navigation”/”Pages list navigation”. Added in 4.4', 'textdomain' ),
'items_list' => _x( 'Stores list', 'Screen reader text for the items list heading on the post type listing screen. Default “Posts list”/”Pages list”. Added in 4.4', 'textdomain' ),
);
$args = array(
'labels' => $labels,
'description' => 'Store custom post type.',
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'store' ),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 10,
'supports' => array( 'title', 'editor', 'thumbnail', 'custom-fields' ),
'menu_icon' => 'dashicons-location',
'show_in_rest' => true,
'register_meta_box_cb' => 'custom_store_metaboxes'
);
register_post_type('store', $args);
}
add_action('init', 'register_custom_store_post_type');
?>
字符串
我想插入记录在该领域的地址,纬度和经度请帮助我与此代码
这里是我的更新代码,根据您的评论和回复,我已经创建了我的新表:
<?php
/**
* Plugin Name: Store Plugin
* Plugin URI: https://example.com/my-plugin
* Description: This is a description of my hello world sample plugin.
* Version: 2.3.1
* Author: Khushbu
* Author URI: https://example.com
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
function db_active() {
global $wpdb;
$table = $wpdb->prefix . 'store_db';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table (
store_id int(20) AUTO_INCREMENT PRIMARY KEY,
store_name VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
image VARCHAR(255) NOT NULL,
address VARCHAR(255) NOT NULL,
latitude VARCHAR(10) NOT NULL,
longitude VARCHAR(10) NOT NULL
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
$result = dbDelta($sql);
}
register_activation_hook(__FILE__, 'db_active');
function db_deactive() {
global $wpdb;
$table = $wpdb->prefix . 'store_db';
$sql = "DROP TABLE $table;";
$wpdb->query($sql);
}
register_deactivation_hook(__FILE__, 'db_deactive');
function add_your_fields_meta_box() {
add_meta_box(
'your_custom_meta_box', // ID of the meta box
'Location Information', // Title of the meta box
'your_custom_meta_box_content', // Callback function to generate the content
'store_post', // Custom post type (your_post)
'normal', // Placement - 'normal', 'advanced', 'side'
'high' // Priority - 'high', 'core', 'default', 'low'
);
}
add_action('add_meta_boxes', 'add_your_fields_meta_box');
function create_post_your_post() {
register_post_type('store_post',
array(
'labels' => array(
'name' => __('Store Post'),
),
'public' => true,
'hierarchical' => true,
'has_archive' => true,
'supports' => array(
'title',
'editor',
'excerpt',
'thumbnail',
),
'taxonomies' => array(
'post_tag',
'category',
)
)
);
register_taxonomy_for_object_type('category', 'store_post');
register_taxonomy_for_object_type('post_tag', 'store_post');
}
add_action('init', 'create_post_your_post');
function your_custom_meta_box_content($post) {
$store_id = $post->ID;
$image = get_post_meta($store_id,'image',true);
$address = get_post_meta($store_id, 'address', true);
$latitude = get_post_meta($store_id, 'latitude', true);
$longitude = get_post_meta($store_id, 'longitude', true);
?>
<b><label for="your_meta_field">Image:</label></b>
<?php
if (!empty($image)) {
echo '<br><img src="' . esc_url($image) . '" style="max-width: 200px;" /><br>';
}
?>
<input type="file" name="your_meta_field[image]" id="your_meta_field[image]">
<?php
// Check if there's a previously saved image URL and display it in the file input field
if (!empty($image)) {
echo '<br><small>Previously chosen image: ' . esc_html($image) . '</small>';
} ?> <br><br>
<b><label for="your_meta_field">Address:</label></b>
<textarea name="your_meta_field[address]" id="your_meta_field[address]" rows="3" cols="30" style="width:500px;"><?php echo esc_attr($address);?></textarea><br><br>
<b><label for="your_meta_field">Latitude:</label></b>
<input type="text" name="your_meta_field[latitude]" id="your_meta_field[latitude]" value="<?php echo esc_attr($latitude); ?>"><br><br>
<b><label for="your_meta_field">Longitude:</label></b>
<input type="text" name="your_meta_field[longitude]" id="your_meta_field[longitude]" value="<?php echo esc_attr($longitude); ?>"><br><br>
<?php wp_nonce_field(basename(__FILE__), 'your_meta_box_nonce'); ?>
<?php
}
function save_your_custom_meta_box_data($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!isset($_POST['your_meta_box_nonce']) || !wp_verify_nonce($_POST['your_meta_box_nonce'], basename(__FILE__))) {
return;
}
if ('store_post' !== get_post_type($post_id)) {
return;
}
$meta_fields = isset($_POST['your_meta_field']) ? $_POST['your_meta_field'] : array();
if (isset($_FILES['your_meta_field']['name'])) {
$image_url = media_handle_upload('your_meta_field', $post_id);
if (!is_wp_error($image_url)) {
update_post_meta($post_id, 'image', $image_url);
}
}
if ( isset( $meta_fields['address'] ) ) {
update_post_meta( $post_id, 'address', sanitize_text_field( $meta_fields['address'] ) );
}
if ( isset( $meta_fields['latitude'] ) ) {
update_post_meta( $post_id, 'latitude', sanitize_text_field( $meta_fields['latitude'] ) );
}
if ( isset( $meta_fields['longitude'] ) ) {
update_post_meta( $post_id, 'longitude', sanitize_text_field( $meta_fields['longitude'] ) );
}
if (isset($meta_fields['image']) && isset($meta_fields['address']) && isset($meta_fields['latitude']) && isset($meta_fields['longitude'])) {
$store_name = get_the_title($post_id);
$description = get_post_field('post_content', $post_id);
$image = _sanitize_text_fields($meta_fields['image']);
$address = sanitize_text_field($meta_fields['address']);
$latitude = sanitize_text_field($meta_fields['latitude']);
$longitude = sanitize_text_field($meta_fields['longitude']);
global $wpdb;
$table = $wpdb->prefix . 'store_db';
$existing_record = $wpdb->get_row(
$wpdb->prepare("SELECT * FROM $table WHERE store_id = %d", $post_id)
);
if ($existing_record) {
// If a record exists, update the existing record
$wpdb->update(
$table,
array(
'store_name' => $store_name,
'description' => $description,
'image' => $image,
'address' => $address,
'latitude' => $latitude,
'longitude' => $longitude,
),
array('store_id' => $post_id),
array('%s', '%s', '%s', '%s', '%s', '%s'),
array('%d')
);
} else {
// If no record exists, insert a new record
$wpdb->insert(
$table,
array(
'store_id' => $post_id,
'store_name' => $store_name,
'description' => $description,
'image' => $image,
'address' => $address,
'latitude' => $latitude,
'longitude' => $longitude,
),
array('%d', '%s', '%s', '%s', '%s', '%s', '%s')
);
}
}
}
add_action('save_post', 'save_your_custom_meta_box_data');
// my changes completed
?>
型
1条答案
按热度按时间2jcobegt1#
我的天啊警钟在我的脑海里响个不停。请不要向核心表中添加列。为什么不呢?
wp_postmeta
表中的元数据。您也可以利用这一点并获得性能优势。有人在评论中指出,
wp_postmeta
表是放置数据的地方。这是正确的。您已经在使用update_post_meta()来完成这一操作,基本上是正确的。顺便说一下,WordPress插件的惯例是在 * 删除 * 插件时删除额外的数据,而不是在 * 停用 * 插件时删除。