【问题标题】:How to run a function through my plugin page and print the result on that same page如何通过我的插件页面运行功能并在同一页面上打印结果
【发布时间】:2020-06-04 23:40:44
【问题描述】:

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

我目前在我的 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' );

我想要例如在单击按钮时运行以下函数,然后在页面上输出返回值。

    function start_test()
    {
      return("test started!");
    }  

所以当我按下按钮时,我想要“测试开始!”要打印在页面上,当前单击按钮会将我重定向到/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');

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    有两种方法可以实现这一点,两者都很好,这取决于您想要的用户体验。使用普通的 http 表单提交(你已经拥有的),或者使用 ajax。普通的表单提交是最简单的方法。

    使用标准方法(您所拥有的)提交表单,这将重新加载页面。 重要提示如果您将页面提交给自身,最好将操作属性留空,例如action=""。 您还需要使用wp_nonce_field() 向表单添加一个随机数,并使用wp_verify_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 在他的回答中建议的那样,我尝试将 die() 添加到每个步骤中,但这也不起作用。也许我设置菜单页面的方式不对?
    • 它可能 正在 打印到页面上,但是您看不到它,因为它在
      元素之后出现。将结束
      标记移到条件 isset 块之后。
    【解决方案2】:

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

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

    解决此问题所需要做的就是在调试代码后添加:

    die();
    

    或者

    exit();
    

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

    【讨论】:

    • 感谢您的回答,我尝试将 die 与 JakeParis 提供的代码结合使用,但仍然没有向页面输出任何内容。
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多