WordPress 插件:在管理面板中单击按钮调用函数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8597846/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 18:51:35  来源:igfitidea点击:

WordPress Plugin: Call function on button click in admin panel

wordpress

提问by NSjonas

I need to create a WordPress plugin that calls a PHP function when a button in an admin panel is clicked. I've been looking at tutorials for writing basic WordPress plugins and adding admin panels but I still don't understand how exactly to register a button to a specific function in my plug-in.

我需要创建一个 WordPress 插件,当单击管理面板中的按钮时调用 PHP 函数。我一直在寻找编写基本 WordPress 插件和添加管理面板的教程,但我仍然不明白如何将按钮注册到插件中的特定功能。

Here's what I have so far:

这是我到目前为止所拥有的:

/*
Plugin Name: 
Plugin URI: 
Description: 
Author:
Version: 1.0
Author URI:
*/


add_action('admin_menu', 'wc_plugin_menu');

function wc_plugin_menu(){
 add_management_page('Title', 'MenuTitle', 'manage_options', 'wc-admin-menu', 'wc_plugin_options'); 

}

function wc_plugin_options(){
if (!current_user_can('manage_options'))  {
    wp_die( __('You do not have sufficient permissions to access this page.')    );
}
echo '<div class="wrap">';
echo '<button>Call Function!</button>'; //add some type of hook to call function
echo '</div>';

}

function button_function()
{
//do some stuff
} 


?>

采纳答案by brandwaffle

Well, you have two options.

好吧,你有两个选择。

1) Use AJAX to create an admin-ajax hook that you execute with JavaScript when the user clicks the button. You can learn about that approach here: http://codex.wordpress.org/AJAX(make sure to add a nonce for security ( http://codex.wordpress.org/WordPress_Nonces)). This is also a good resource for creating admin-ajax hooks: http://codex.wordpress.org/AJAX_in_Plugins

1) 使用 AJAX 创建一个 admin-ajax 钩子,当用户单击按钮时,您将使用 JavaScript 执行该钩子。您可以在此处了解该方法:http: //codex.wordpress.org/AJAX(确保为安全性添加随机数(http://codex.wordpress.org/WordPress_Nonces))。这也是创建 admin-ajax 钩子的好资源:http: //codex.wordpress.org/AJAX_in_Plugins

2) Put the button in a form, POST that form to your plugin and add some code to handle the POST'd form (if you do this, make sure you include a nonce for security ( http://codex.wordpress.org/WordPress_Nonces) and also make sure that the user trying to click the button has the right privileges to do so http://codex.wordpress.org/Function_Reference/current_user_can

2)将按钮放在一个表单中,将该表单发布到您的插件并添加一些代码来处理 POST 表单(如果您这样做,请确保您包含一个随机数以确保安全(http://codex.wordpress.org) /WordPress_Nonces) 并确保尝试单击按钮的用户具有这样做的正确权限http://codex.wordpress.org/Function_Reference/current_user_can

What you're trying to do is not super-complex, but it does involve a good understanding of forms, PHP, and (maybe) JavaScript. If your JavaScript is ok, I'd recommend option 1, since it doesn't require the user to reload the page.

您尝试做的不是超级复杂,但它确实涉及对表单、PHP 和(也许)JavaScript 的良好理解。如果您的 JavaScript 没问题,我会推荐选项 1,因为它不需要用户重新加载页面。

回答by Obliquely

Although the answers on this page provided a useful start, it took a while for me to figure out how to get option (2) working. Given this, the following code might be of help to some people.

尽管此页面上的答案提供了一个有用的开始,但我花了一段时间才弄清楚如何使选项 (2) 起作用。鉴于此,以下代码可能对某些人有所帮助。

If you create a plugin with the following code and it will add a left hand menu option called 'Test Button' when you are in the admin area. Click on this and you will see a button. Clicking that button runs the test_button_actionfunction. In my example function I've both put a message on the page and written to a log file.

如果您使用以下代码创建一个插件,当您在管理区域时,它将添加一个名为“测试按钮”的左侧菜单选项。单击此按钮,您将看到一个按钮。单击该按钮运行该test_button_action功能。在我的示例函数中,我在页面上放置了一条消息并写入了日志文件。

<?php

/*
Plugin Name: Example of Button on Admin Page
Plugin URI: 
Description: 
Author:
Version: 1.0
Author URI:
*/


add_action('admin_menu', 'test_button_menu');

function test_button_menu(){
  add_menu_page('Test Button Page', 'Test Button', 'manage_options', 'test-button-slug', 'test_button_admin_page');

}

function test_button_admin_page() {

  // This function creates the output for the admin page.
  // It also checks the value of the $_POST variable to see whether
  // there has been a form submission. 

  // The check_admin_referer is a WordPress function that does some security
  // checking and is recommended good practice.

  // General check for user permissions.
  if (!current_user_can('manage_options'))  {
    wp_die( __('You do not have sufficient pilchards to access this page.')    );
  }

  // Start building the page

  echo '<div class="wrap">';

  echo '<h2>Test Button Demo</h2>';

  // Check whether the button has been pressed AND also check the nonce
  if (isset($_POST['test_button']) && check_admin_referer('test_button_clicked')) {
    // the button has been pressed AND we've passed the security check
    test_button_action();
  }

  echo '<form action="options-general.php?page=test-button-slug" method="post">';

  // this is a WordPress security feature - see: https://codex.wordpress.org/WordPress_Nonces
  wp_nonce_field('test_button_clicked');
  echo '<input type="hidden" value="true" name="test_button" />';
  submit_button('Call Function');
  echo '</form>';

  echo '</div>';

}

function test_button_action()
{
  echo '<div id="message" class="updated fade"><p>'
    .'The "Call Function" button was clicked.' . '</p></div>';

  $path = WP_TEMP_DIR . '/test-button-log.txt';

  $handle = fopen($path,"w");

  if ($handle == false) {
    echo '<p>Could not write the log file to the temporary directory: ' . $path . '</p>';
  }
  else {
    echo '<p>Log of button click written to: ' . $path . '</p>';

    fwrite ($handle , "Call Function button clicked on: " . date("D j M Y H:i:s", time())); 
    fclose ($handle);
  }
}  
?>