1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
<?php namespace Automattic\WooCommerce\Blocks;
/** * Installer class. * Handles installation of Blocks plugin dependencies. * * @internal */ class Installer { /** * Initialize class features. */ public function init() { add_action( 'admin_init', array( $this, 'install' ) ); add_filter( 'woocommerce_create_pages', array( $this, 'create_pages' ) ); }
/** * Installation tasks ran on admin_init callback. */ public function install() { $this->maybe_create_tables(); }
/** * Modifies default page content replacing it with classic shortcode block. * We check for shortcode as default because after WooCommerce 8.3, block-based checkout is used by default. * This only runs on Tools > Create Pages as the filter is not applied on WooCommerce plugin activation. * * @param array $pages Default pages. * @return array */ public function create_pages( $pages ) {
if ( '<!-- wp:shortcode -->[woocommerce_cart]<!-- /wp:shortcode -->' === ( $pages['cart']['content'] ?? null ) ) { $pages['cart']['content'] = '<!-- wp:woocommerce/classic-shortcode {"shortcode":"cart"} /-->'; }
if ( '<!-- wp:shortcode -->[woocommerce_checkout]<!-- /wp:shortcode -->' === ( $pages['checkout']['content'] ?? null ) ) { $pages['checkout']['content'] = '<!-- wp:woocommerce/classic-shortcode {"shortcode":"checkout"} /-->'; }
return $pages; }
/** * Set up the database tables which the plugin needs to function. */ public function maybe_create_tables() { global $wpdb;
$schema_version = 260; $db_schema_version = (int) get_option( 'wc_blocks_db_schema_version', 0 );
if ( $db_schema_version >= $schema_version && 0 !== $db_schema_version ) { return; }
$show_errors = $wpdb->hide_errors(); $table_name = $wpdb->prefix . 'wc_reserved_stock'; $collate = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : ''; $exists = $this->maybe_create_table( $wpdb->prefix . 'wc_reserved_stock', " CREATE TABLE {$wpdb->prefix}wc_reserved_stock ( `order_id` bigint(20) NOT NULL, `product_id` bigint(20) NOT NULL, `stock_quantity` double NOT NULL DEFAULT 0, `timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `expires` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`order_id`, `product_id`) ) $collate; " );
if ( $show_errors ) { $wpdb->show_errors(); }
if ( ! $exists ) { return $this->add_create_table_notice( $table_name ); }
// Update succeeded. This is only updated when successful and validated. // $schema_version should be incremented when changes to schema are made within this method. update_option( 'wc_blocks_db_schema_version', $schema_version ); }
/** * Create database table, if it doesn't already exist. * * Based on admin/install-helper.php maybe_create_table function. * * @param string $table_name Database table name. * @param string $create_sql Create database table SQL. * @return bool False on error, true if already exists or success. */ protected function maybe_create_table( $table_name, $create_sql ) { global $wpdb;
if ( in_array( $table_name, $wpdb->get_col( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ), 0 ), true ) ) { return true; }
$wpdb->query( $create_sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
return in_array( $table_name, $wpdb->get_col( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ), 0 ), true ); }
/** * Add a notice if table creation fails. * * @param string $table_name Name of the missing table. */ protected function add_create_table_notice( $table_name ) { add_action( 'admin_notices', function() use ( $table_name ) { echo '<div class="error"><p>'; printf( /* translators: %1$s table name, %2$s database user, %3$s database name. */ esc_html__( 'WooCommerce %1$s table creation failed. Does the %2$s user have CREATE privileges on the %3$s database?', 'woocommerce' ), '<code>' . esc_html( $table_name ) . '</code>', '<code>' . esc_html( DB_USER ) . '</code>', '<code>' . esc_html( DB_NAME ) . '</code>' ); echo '</p></div>'; } ); } }
|