gpt4 book ai didi

php - $wpdb 是空的,尽管它是全局的

转载 作者:可可西里 更新时间:2023-11-01 07:58:05 26 4
gpt4 key购买 nike

我正在开发一个需要创建数据库并将数据插入其中的插件,我已经完成了表创建部分,但是每当我尝试使用 $wpdb 插入时都会出现错误数据表明 insert() 无法在空对象上调用

这是一个最小版本:

<?php
/*
Plugin Name: Test
*/

function activation() {
global $wpdb;
$table_name = $wpdb->prefix . 'testing';
$charset_collate = $wpdb->get_charset_collate();

# create table
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
$sql = "CREATE TABLE " . $table_name . " (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name TEXT NOT NULL,
PRIMARY KEY (id)
) " . $charset_collate . ";";

require_once(ABSPATH . "wp-admin/includes/upgrade.php");
dbDelta($sql);
}
}

function html($atts) {
$out = "";
return "<form action='wp-content/plugins/test/submit.php' method='post'><input type='text' name='name'><input type='submit' name='submit'></form>";
}

# setup and cleanup hooks
register_activation_hook(__FILE__, "activation");
add_shortcode('testing', 'html');

这是表单提交文件:

<?php

function handle() {
global $wpdb;

if (isset($_POST['submit'])) {
$wpdb->insert('wp_testing', array('name' => "test"));
}
}

handle();

我读了这个问题:$wpdb is null even after 'global $wpdb很不清楚,但似乎表明 $wpdb 必须在一个函数中使用,所以我把它包装在一个函数中。关于这是为什么的任何想法?

最佳答案

修复如果您在不加载 WordPress 的情况下直接将表单发布到 PHP 文件,除非您需要 wp-load.php,否则它的任何功能都将不可用。这就是 add_action$wpdb 未定义的原因。

有关在 WordPress 中发布表单的详细信息和其他方式,请参阅下面的评论和原始答案。

原始答案您似乎没有将 handle() 函数绑定(bind)到任何 Hook ,因此它正在加载和运行,因为 WordPress 包含必要的文件,但在它实际加载之前 $wpdb。这就是 $wpdb 没有定义的原因——它还不存在。试试这个:

<?php
function handle() {
global $wpdb;

if( isset( $_POST[ 'submit' ] ) ){
$wpdb->insert( 'wp_testing', array( 'name' => 'test' ) );
}
}

//handle();
add_action( 'init', 'handle' );

我还会考虑为 handle() 函数添加前缀(或者更好的是,将其包装在一个类中)以避免命名冲突。像这样的东西:

<?php
function jacob_morris_handle() {
global $wpdb;

if( isset( $_POST[ 'submit' ] ) ){
$wpdb->insert( 'wp_testing', array( 'name' => 'test' ) );
}
}

//handle();
add_action( 'init', 'jacob_morris_handle' );

<?php
class JacobMorris {
function handle() {
global $wpdb;

if( isset( $_POST[ 'submit' ] ) ){
$wpdb->insert( 'wp_testing', array( 'name' => 'test' ) );
}
}

function __construct(){
add_action( 'init', array( $this, 'handle' ) );
}
}
new JacobMorris();

关于php - $wpdb 是空的,尽管它是全局的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42288109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com