Create small dashboard widget

时间:2018-04-24 作者:Honoluluman

我一直在尝试在admin中的一个用户的帐户页面中添加一列移动电话号码字段。所以我从

https://coderwall.com/p/g72jfg/adding-a-phone-numer-field-to-wordpress-user-profile

现在我要做的是,为仪表板构建一个自定义小部件,这样用户也可以直接从那里更改他的手机号码(因此小部件中还必须有一个更新按钮)。你可以看到为这个想法附上的照片this is what you can see in users account

this is how the widget should look like

-第一幅图是小部件在dashboad中的外观,

-第二张图片是您现在可以在用户帐户中看到的。

我知道一些使用echo创建仪表板小部件的简单示例,如下所示

http://www.wpbeginner.com/wp-themes/how-to-add-custom-dashboard-widgets-in-wordpress/

, 但直到现在我还不能建造它。

任何帮助都将不胜感激。

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

我构建了一个小/简单的示例,希望它能帮助您。

Admin dashboard widget with an save button

Admin dashboard widget with an save button

首先,我们注册一个函数,告诉wordpress我们要创建一个管理仪表板小部件

/**
 * Registration of the Admin dashboard widget
 */
function ch_add_dashboard_widgets() {

    wp_add_dashboard_widget(
        \'user_email_admin_dashboard_widget\',      // Widget slug
        __(\'Extra profile information\', \'ch_user_widget\'),         // Title
        \'ch_user_email_admin_dashboard_widget\' // Display function
    );  
}

// hook to register the Admin dashboard widget
add_action( \'wp_dashboard_setup\', \'ch_add_dashboard_widgets\' );
然后我们创建呈现小部件的函数

/**
 * Output the html content of the dashboard widget
 */
function ch_user_email_admin_dashboard_widget() {

  // detect the current user to get his phone number
  $user = wp_get_current_user();
  ?>


  <form id="ch_form" action="<?php echo esc_url( admin_url( \'admin-ajax.php\' ) ); ?>" method="post" >

    <!-- controlls on which function the post will send -->
    <input type="hidden" name="cp_action" id="cp_action" value="ch_user_data">

    <?php wp_nonce_field( \'ch_nonce\', \'ch_nonce_field\' ); ?>

    <p>Please add your phone number</p>

    <p>
        <label for="phone">Phone Number</label>
        <input type="text" name="phone" id="cp_phone_number" value="<?php echo esc_attr( get_the_author_meta( \'phone\', $user->ID ) ); ?>" class="regular-text" />
    </p>
    <p>

      <input name="save-data" id="save-data" class="button button-primary" value="Save" type="submit">  
      <br class="clear">
    </p>

</form>

<?php
}
好的,下一部分是保存。有两种方法可以保存小部件数据。

第一种是通过正常的“表单post请求”发送数据。这就是网站上典型表单的工作方式。这意味着你有一个表单,你输入日期,点击提交按钮,数据将发送到服务器。服务器会处理这些数据,然后用户会重定向到另一个页面,例如“谢谢”页面。

第二种方法与第一种方法几乎相同,但有一个例外是“form post request”将通过AJAX发送(简称Asynchronous JavaScript And XML这种方式的优点是,我们保持在同一页上(用一种非常简单的方式表达)。

要你用第二种方式告诉wordpress两个想法。首先,ajax请求应该调用哪个函数以及javascript文件所在的位置。

/**
 * Saves the data from the admin widget
 */
function ch_save_user_data() {

    $msg = \'\';
    if(array_key_exists(\'nonce\', $_POST) AND  wp_verify_nonce( $_POST[\'nonce\'], \'ch_nonce\' ) ) 
    {   
       // detect the current user to get his phone number
       $user = wp_get_current_user();

       // change the phone number
       update_usermeta( $user->id, \'phone\', $_POST[\'phone_number\'] );

       // success message
       $msg = \'Phone number was saved\';
    }
    else
    {   
       // error message
       $msg = \'Phone number was not saved\';
    }

    wp_send_json( $msg );
}

/**
 * ajax hook for registered users
 */
 add_action( \'wp_ajax_ch_user_data\', \'ch_save_user_data\' );



/**
 * Add javascript file
 */
function ch_add_script($hook){

   // add JS-File only on the dashboard page
   if (\'index.php\' !== $hook) {
       return;
   }

   wp_enqueue_script( \'ch_widget_script\', plugin_dir_url(__FILE__) ."/js/widget-script.js", array(), NULL, true );
}

/**
 * hook to add js
 */
add_action( \'admin_enqueue_scripts\', \'ch_add_script\' );
确定最后一点,这是javascript文件的内容。

jQuery("#ch_form").submit(function(event) {

   /* stop form from submitting normally */
   event.preventDefault();

  /* get the action attribute from the form element */
  var url = jQuery( this ).attr( \'action\' );

  /* Send the data using post */
  jQuery.ajax({
    type: \'POST\',
    url: url,
    data: {
        action: jQuery(\'#cp_action\').val(),
        phone_number: jQuery(\'#cp_phone_number\').val(), 
        nonce: jQuery(\'#ch_nonce_field\').val()
    },
    success: function (data, textStatus, XMLHttpRequest) {
        alert(data);
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert(errorThrown);
    }
  });

});
好的,最后是一些有用的链接:

"AJAX in Plugins" on wordpress.org

What is Ajax? Plugin Handbook on wordpress.org

Dashboard Widgets API on wordpress.org

Handling POST Requests the WordPress Way on sitepoint.com

EDIT:

我将整个代码放入一个插件中,并将其发布在github上。

链接:https://github.com/user141080/admindashboardwidget

SO网友:Honoluluman

Woooow非常感谢用户141080,

对我来说,你在那里做的工作看起来很繁重!我可以理解表单的html部分,以及大多数php保存数据的部分,但关于js,我完全不懂:)

我确认我测试了你的插件,效果非常好!我甚至可以通过在代码区域中添加js来添加更多字段

data: {
        action: jQuery(\'#cp_action\').val(),
        phone_number: jQuery(\'#cp_phone_number\').val(),
        city_area: jQuery(\'#cp_city\').val(),  
        nonce: jQuery(\'#ch_nonce_field\').val()
    },
除了适当的字段之外。

我注意到的唯一问题是,由于我希望这个插件与我使用的代码一起运行(https://coderwall.com/p/g72jfg/adding-a-phone-numer-field-to-wordpress-user-profile) 为了保存用户配置文件页面中的字段,当我从仪表板小部件保存数据,然后在用户配置文件页面上进行简单刷新后,我可以看到新的更新数据,但如果我从用户配置文件页面保存数据,那么在仪表板上进行简单刷新后,我没有新的更新数据。如果我注销并登录用户,那么我就会得到它们。我想这跟这个命令有关吧?

// detect the current user to get his phone number
$user = wp_get_current_user();
谢谢你的努力,我想我永远也做不到像你那样的努力:)

结束