Woocommerce:数据库恢复后可下载的文件消失

时间:2015-04-14 18:51:30

标签: php mysql wordpress woocommerce database-restore

恢复我的WordPress WooCommerce数据库后,我的虚拟产品的所有可下载文件都已消失。

我查询了wp_postmeta表格,看到_downloadable_files条目仍在那里,我已经确认表格中的网址仍然有效。

但是,这些文件不再显示为订单电子邮件中的链接,不再显示在我的帐户页面中,也不再显示在可下载文件部分中修改产品中的产品数据

我所知道的唯一解决方法是手动重新输入所有文件。

我正在使用Apache2和MySQL。这些文件存储在为WordPress提供服务的同一台Apache服务器上。

我正在尝试将开发数据库从不同的开发服务器复制到新环境 我试图找到一种有效的方法来做到这一点,而无需手动重新输入所有可下载的文件。

2 个答案:

答案 0 :(得分:0)

深入研究这个问题我认为问题在于WooCommerce正在生成一个关于可下载文件URL的MD5,它不会从一台服务器转移到另一台服务器。

查看WordPress wp_postmeta表中的数据,我看到了

mysql> SELECT post_id,meta_value FROM wordpress.wp_postmeta where meta_key='_downloadable_files';
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| post_id | meta_value                                                                                                                                                                                            |
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|      33 | a:1:{s:32:"fccc91f867cc071737bea5433d1c3181";a:2:{s:4:"name";s:3:"fox";s:4:"file";s:61:"http://_123456789_.com/wp-content/uploads/2015/03/fox.png";}}  

我的猜测是,当数据库传输到新主机时,fccc91f867cc071737bea5433d1c3181值在某种程度上无法识别为有效。

要解决这个问题,我编写了一个PHP脚本来读取数据库,然后使用WooCommerce REST API通过Gerhard Potgieter的WooCommerce REST API PHP client重新加载可下载文件。

<?php

error_reporting( E_ALL );
ini_set( 'display_errors', 'On' );
require_once "class-wc-api-client.php";

$consumer_key = 'ck_examplexxx'; // Add your own Consumer Key here
$consumer_secret = 'cs_secretxxx'; // Add your own Consumer Secret here
$store_url = 'http://123456789/'; // Add the home URL to the store you want to connect to here

// Initialize the class
$wc_api = new WC_API_Client( $consumer_key, $consumer_secret, $store_url );

$servername = "_dbhost_";
$username = "wordpress";
$password = "__password__";
$dbname = "wordpress";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT post_id,meta_value FROM wordpress.wp_postmeta where meta_key='_downloadable_files'";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  // output data of each row
  while($row = $result->fetch_assoc()) {
    $product_id = $row["post_id"];
    $meta_value = $row["meta_value"];
    preg_match("/.+\:\"(http:\/\/.+\/wp-content\/uploads\/.+\/.+\/(.+)\..+)\".+/", $meta_value, $m);
    print_r( $wc_api->update_product( $product_id, '{
          "product": {
            "downloads": [
              {
                "name": "' . $m[2] . '",
                "file": "' . $m[1] . '"
              }
            ]
          }
        }'));
  }
} else {
  echo "0 results";
}
$conn->close();

答案 1 :(得分:0)

我有同样的问题。 通过使用答案并使用update_post_meta()而不是WooCommerce REST API修复了该问题

$sql = "SELECT post_id,meta_value FROM wp_postmeta where meta_key='_downloadable_files'";
$result = $conn->query($sql);

if ($result->num_rows > 0) 
{
  // output data of each row
  while($row = $result->fetch_assoc()) 
  {
    $product_id = $row["post_id"];
    $meta_value = $row["meta_value"];

    $v = explode("\"", $meta_value);

    $results = array_filter($v, function($value) {
        return strpos($value, 'https') !== false;
    });

    $file_path =  array_pop($results); 

    preg_match("/.+\:\"(https:\/\/.+\/wp-content\/uploads\/.+\/.+\/(.+)\..+)\".+/", $meta_value, $mn);

    $file_name = $mn[2];
    $md5_num =  md5( $m );

    $abe_file = array();
     $abe_file[0][$md5_num] = array(
        'name'   =>  $file_name,
        'file'   =>  $file_path
    );

    if(update_post_meta( $product_id, '_downloadable_files', $abe_file[0] ))
    {
        echo "$product_id . yay <br/>";
    }
    else{echo "waz <br/>";}


  }



} else {
  echo "0 results";
}
$conn->close();