php - 最近在插件中创建的 PHP 文件未运行 WordPress PHP 函数

标签 php mysql wordpress http-post

更新

在仔细查看此问题是如何复制后,我发现我已将表单处理程序脚本包含在 require_once 中。我的主要依赖处理程序脚本中的语句。 $wpdb当脚本加载到网站的管理或公共(public)页面上时,类只会使用硬编码的值数组启动。一旦我从依赖脚本中取出文件,$wpdb无论是否有硬编码值,问题都变得一致。我得出的结论是,问题在于该文件与 WordPress 其余部分的连接(?),因为它甚至没有响应像 get_header(); 这样的核心功能。或get_footer(); ,它的作用就像一个独立的 PHP 文件。

我已重新启动 Apache 和 MySQL 以确保服务器是最新的。

我的主要插件文件包含在 /wp-content/plugins/myplugin

呈现表单的短代码函数包含在 /wp-content/plugins/myplugin/shortcodes/ 中。

被调用来处理表单的脚本位于 /wp-content/plugins/myplugin/processes/

原始问题:wpdb INSERT 适用于示例数组,但不适用于相同的 $_POST 数组

我正在创建一个自定义表单,仅供管理员在前端使用。这样做的目的是将一笔费用记录到mysql的数据库表中。我尝试了多种创建查询的方法,使用 wpdb->insertwpdb->prepare但它不适用于 $_POST超全局化。

我创建了一个名为 $sample_data 的相同硬编码数组,并以完全相同的方式迭代它。使用各种后echovar_dump语句,我发现全局变量 $wpdb如果我使用 $_POST 则不会启动,但如果 $_POST 则效果很好未包含在我的代码中。

我对此很陌生,所以我想了解我做错了什么以及为什么这不起作用。任何帮助将不胜感激。

这是我正在使用的设置:

Ubuntu 18.04.01 本地主机、WordPress 5.2.4、PHP 7.2、MySQL 5.7.27、Apache 2.4.29

我的 WordPress 安装中安装的唯一事件插件是我正在使用的插件,并且我正在运行应用了简单 CSS 样式的 Underscores 主题。

这是我的代码供您引用:

$table_name = $wpdb->prefix.'expenses';

if(isset($_POST['submit'])){
    foreach($_POST as $post_object => $post_value){
        if($post_value != NULL && $post_value !== 'submit'){
            $post_object_array[] = $post_object;
            $post_placeholder_array[] = '%s';
            $post_value_array[] = $post_value;
        }
    }
    $table_columns = "(".implode(', ', $post_object_array).")";
    $table_placeholders = "(".implode(', ', $post_placeholder_array).")";
    $query_builder = "INSERT INTO bsynfs_expenses $table_columns VALUES $table_placeholders";
    $prepare_query = $wpdb->prepare($query_builder, $post_value_array);
    $result = $wpdb->query($prepare_query);
}

这是我的 form是在前端编码的。它是我的插件中短代码 .php 文件的一部分:

  <form id="add_expense" action="<?php echo($plugin_directory_url.'processes/expense-process.php'); ?>" method="post">
        <input type="text" name="expense_type" value="" placeholder="expense_type">
            <input type="text" name="grocery_vendor" value="" placeholder="grocery_vendor">
            <input type="text" name="laundry_vendor" value="" placeholder="laundry_vendor">
            <input type="text" name="product_skus" value="" placeholder="product_skus">
            <input type="text" name="expense_reference" value=""  placeholder="expense_reference">
            <input type="text" name="expense_description" value="" placeholder="expense_description">
            <input type="submit" name="submit" value="submit" id="add_expense_submit">

最佳答案

试试这个,对我来说它在这里有效。 1 - 在模板中创建一个文件并添加此代码,然后在管理中创建一个页面并选择模板“测试”或任何您想要的名称。

然后测试一下

<?php 
/*
    Template Name: Teste
*/
global $wpdb;
$table_name = $wpdb->prefix.'expenses';

if(isset($_POST['submit'])){
    echo "<pre>";
    print_r($_POST);
    echo "</pre>";
    exit();

    foreach($_POST as $post_object => $post_value){
        if($post_value != NULL && $post_value !== 'submit'){
            $post_object_array[] = $post_object;
            $post_placeholder_array[] = '%s';
            $post_value_array[] = $post_value;
        }
    }
    $table_columns = "(".implode(', ', $post_object_array).")";
    $table_placeholders = "(".implode(', ', $post_placeholder_array).")";
    $query_builder = "INSERT INTO bsynfs_expenses $table_columns VALUES $table_placeholders";
    $prepare_query = $wpdb->prepare($query_builder, $post_value_array);
    $result = $wpdb->query($prepare_query);
}

get_header();
?>
 <form id="add_expense" action="<?php echo get_permalink(); ?>" method="POST">
    <input type="text" name="expense_type" value="" placeholder="expense_type">
    <input type="text" name="grocery_vendor" value="" placeholder="grocery_vendor">
    <input type="text" name="laundry_vendor" value="" placeholder="laundry_vendor">
    <input type="text" name="product_skus" value="" placeholder="product_skus">
    <input type="text" name="expense_reference" value=""  placeholder="expense_reference">
    <input type="text" name="expense_description" value="" placeholder="expense_description">
    <input type="submit" name="submit" value="submit" id="add_expense_submit">
</form>
<?php 
get_footer();

或在文件/wp-content/plugins/myplugin/processes/中:

<?php
require_once '../../../wp-load.php';


global $wpdb;
$table_name = $wpdb->prefix.'expenses';

if(isset($_POST['submit'])){
echo "<pre>";
print_r($_POST);
echo "</pre>";
exit();

foreach($_POST as $post_object => $post_value){
    if($post_value != NULL && $post_value !== 'submit'){
        $post_object_array[] = $post_object;
        $post_placeholder_array[] = '%s';
        $post_value_array[] = $post_value;
    }
}
$table_columns = "(".implode(', ', $post_object_array).")";
$table_placeholders = "(".implode(', ', $post_placeholder_array).")";
$query_builder = "INSERT INTO bsynfs_expenses $table_columns VALUES $table_placeholders";
$prepare_query = $wpdb->prepare($query_builder, $post_value_array);
$result = $wpdb->query($prepare_query);

}

关于php - 最近在插件中创建的 PHP 文件未运行 WordPress PHP 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58585784/

相关文章:

java - 检查 '0000-00-00' 的时间戳,无需转换

javascript - 如何防止正文通过推送侧菜单滚动

php - Cron php从另一个sql表更新/插入一个sql表并从旧表中删除数据

php - 使用 AuthType Basic 登录后的 .htaccess 500 错误

php - PDO插入相同数据两次

php - SQL 排序方式 ... ASC

php - 从我的在线网络应用程序触发物理 'police' 光

javascript - JS、PHP、MySQL 数学运算的代码错误

php - Debian Linux、PHP、Apache 和 MySQL 上的 CodeIgniter 和 WordPress 应用程序的升级过程

javascript - 如果选中,则显示/隐藏 UL 子项