WordPress 主题 functions.php $wpdb->insert create duplicates
WordPress theme functions.php $wpdb->insert create duplicates
我正在为 WordPress 创建自定义主题,并在首页上使用来自 Google 地图和 Yelp 服务的解析评论。我在 functions.php 文件中创建了两个函数来创建 评论 table 并填充来自 的数据reviews.json 文件,但是当我切换我的 WordPress 主题时,我注意到所有这些评论都重复了甚至四次。
function create_reviews_db_table() {
global $wpdb;
$reviews_table = $wpdb->prefix . "theme_reviews";
if($wpdb->get_var("SHOW TABLES LIKE '$reviews_table'") != $reviews_table) {
$sql = "CREATE TABLE $reviews_table (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
review_type varchar(10) NOT NULL,
author varchar(50) NOT NULL,
author_avatar_url varchar(255) NOT NULL,
review_date DATE NOT NULL,
review_text TEXT DEFAULT NULL,
review_rating int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
dbDelta( $sql );
}
}
function fill_reviews_table_with_data() {
global $wpdb;
$reviews_table = $wpdb->prefix . "theme_reviews";
if($wpdb->get_var("SELECT * FROM '$reviews_table'") == 0) {
$reviews_json = file_get_contents(__DIR__ . '/assets/reviews/reviews.json');
$decoded_json = json_decode($reviews_json, false);
foreach( $decoded_json->reviews as $value ) {
$wpdb->insert($reviews_table, array(
'review_type' => $value->type,
'author' => $value->author,
'author_avatar_url' => $value->author_avatar,
'review_date' => $value->date,
'review_text' => $value->text,
'review_rating' => (int)$value->rating
));
}
}
}
add_action("after_setup_theme", 'create_reviews_db_table');
add_action("after_setup_theme", "fill_reviews_table_with_data");
MySQL 8.0.25 & PHP 8.0.7
我做错了什么?
我认为你应该在一个函数中完成这一切,这样它就会触发,创建 table,并在一个 'swoop' 中提取数据 - 完成后,如果你 activate/re-activate 主题...如果 table 存在,那么数据应该在那里。
我的意思是,您可以添加一个简单的 if !($wpdb->get_row("SELECT * from $reviews_table WHERE id = '1';"))
来确保 table 中有数据。
此外,我认为这就是您正在寻找的挂钩 https://developer.wordpress.org/reference/hooks/switch_theme/,它更像是一个插件激活脚本,但用于主题。
<?php
function create_reviews_db_table() {
global $wpdb;
$reviews_table = $wpdb->prefix . "theme_reviews";
$sql = "CREATE TABLE IF NOT EXISTS $reviews_table (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
review_type varchar(10) NOT NULL,
author varchar(50) NOT NULL,
author_avatar_url varchar(255) NOT NULL,
review_date DATE NOT NULL,
review_text TEXT DEFAULT NULL,
review_rating int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
dbDelta( $sql );
if (null === $wpdb->get_row("SELECT * from $reviews_table WHERE id = '1';")){
$reviews_json = file_get_contents( __DIR__ . '/assets/reviews/reviews.json' );
$decoded_json = json_decode( $reviews_json, false );
foreach ( $decoded_json->reviews as $value ) {
$wpdb->insert( $reviews_table, array(
'review_type' => $value->type,
'author' => $value->author,
'author_avatar_url' => $value->author_avatar,
'review_date' => $value->date,
'review_text' => $value->text,
'review_rating' => (int)$value->rating
) );
}
}
}
add_action( "switch_theme", 'create_reviews_db_table' );
我正在为 WordPress 创建自定义主题,并在首页上使用来自 Google 地图和 Yelp 服务的解析评论。我在 functions.php 文件中创建了两个函数来创建 评论 table 并填充来自 的数据reviews.json 文件,但是当我切换我的 WordPress 主题时,我注意到所有这些评论都重复了甚至四次。
function create_reviews_db_table() {
global $wpdb;
$reviews_table = $wpdb->prefix . "theme_reviews";
if($wpdb->get_var("SHOW TABLES LIKE '$reviews_table'") != $reviews_table) {
$sql = "CREATE TABLE $reviews_table (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
review_type varchar(10) NOT NULL,
author varchar(50) NOT NULL,
author_avatar_url varchar(255) NOT NULL,
review_date DATE NOT NULL,
review_text TEXT DEFAULT NULL,
review_rating int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
dbDelta( $sql );
}
}
function fill_reviews_table_with_data() {
global $wpdb;
$reviews_table = $wpdb->prefix . "theme_reviews";
if($wpdb->get_var("SELECT * FROM '$reviews_table'") == 0) {
$reviews_json = file_get_contents(__DIR__ . '/assets/reviews/reviews.json');
$decoded_json = json_decode($reviews_json, false);
foreach( $decoded_json->reviews as $value ) {
$wpdb->insert($reviews_table, array(
'review_type' => $value->type,
'author' => $value->author,
'author_avatar_url' => $value->author_avatar,
'review_date' => $value->date,
'review_text' => $value->text,
'review_rating' => (int)$value->rating
));
}
}
}
add_action("after_setup_theme", 'create_reviews_db_table');
add_action("after_setup_theme", "fill_reviews_table_with_data");
MySQL 8.0.25 & PHP 8.0.7
我做错了什么?
我认为你应该在一个函数中完成这一切,这样它就会触发,创建 table,并在一个 'swoop' 中提取数据 - 完成后,如果你 activate/re-activate 主题...如果 table 存在,那么数据应该在那里。
我的意思是,您可以添加一个简单的 if !($wpdb->get_row("SELECT * from $reviews_table WHERE id = '1';"))
来确保 table 中有数据。
此外,我认为这就是您正在寻找的挂钩 https://developer.wordpress.org/reference/hooks/switch_theme/,它更像是一个插件激活脚本,但用于主题。
<?php
function create_reviews_db_table() {
global $wpdb;
$reviews_table = $wpdb->prefix . "theme_reviews";
$sql = "CREATE TABLE IF NOT EXISTS $reviews_table (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
review_type varchar(10) NOT NULL,
author varchar(50) NOT NULL,
author_avatar_url varchar(255) NOT NULL,
review_date DATE NOT NULL,
review_text TEXT DEFAULT NULL,
review_rating int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
dbDelta( $sql );
if (null === $wpdb->get_row("SELECT * from $reviews_table WHERE id = '1';")){
$reviews_json = file_get_contents( __DIR__ . '/assets/reviews/reviews.json' );
$decoded_json = json_decode( $reviews_json, false );
foreach ( $decoded_json->reviews as $value ) {
$wpdb->insert( $reviews_table, array(
'review_type' => $value->type,
'author' => $value->author,
'author_avatar_url' => $value->author_avatar,
'review_date' => $value->date,
'review_text' => $value->text,
'review_rating' => (int)$value->rating
) );
}
}
}
add_action( "switch_theme", 'create_reviews_db_table' );