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' );