带有数据库(mysql)查询的 WordPress 插件

Posted

技术标签:

【中文标题】带有数据库(mysql)查询的 WordPress 插件【英文标题】:WordPress plugin with database (mysql) query 【发布时间】:2014-03-01 02:12:51 【问题描述】:

我正在尝试创建一个插件,但遇到了一个小问题。

该插件包含一个简单的管理页面,其中包含用于执行功能的复选框。 所以我创建了一个在安装插件时创建一个新表的函数。 该表包含 3 列(ID、字段、状态):

global $wpdb;
$mnzwpc_table_prefix=$wpdb->prefix.'mnzwpc_';
define('MNZWPC_TABLE_PREFIX', $mnzwpc_table_prefix);

function mnzwpc_install() 
    global $wpdb;
    $table = MNZWPC_TABLE_PREFIX."settings";
    $structure = "CREATE TABLE $table (
        id INT(9) NOT NULL AUTO_INCREMENT,
        field VARCHAR(50) NOT NULL,
        state VARCHAR(50) NOT NULL,
        UNIQUE KEY id (id)
    )";
    $wpdb->query($structure);

    $wpdb->query("INSERT INTO $table(field,state)
        VALUES('setting','')
    ");

这里没有问题,表是在我安装插件时创建的,在我卸载时删除。

我的问题来自我的输入”。

在选中复选框时,我无法更改我的表中的选项,然后单击“发送”。

目前,我使用我创建的这个变量:

$my_setting = 'setting'; // Set the field name 

$hidden_field_name = 'submit_hidden'; // Save my input hidden in a var
$data_field_name = 'setting'; // Set the field name in DB

// If we click on "Save Changes", add the datas to my db
if ( isset( $_POST[ $hidden_field_name ] ) && $_POST[ $hidden_field_name ] == 'Y' ) 
    $opt_val = $_POST[ $data_field_name ];

    update_option( $my_setting, $opt_val );

?> <p><strong>Changes Saved.</strong></p>
<?php  // End if ?>

这是我的管理页面:

    <form action="" method="post">
        <input type="hidden" name="<?php echo $hidden_field_name; ?>" value="Y">

        <label for="<?php echo $data_field_name; ?>">Setting name</label>
        <input id="<?php echo $data_field_name; ?>" type="checkbox" name="<?php echo $data_field_name; ?>" value="<?php echo $opt_val; ?>" />

        <hr />

        <p class="submit">
            <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Save Changes') ?>" />
        </p>
    </form>

当然,在我的插件代码中,我会检查选项并执行所需的操作:

function do_the_job() 

    // Variables for the field and option names
    $my_setting = 'setting';

    // Read in existing option value from database
    $opt_val = get_option( $my_setting );

    if ($opt_val != '1') 
        // Do something
    

在我的插件管理页面中,如果我选中一个复选框,然后单击“保存更改”,则设置不会保存在数据库中,并且该复选框未选中。但管理页面已刷新,并出现我的消息:已保存更改。

有什么想法吗?如果您需要完整代码,我可以在 Github 上上传我的插件:/

【问题讨论】:

【参考方案1】:

复选框的检查方式如下:

checked="checked"

所以,你必须这样做(为了便于阅读,我使用了单独的行):

<input id="<?php echo $data_field_name; ?>" 
       type="checkbox" 
       name="<?php echo $data_field_name; ?>" 
       value="<?php echo "the value to save in the database"; ?>" 
       <?php if($opt_val == "the value to save in the database")  ?>
       checked="checked"
       <?php  ?>
/>

你还有另一个问题。复选框如果被选中则上传,但如果未选中则根本不上传。如果有人取消选中该复选框,您将如何将其保存在数据库中?您必须有代码来确定是否不再提交先前选中的复选框。

【讨论】:

【参考方案2】:

是的,我输入的“检查”值确实不好。实际上我决定使用另一种方法。

<input id="my_field"
       type="checkbox" 
       name="my_field" 
       value="1" 
       <?php checked( (bool) get_option( 'my_field' ) ); ?> 
/>

“已检查”现在存储在 wp_options (option_value = 1) 中,因此我可以使用以下命令验证已检查状态:if ( get_option( 'my_field' ) == true ) // Do something

当然,如果用户取消选中它,option_value 将被删除。

我已经重建了所有插件代码,现在可以正常工作了。当然,我所有的数据库代码都是错误的。如果我想在新表上工作,我必须使用 $wpdb-&gt;update 之类的东西并将我的选项添加到一个数组中。

感谢您的帮助@spsc_tech :)

【讨论】:

以上是关于带有数据库(mysql)查询的 WordPress 插件的主要内容,如果未能解决你的问题,请参考以下文章

在 Wordpress 中使用 JOIN 进行高级 MySQL 查询

查询 Wordpress 数据库时 MySQL LEFT JOIN 错误 1064

PHP wordpress 中的一次查询中的双重 MySQL 查询

在 WordPress 中使用 MySQL 查询检索小部件数据

带有 and , or 条件的 Wordpress 分类查询

php 带有开始日期和结束日期的事件的Wordpress查询