【问题标题】:WordPress theme functions.php $wpdb->insert create duplicatesWordPress 主题 functions.php $wpdb->insert 创建重复项
【发布时间】:2021-08-24 23:15:47
【问题描述】:

我正在为 WordPress 创建一个自定义主题,其中包含来自 Google 地图和 Yelp 服务的首页上的已解析评论。我在 functions.php 文件中创建了两个函数来创建一个 reviews 表 并从 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

我做错了什么?

【问题讨论】:

  • 每次页面加载都会调用你的函数。请改用 cron。
  • @HowardE 确实如此,似乎 'after_setup_theme' 钩子做的事情与我想象的完全不同。谢谢!你可以发布一个答案,我会标记它。
  • 您希望多久执行一次?
  • @HowardE,一旦安装了主题或切换回此主题。我想我找到了正确的钩子:“after_switch_theme”你怎么看?

标签: php wordpress wordpress-theming


【解决方案1】:

我认为您应该在一个函数中完成所有这些操作,这样它就可以立即触发、创建表格并“一举”提取数据 - 完成后,如果您激活/重新激活主题.. . 如果表存在,那么数据应该在那里。

我的意思是,您可以添加一个简单的if !($wpdb->get_row("SELECT * from $reviews_table WHERE id = '1';")) 以确保表格中有数据。

另外,我认为这是您正在寻找的钩子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' );

【讨论】:

  • 谢谢!标记为已回答。
  • 我希望这能满足您的需求。如果您愿意,也可以点赞。
  • 当我的声誉更高时会这样做,我只能在 15 分或更高时这样做。
猜你喜欢
  • 2017-03-04
  • 2012-09-07
  • 1970-01-01
  • 2015-07-18
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多