何时使用操作挂钩和插件

时间:2017-04-13 作者:mrfr

我有一个页面,我希望用户能够发布信息,然后我上传到数据库。我通过ajax处理请求,并试图通过一个动作挂钩建立数据库连接和sql查询。首先,这是一个好的做法吗?

我的代码(相关部分):

HTML:

<div id="user_info">
    <input class="form-control" type="text" id="name" placeholder="Fullständigt namn" required autocomplete="off"/>
    <input class="form-control" type="text" id="email" placeholder="Email" required autocomplete="off"/>
    <input class="form-control" type="text" id="address" placeholder="Adress" required autocomplete="off"/>
    <input class="form-control" type="text" id="co_address" placeholder="C/O Adress"  autocomplete="off"/>
    <input class="form-control" type="text" id="city" placeholder="Namn" required autocomplete="off"/>
</div>
JS公司:

function updateDB(name, email, address, co_address, city){
    $.ajax({
        url: \'/wp-admin/admin-ajax.php\',
        type: \'post\',
        dataType: \'json\',
        data: {
            action: \'det_lilla_extra\',
            name: name,
            email: email,
            address: address,
            co_address: co_address,
            city: city
        },
    });
PHP(动作挂钩):

<?php

add_action(\'wp_ajax_det_lilla_extra\', \'det_lilla_extra\');
add_action( \'wp_ajax_nopriv_det_lilla_extra\', \'det_lilla_extra\' );
function det_lilla_extra(){
    global $wpdb;
    //var_dump($_POST);
    $wpdb->insert($wpdb->prepare("INSERT INTO orders (name, email, address, co_address, city) VALUES (\'%s\',\'%s\',\'%s\',\'%s\',\'%s\')",
    $_POST[\'name\'], $_POST[\'email\'], $_POST[\'address\'], $_POST[\'co_address\'], $_POST[\'city\']));
    wp_die();
}
通过关注和观察其他人,我已经能够做到这一点。但我现在的问题是,为了让我的动作挂钩工作,我需要创建一个插件。我不知道该怎么做,我一直在谷歌上搜索turorials,但我真的不知道该找什么,所以很难确定该怎么做。

所以我的问题是:

这是我所做的“好”实践吗?我可以用另一种方法来做吗(关于数据库连接的操作挂钩)

我需要一个插件吗?如果是这样,我该如何着手创建它?

另外:由于我没有启用插件(我想这就是原因),目前我的动作挂钩无法工作。但其他一切都应该奏效。

1 个回复
最合适的回答,由SO网友:Swen 整理而成

首先,请参阅WordPress Codex页面:AJAX in Plugins

从技术上讲,你不需要编写插件来完成你想做的事情,但这样做是一种很好的做法,尤其是对于你正在构建的功能。(构建数据库表、处理表单数据、使用AJAX提交等)签出Writing a Plugin 了解更多信息。

话虽如此,我现在看到了您的代码存在的主要问题。

安全风险现在,您假设用户提交的数据总是正确的。这具有极高的安全风险。你应该always 假设用户试图输入错误的数据。为了使代码更安全,您应该先验证数据,然后再将其插入数据库。

下面是验证$_POST[\'name\'] 字段,如果数据“无效”,则发送json错误。

if ( !isset($_POST[\'name\'] || strlen($_POST[\'name\']) > 30 ) {
    // Check if \'name\' is set, and the length is shorter than 30
    wp_send_json_error( \'Error: Your name should be no longer than 30 characters\' );
}
使用$wpdb->prepare 对于原始SQL查询,实际上$wpdb->insert 作用请参见Class Reference/wpdb 有关如何使用的示例$wpdb->insert.

我也用了正确的方法insert 在下面的示例中。

首先,我们要将Javascript排队,以便WordPress可以使用它。我们也在通过ajaxurl (admin ajax.php)通过此处,以便在Javascript中轻松使用。

function your_submit_order_scripts) {
    // Register your Javascript file
    wp_register_script( \'your-submit-order\', plugin_dir_url(__FILE__) . \'js/your-submit-order.js\', array( \'jquery\' ), false, true );

    // Send ajaxurl as variable to this script
    $local_arr = array(
        \'ajaxurl\'   => admin_url( \'admin-ajax.php\' )
    );

    wp_localize_script( \'your-submit-order\', \'yourSubmitOrder\', $local_arr );
    wp_enqueue_script( \'your-submit-order\' );
}
add_action( \'wp_enqueue_scripts\', \'your_submit_order_scripts\' );
接下来,我们添加回调,这将处理我们使用AJAX发布的数据。add\\u操作部分确保我们的AJAX post函数知道将数据发送到哪里。

// Use this callback function for logged in users
add_action(\'wp_ajax_det_lilla_extra\', \'det_lilla_extra\');

// Also allow this function to be used by non-logged in users
add_action( \'wp_ajax_nopriv_det_lilla_extra\', \'det_lilla_extra\' );

function det_lilla_extra(){

    // Convert form data to array
    $formdata = array();
    parse_str($_POST[\'formdata\'], $formdata);

    // Check if name field is valid
    if ( !isset($formdata[\'name\'] || strlen($formdata[\'name\']) > 30 ) {
        // Check if \'name\' is set, and the length is shorter than 30
        wp_send_json_error( \'Error: Your name should be no longer than 30 characters\' );
    }

    // More validation goes here depending on your needs...
    // For example, is the email address a real email?
    // Is the address written in the correct format?
    // Is the city a real city?

    // If validation has no errors, insert data
    if ( $wpdb->insert( 
            \'orders\', 
            array( 
                \'name\' => $_POST[\'name\'], 
                \'email\' => $_POST[\'email\',
                // etc.
            ), 
            array( 
                \'%s\', 
                \'%s\',
                // etc.
            ) 
        ) 
    ) {
        // If $wpdb->insert was successful, send success message back to AJAX updateDB function
        wp_send_json_success(array(\'message\' => \'Successfully uploaded!\');

    } else {
        // If insert was unsuccessfull, send error message back to AJAX
        wp_send_json_error(\'Error: Something went wrong\');
    }

    // Don\'t technically need it when using wp_send_json
    wp_die();
}
最后,我们制作Javascript。我已经更新了updateDB函数,使其工作方式与上面链接的WordPress Codex页面上发布的示例类似。

此外,由于您使用HTML表单输入数据,因此我们可以使用jQueryserialize() 使事情变得更简单。

function updateDB() {
    // Create the data to send with AJAX
    var data = {
        \'action\': \'det_lilla_extra\',
        \'formdata\': $(\'form\').serialize() // Convert entire form to data
    };

    // Note how we use yourSubmitOrder.ajaxurl to pass the url to admin-ajax.php
    // We set this our your_submit_order_scripts function earlier
    jQuery.post(yourSubmitOrder.ajaxurl, data, function(response) {
        if ( reponse.success == true ) {
            alert(response.data.message);
        } else {
            alert(response.data);
        }
    });
}
我可能花了太多时间来写这个答案,但希望它对你有用。我已经花了很多时间找出在WordPress中使用AJAX的最佳方法,所以我认为这是对每一位教过我的人和资源的回馈!

如果有任何不清楚的地方,请随时发表评论。

相关推荐

WordPress AJAX错误400向远程站点发送数据的错误请求

我正在使用发件人。net获取电子邮件订阅列表。这个网站给了我一些信息,可以将用户的电子邮件添加到订阅列表中。我想使用WordPress ajax来实现这一点。但它返回错误400错误请求。我的代码是:文件ajax新闻脚本。js公司: jQuery(document).ready(function($){ // Perform AJAX send news on form submit $(\'form#fnews\').on(\'submit\', funct