如何在WooCommerce产品页面上获取_POST变量(主页上的表格)

时间:2019-06-08 作者:Jozef P.

在WP主页上,我有这样一个表格:

<form action="\'.esc_url( admin_url(\'admin-post.php\')).\'" method="post">
   //etc.
   //etc.
在文件中functions.php 我截取了这段代码。

    function redirect_form() {
        if (isset($_POST["var1"]) && !empty($_POST["var1"]) && isset($_POST["var2"]) && isset($_POST["var3"]) && !empty($_POST["var3"])) {


            if ($_POST["var1"] == \'product1\'){
                wp_redirect(home_url(\'/product/product1/\')); exit;
            // etc.
            // etc.
一切正常expected.

但问题是如何在WooCommerce单一产品页面上获取这些变量?我想在产品页面上回显这些变量。

UPDATED:

我正在对全局变量进行同样的尝试。我错过了什么?

function redirect_form() {
if (isset($_POST["var1"]) && !empty($_POST["var1"]) && isset($_POST["var2"]) && isset($_POST["var3"]) && !empty($_POST["var3"])) {

    global $abc;
    $abc = $_POST["var2"];

    if ($_POST["var1"] == \'product1\'){
        wp_redirect(home_url(\'/products/product1/\')); exit;

    // etc.
    // etc.
那么

add_action( \'woocommerce_single_product_summary\', \'dev_designs_show_sku\', 5 );
function dev_designs_show_sku(){
    global $product, $abc;
    echo $abc;
}
它不起作用。我错过了什么?

UPDATED 2

然后我想根据这些变量调整产品的价格。像这样的。

function return_custom_price($price, $product) {
    global $post, $blog_id, $abc;
    $price = get_post_meta($post->ID, \'_regular_price\');
    $post_id = $post->ID;
    $price = ($price[0] + $abc);
    return $price;
}
add_filter(\'woocommerce_get_price\', \'return_custom_price\', 10, 2);

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

我认为您可以使用$\\u会话或$\\u GET var。

Option 1: (我认为这最适合你的情况)

function redirect_form() {
  if (isset($_POST["var1"]) && !empty($_POST["var1"]) && isset($_POST["var2"]) && isset($_POST["var3"]) && !empty($_POST["var3"])) {

    $_SESSION[\'var2\'] = htmlentities(stripslashes(trim($_POST["var2"])), ENT_QUOTES);

    if ($_POST["var1"] == \'product1\'){
        wp_redirect(home_url(\'/products/product1/\')); exit;

///// And In your price adjustment call

function return_custom_price($price, $product) {
    global $post, $blog_id;
    $price = get_post_meta($post->ID, \'_regular_price\');
    $post_id = $post->ID;
    $price = ($price[0] + $_SESSION[\'var2\']);
    return $price;
}
add_filter(\'woocommerce_get_price\', \'return_custom_price\', 10, 2);

Note: 在您的功能的顶部。php文件,您需要启动$\\u会话才能使用它们。

function register_my_session(){
  if( !session_id()){
    session_start();
  }
}

add_action(\'init\', \'register_my_session\');
Option 2: (如果遇到$\\u会话问题)

function redirect_form() {
  if (isset($_POST["var1"]) && !empty($_POST["var1"]) && isset($_POST["var2"]) && isset($_POST["var3"]) && !empty($_POST["var3"])) {

    $url_parm = htmlentities(stripslashes(trim($_POST["var2"])), ENT_QUOTES);

    if ($_POST["var1"] == \'product1\'){
        wp_redirect(home_url(\'/products/product1/?var2=\'.$url_parm)); exit;

///// And In your price adjustment call

function return_custom_price($price, $product) {
    global $post, $blog_id;
    $price = get_post_meta($post->ID, \'_regular_price\');
    $post_id = $post->ID;
    $price = ($price[0] + $_GET[\'var2\']);
    return $price;
}
add_filter(\'woocommerce_get_price\', \'return_custom_price\', 10, 2);

如果你选择选项2,我可能会考虑在你的return_custom_price() 打电话确认你有干净的数据;

希望这对你有所帮助,如果你遇到任何问题,请告诉我!!

SO网友:Jamqes Barndonius

如果您希望自定义产品页面上显示的内容,有几种方法可以做到这一点:

1) Overriding the product page templates:组成产品页的组件可以在中找到wp-content/plugins/woocommerce/templates, 如果要向产品页面的一个或多个部分添加变量,可以在当前设置的主题中覆盖页面的该部分。

例如,如果要向简短描述中添加变量,可以复制简短描述模板:

wp-content/plugins/woocommerce/templates/single-product/short-description.php
到当前设置的主题:

yourtheme/woocommerce/single-product/short-description.php`
并在副本上添加变量/更改结构。您可以对产品页面中的选项卡执行相同的操作(例如,其他信息和说明),请在中签出文件plugins/woocommerce/templates/single-product/tabs/.

如果您想对某个部分进行重大更改,这将非常有用。缺点是,如果WooCommerce开发人员对该模板进行了更改,您可能需要重新复制该文件以实现兼容性。

2) Add variables via filters:有些元素有过滤器,您可以使用这些过滤器操纵每个部分中使用的数据。

再次以简短的描述为例,可以添加一个钩子来操作数据,如下所示:

// define the woocommerce_short_description callback 
function filter_woocommerce_short_description( $post_post_excerpt ) { 
    // make filter magic happen here... 
    return $post_post_excerpt; 
}; 

// add the filter 
add_filter( \'woocommerce_short_description\', \'filter_woocommerce_short_description\', 10, 1 ); 
取自hookr.io

你可以用你的functions.php 文件或自定义插件内部。这样做的好处是,对于WooCommerce开发人员对模板所做的更改,它更为健壮,但您所能做的更改更为有限。

基于澄清更新我想我误解了你的问题,如果你问的是变量范围,这更像是一个PHP问题,而不是WordPress问题。你可以declare your variable as a global, 然后您可以在任何地方访问它。

function redirect_form() {#
    /* This is now globally scoped, you can access it anywhere */
    global $my_var;
    $my_var = $_POST["var1"];
}
然后,无论您想在哪里使用它,您都需要重新定义您是全局的,因此无论您在哪里操作产品页面代码,您都可以这样访问它:

global $my_var;
echo $my_var;
只是要小心你的变量的名字,因为你不想覆盖一些重要的东西。如果可能的话,我总是尽量避免使用全局变量,这取决于你想做什么,也许有更好/更安全的方法来共享这个变量,但如果不完全知道你想实现什么,我就无法提出更好的方法。

相关推荐