草庐IT

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

coder 2023-10-17 原文

我正在开发一个需要创建数据库并将数据插入其中的插件,我已经完成了表创建部分,但是每当我尝试使用 $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/

有关php - $wpdb 是空的,尽管它是全局的的更多相关文章

  1. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  2. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

  3. ruby - 在 RSpec 中 stub /模拟全局常量 - 2

    我有一个gem,它有一个根据Rails.env的不同行为的方法:defself.envifdefined?(Rails)Rails.envelsif...现在我想编写一个规范来测试这个代码路径。目前我是这样做的:Kernel.const_set(:Rails,nil)Rails.should_receive(:env).and_return('production')...没关系,只是感觉很丑。另一种方法是在spec_helper中声明:moduleRails;end而且效果也很好。但也许有更好的方法?理想情况下,这应该有效:rails=double('Rails')rails.sho

  4. ruby - 将全局 $stdout 重新分配给控制台 - ruby - 2

    我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r

  5. ruby - 在模块/类之间共享全局记录器 - 2

    在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

  6. ruby - Sinatra 中的全局救援和日志记录异常 - 2

    如何在出现异常时指定全局救援,如果您将Sinatra用于API或应用程序,您将如何处理日志记录? 最佳答案 404可以在not_found方法的帮助下处理,例如:not_founddo'Sitedoesnotexist.'end500s可以通过调用带有block的错误方法来处理,例如:errordo"Applicationerror.Plstrylater."end错误的详细信息可以通过request.env中的sinatra.error访问,如下所示:errordo'Anerroroccured:'+request.env['si

  7. ruby - 为什么允许在 Ruby 类之外定义全局方法? - 2

    我读过这个:Let’sstartwithasimpleRubyprogram.We’llwriteamethodthatreturnsacheery,personalizedgreeting.defsay_goodnight(name)result="Goodnight,"+namereturnresultend我的理解是,方法是定义在类中的函数或子程序,可以关联到类(类方法)或对象(实例方法)。那么,如果它不是在类中定义的,怎么可能是方法呢? 最佳答案 当你在Ruby中以这种方式在全局范围内定义一个函数时,它在技术上变成了Obje

  8. ruby - Array.reject!,它是如何工作的? - 2

    我今天制作了一个非常小的ruby​​脚本,它使用正则表达式来跟踪具有特定名称的文件中的某些内容,并在添加其替换内容之前删除该内容。(否则在迭代过程中会出现问题)。我不太习惯使用ruby​​(自从1-2周前我的假期工作开始后才开始使用它),但我的一个习惯是在迭代时避免接触列表(或大多数其他使用索引的ADT)在它们之上(删除某些内容),与我使用的语言无关。经过一些搜索,我发现了一些可以提供帮助的Array函数。现在,我正在使用Array.reject!并且脚本按照我希望的方式运行,但老实说我无法弄清楚为什么Array.reject!{|行|line=~regex}跳过数组中的对象没有问题。

  9. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  10. ruby - Sinatra 路由中定义的全局变量是否在请求之间共享? - 2

    假设我有:get'/'do$random=Random.rand()response.body=$randomend如果我每秒有数千个请求到达/,$random是否会被共享并“泄漏”到上下文之外,或者它会像getblock的“本地”变量一样?我想如果它是在get'/'do的上下文之外定义的,它确实会被共享,但我想知道在ruby​​中是否有我不知道的$机制。 最佳答案 ThispartoftheSinatraREADMEaboutscopeisalwayshelpfultoread但是,如果您只需要为请求保留变量,那么我认为我建议使用

随机推荐