为什么我的表单要在我的定制插件中的php文件中显示的html表单提交的前端?

时间:2020-01-13 作者:Savio menezes

我正在创建我的第一个Wordpress插件。它的目标是只使用sku更新管理员用户关于图书库存的信息。

更新库存中有2个表单。php页面。第一个表单接受sku输入并检索库存信息。第二个表单从管理员用户那里获取新的股票价值。如果我在同一个页面上提交该页面,该页面就可以正常工作,但我只想简单地提交它。

我不知道如何仅在后端无缝地拆分和处理php文件。

当我尝试将action属性更改为插件子文件夹中的php文件时,它可以工作,但它不保留管理仪表板,而是将我带到网站的前端。

我真的很想知道如何在插件子文件夹中处理php文件,同时只保留在后端。

我在网上搜索了很多内容,但对于Wordpress插件的开发,似乎没有关于如何处理其他php文件的适当指南。

如有任何帮助或参考,将不胜感激。

插件名称。php

define("PLUGIN_DIR_PATH",plugin_dir_path(__FILE__));
add_action( \'admin_menu\', \'wim_register_my_custom_menu_page\' );
function wim_register_my_custom_menu_page() {
    add_menu_page(
        __( \'Plugin name\', \'textdomain\' ),
        \'Plugin name\',
        \'manage_options\',
        \'plugin-name/plugin-name.php\',
        \'plugin_name_pagefunc\',
        \'dashicons-tickets\',
        6
    );
    add_submenu_page(
            \'plugin-name/plugin-name.php\',
            \'Update Stock\',
            \'Update Product\',
            \'manage_options\',
            \'update-stock\',
            \'update_stockfunc\',
            \'dashicons-welcome-add-page\'
        );
}
function plugin_name_pagefunc()
{
 ?>
    <h1>Plugin Name</h1>
    <h3>Thank you for installing our plugin.</h3>
    <p>This plugin is under development. This plugin is being developed for learning plugin development.</p>
<?php
    }    
    function update_stockfunc(){
     include_once PLUGIN_DIR_PATH."/inc/views/update-stock.php";
    }
?>
更新库存。php

<div class="wrap">
        <h2>Update Stock</h2>
        <form method="POST" >
        <input type="number" name="skuInput" onmouseover="this.focus();" maxlength="13">
        <button value="Submit" onclick="Submit" >Check Stock</button>
        </form>
        <hr>
<?php
        $sku = $_POST[\'skuInput\'];
        $product_id = get_product_id_by_sku($sku);
        $stock = get_stock_by_product_id($product_id);
        function get_product_id_by_sku( $sku = false ) {
            global $wpdb;
            if( !$sku )
                return null;
            $product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key=\'_sku\' AND meta_value=\'%s\' LIMIT 1", $sku ) );
            if ( $product_id )
                 return $product_id;                
         return null;
        }

        function get_stock_by_product_id( $product_id = false ) {
            global $wpdb;
            if( !$product_id )
                return null;
            $stock = $wpdb->get_var( $wpdb->prepare( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id=\'%s\' and meta_key=\'_stock\'",$product_id));

             if ( $stock )
                 return $stock;            
         return null;
        }
?>
 <form method="POST" action="<?php echo plugins_url( \'update-stock-success.php\', __FILE__ ); ?>">
            <input name="updatedStock" type="number" value ="<?php echo 
            $stock;?>">
            <input type="hidden" name="product_id2" value="<?php echo 
            $product_id ?>"/>
            <button value="Submit" onclick="Submit" >Update Stock</button>
        </form>
更新库存成功。php

<div class="wrap">
    <h2>Product Stock was updated successfully</h2>
        <?php
         $updatedStock = $_POST[\'updatedStock\'];
         $product_id2 = $_POST[\'product_id2\'];
         echo "New updated stock is ".$updatedStock." has post 
         id".$product_id2;
         update_post_meta( $post, \'_stock\', $updatedStock);
         echo "New updated stock is ".$updatedStock." has post 
         id".$product_id2;
         ?>
</div>
输出转到前端,如下图所示:update-stock-success.php is taken to the wordpress frontend

2 个回复
SO网友:BlueSuiter

使用添加新URLadd_submenu_page (没有指定任何父项)并在该URL上发布表单数据。请参阅此page 用于添加子菜单页。

此外,您不应该在这样的任何PHP文件上发送表单数据。这将为外部攻击打开插件。

如果你想不出怎么做,请告诉我。

祝你今天愉快

SO网友:BlueSuiter

我只更新了那些能够解释我在第一次回答中试图告诉你的事情的部分。

插件名称。php

define("PLUGIN_DIR_PATH",plugin_dir_path(__FILE__));
add_action( \'admin_menu\', \'wim_register_my_custom_menu_page\' );
function wim_register_my_custom_menu_page() {
    add_menu_page(
        __( \'Plugin name\', \'textdomain\' ),
        \'Plugin name\',
        \'manage_options\',
        \'plugin-name/plugin-name.php\',
        \'plugin_name_pagefunc\',
        \'dashicons-tickets\',
        6
    );

    add_submenu_page(
            \'\',
            \'Update Stock\',
            \'Update Product\',
            \'manage_options\',
            \'update-prod\',
            \'update_prodfunc\',
            \'dashicons-welcome-add-page\'
        );
}

function plugin_name_pagefunc()
{
    ?>
        <h1>Plugin Name</h1>
        <h3>Thank you for installing our plugin.</h3>
        <p>This plugin is under development. This plugin is being developed for learning plugin development.</p>
    <?php
}   

function update_stockfunc(){
    include_once PLUGIN_DIR_PATH."/inc/views/update-stock.php";
}

function update_prodfunc(){
    echo \'<h2>Product Stock was updated successfully</h2>\';
    $updatedStock = $_POST[\'updatedStock\'];
    $product_id2 = $_POST[\'product_id2\'];
    echo "New updated stock is ".$updatedStock." has post 
    id".$product_id2;
    update_post_meta( $post, \'_stock\', $updatedStock);
    echo "New updated stock is ".$updatedStock." has post 
    id".$product_id2;
}
更新库存。php

<form method="POST" action="<?= admin_url() . \'admin.php?page=update-prod\' ?>">
    <input name="updatedStock" type="number" value ="<?php echo 
    $stock;?>">
    <input type="hidden" name="product_id2" value="<?php echo 
    $product_id ?>"/>
    <button value="Submit" onclick="Submit" >Update Stock</button>
</form>
你从来都不需要这个文件update-stock-success.php. WP中的东西与Core\\u PHP的工作原理几乎没有什么不同。