【问题标题】:Update / Save Post Meta - PHP - Wordpress更新/保存 Post Meta - PHP - Wordpress
【发布时间】:2015-11-01 03:20:08
【问题描述】:

我在 Woocommerce 上使用了一个插件,它在管理后端添加了一个带有可编辑数量数字字段的新元框。 我的主题允许前端产品发布,因此我想将其中一些字段添加到前端。

我已经设法在我的模板文件中添加了字段:

<?php 
$min   = get_post_meta( $post->ID, '_wpbo_minimum',  true );
$max   = get_post_meta( $post->ID, '_wpbo_maximum',  true );
?>

<label for="_wpbo_minimum">Minimum Quantity</label>
<input type="number" name="_wpbo_minimum" value="<?php echo $min; ?>" />

<label for="_wpbo_maximum">Maximum Quantity</label>
<input type="number" name="_wpbo_maximum" value="<?php echo $max; ?>" />

这两个字段都显示在我的前端产品编辑表单上,如果之前已填写,则从后端获取它们的值。

但现在我正在努力更新和保存具有更新值的字段 如果这些值以前未填写,则从前端或从前端保存新值。

我花了几个小时寻找一些关于这方面的教程,我想我应该专注于以下代码:

update_post_meta($post->ID, '_wpbo_minimum', $_POST['_wpbo_minimum']);
update_post_meta($post->ID, '_wpbo_maximum', $_POST['_wpbo_maximum']);

但我不知道这是否正确以及该代码应该放在哪里以保存或更新我的字段。

我尝试将一个函数放入我的 functions.php 文件中,如下所示:

/* Update Minimum Qty field */ 
add_action('save_post', 'save_min_qty');

function save_min_qty($post_id)
{
        if(get_post_type($post_id) != "VA_LISTING_PTYPE")
        return;
    $min   = get_post_meta( $post->ID, '_wpbo_minimum',  true );
    if ( isset( $_POST['_wpbo_minimum'] )) {
                $min  = $_POST['_wpbo_minimum'];
            }

            if( isset( $_POST['_wpbo_minimum'] )) {
                if ( $min != 0 ) {
                    $min = wpbo_validate_number( $min );
                }
                update_post_meta( 
                    $post_id, 
                    '_wpbo_minimum', 
                    strip_tags( $min )
                );
}

但这似乎并不是赢家。

能否请您指出正确的方向?

以下是在后端创建元框的实际原始插件的代码,我不确定它是否与我需要在前端执行的操作以及其中的哪一部分以及我应该在哪里使用相关它:

<?php
if ( ! class_exists( 'IPQ_Quantity_Meta_Boxes' ) ) :
class IPQ_Quantity_Meta_Boxes {
    public function __construct() {
        add_action( 'save_post', array( $this, 'save_quantity_meta_data' ) );
    }


    /* Handle Saving Meta Box Data */   
    public function save_quantity_meta_data( $post_id ) {

        // Validate Post Type
        if ( ! isset( $_POST['post_type'] ) or $_POST['post_type'] !== 'product' ) {
            return;
        }

        // Validate User
        if ( !current_user_can( 'edit_post', $post_id ) ) {
            return;
        }

        // Verify Nonce
        if ( ! isset( $_POST["_wpbo_product_rule_nonce"] ) or ! wp_verify_nonce( $_POST["_wpbo_product_rule_nonce"], plugin_basename( __FILE__ ) ) ) {
            return;
        }

        // Update Rule Meta Values
        if ( isset( $_POST['_wpbo_minimum'] )) {
            $min  = $_POST['_wpbo_minimum'];
        }

        if( isset( $_POST['_wpbo_minimum'] )) {
            if ( $min != 0 ) {
                $min = wpbo_validate_number( $min );
            }
            update_post_meta( 
                $post_id, 
                '_wpbo_minimum', 
                strip_tags( $min )
            );
        }

        /* Make sure Max > Min */
        if( isset( $_POST['_wpbo_maximum'] )) {
            $max = $_POST['_wpbo_maximum'];
            if ( isset( $min ) and $max < $min and $max != 0 ) {
                $max = $min;
            }

            update_post_meta( 
                $post_id, 
                '_wpbo_maximum', 
                strip_tags( wpbo_validate_number( $max ) )
            );
        }       
    }
}
endif;

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    除了您检查的是错误的post_type 之外,一切都是正确的——它应该是“产品”而不是“VA_LISTING_PTYPE”。由于帖子类型不正确,您与save_post 挂钩的函数提前返回。

    不正确

    if(get_post_type($post_id) != "VA_LISTING_PTYPE")
    return;
    

    正确

    if (get_post_type($post_id) != "product"){
        // bail early if we aren't updating a WooCommerce Product
        return;
    }
    

    您可以在此处扩展的插件中看到相同的检查:

    https://github.com/wpbackoffice/woocommerce-incremental-product-quantities/blob/master/includes/class-ipq-product-meta-box.php#L222

    【讨论】:

    • 行得通,非常感谢,完全忽略了这一点!
    • 快速提问,我需要包含wp_verify_nonce 函数吗? if ( ! isset( $_POST["_wpbo_product_rule_nonce"] ) or ! wp_verify_nonce( $_POST["_wpbo_product_rule_nonce"], plugin_basename( __FILE__ ) ) ) {??
    • 这样会更安全。它应该由父插件here 创建,因此您可以阅读它,无需将其插入元框。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多