Php 如何通过我的插件页面运行函数并在同一页面上打印结果

Php 如何通过我的插件页面运行函数并在同一页面上打印结果,php,wordpress,Php,Wordpress,我目前正在尝试向我的网站添加调试页面。这个页面只用于运行我的插件完成的一些任务,并在同一页面上输出一些结果 我目前在Wordpress管理员中有一个单独的页面,该页面包含一个表单和按钮,该表单和按钮应链接到一个函数,该函数将执行各种步骤,然后返回一个必须在该页面上打印的值 以下是页面和按钮的当前代码: function actu_admin_menu_option() { add_menu_page('Scripts', 'Sahar actus plugin', 'manage_opt

我目前正在尝试向我的网站添加调试页面。这个页面只用于运行我的插件完成的一些任务,并在同一页面上输出一些结果

我目前在Wordpress管理员中有一个单独的页面,该页面包含一个表单和按钮,该表单和按钮应链接到一个函数,该函数将执行各种步骤,然后返回一个必须在该页面上打印的值

以下是页面和按钮的当前代码:

function actu_admin_menu_option()
{
    add_menu_page('Scripts', 'Sahar actus plugin', 'manage_options', 'actu-admin-menu', 'actu_scripts_page', '', 200);
}


add_action('admin_menu', 'actu_admin_menu_option');


// HTML page of the plugin 
function actu_scripts_page()
{
    ?>
    <div class="wrap">
        <h2>Sahar actus plugin</h2>
        <form action="<?php echo admin_url('admin-post.php'); ?>" method="post">
            <input type="hidden" name="action" value="start_test"> 
            <input class="button button-primary" type="submit" value="Start test">
        </form>
    </div>
<?php
}

function start_test()
{
    return ("test started!");
}
add_action( 'admin_post_start_test', 'start_test' );
所以当我按下按钮时,我想开始测试!要在页面上打印,当前单击按钮会将我重定向到/wp admin/admin-post.php,这是一个空白页面

我不知道做这件事的最佳做法是什么,我应该在我的按钮上发出ajax请求来运行函数,然后从ajax调用中获取返回值吗?还是有更好的办法

谢谢你帮助我,祝你有美好的一天

编辑:更新代码,没有错误,但输出仍然没有打印到页面或控制台

function actu_scripts_page()
{
    ?>
    <div class="wrap">
        <h2>Sahar actu plugin</h2>
         <form action="" method="post">
            <?php wp_nonce_field('do_test', '_test_nonce') ?>
            <input type="hidden" name="action" value="start_test">
            <input class="button button-primary" type="submit" value="Start test">
        </form>
    </div>
    <?php
    if (isset($_POST['start_test'])) {
        if (isset($_POST['start_test'])) {
            if (!wp_verify_nonce($_POST['_test_nonce'], 'do_test')) {
                // error in nonce
            } else {
                start_test();
            }
        }
    } 
    ?>
<?php

}

function start_test()
{
    echo("hhhhh");
    die(); // tried with and without, no difference 

}
    add_action('admin_post_start_test', 'start_test');

通过/wp admin/admin-post.php发生重定向,将返回上一屏幕

您的结果将打印在此页面上,由于它正在重定向,您将看不到任何内容

要解决此问题,只需在调试代码后添加以下内容:

die();


这将阻止PHP在代码之后执行任何操作。因此,停止页面重定向。此外,任何在函数之后运行的函数都不会正常运行,因此,如果您希望保存,例如,在这段代码之后就不会发生这种情况。

有两种方法可以实现这一点,两者都可以,这取决于您希望的用户体验。使用现有的标准http表单提交,或者使用ajax。标准表单提交是最简单的方法

使用您现有的标准方法提交表单,这将重新加载页面。重要提示:如果要将页面提交给自己,最好将action属性保留为空,如action=。 您还需要使用wp\u nonce\u字段将nonce添加到表单中,并使用wp\u verify\u nonce在提交块中检查其值

因此,您的表单需要如下内容:

<form action="" method="post">
   <?php wp_nonce_field('do_test', '_test_nonce') ?>
   <input type="hidden" name="action" value="start_test"> 
   <input class="button button-primary" type="submit" value="Start test">
</form>
添加一个php块以检查表单是否已提交,并在其中执行脚本,使用php打印任何输出

function start_test() {
   // do things. If successful, return true. Otherwise return false
   return true;
}
if( isset($_POST['start_test']) ) {
   if( ! wp_verify_nonce( $_POST['_test_nonce'], 'do_test' ) {
      // error in nonce
   } else {
      if( start_test() )
         echo '<p>Success!</p>';
      else
         echo '<p>Failure!</p>';  
   }
}

谢谢你澄清了做这件事的方法!我已经试过你的代码,它运行了,但没有在页面或控制台上打印任何内容,我会将代码粘贴回原始帖子中,如果你仍然能帮我一点忙,我将不胜感激!谢谢你的帮助,我来自其他语言,即使是最基本的事情也很难开始做。那是因为你的函数只是返回文本,没有任何回音!谢谢,通过你的例子,我学到了很多关于它是如何工作的!遗憾的是,在使用您的示例后,它仍然没有打印任何内容,也许这工作正常,但由于页面的加载方式而没有显示?我试着按照Ali_K在回答中的建议,在每一步中加入骰子,但效果并不理想。也许我设置菜单页面的方式不正确?它可能正在打印到页面上,但你就是看不到它,因为它在元素后面。将结束标记移动到条件isset块之后。感谢您的回答,我尝试将die与JakeParis提供的代码结合使用,但它仍然没有向页面输出任何内容。
<form action="" method="post">
   <?php wp_nonce_field('do_test', '_test_nonce') ?>
   <input type="hidden" name="action" value="start_test"> 
   <input class="button button-primary" type="submit" value="Start test">
</form>
function start_test() {
   // do things. If successful, return true. Otherwise return false
   return true;
}
if( isset($_POST['start_test']) ) {
   if( ! wp_verify_nonce( $_POST['_test_nonce'], 'do_test' ) {
      // error in nonce
   } else {
      if( start_test() )
         echo '<p>Success!</p>';
      else
         echo '<p>Failure!</p>';  
   }
}