有关使用Metabox的问题-复选框以启用销售项目

时间:2014-01-31 作者:user1760110

使用WP 3.8.1,我有一个Custom Post Type 这被称为“Sport“它的Metdabox-medata数据如下:enter image description here

我不需要设置网上购物,但我喜欢将我的产品价格添加到任何运动CPT中,并通过选中Sale on复选框并指定Sale amount或presentage来更新WP表中的价格。所以输出看起来像enter image description here 我知道JavaScript可以在复选框上完成部分工作(如将Sale类添加到价格或将Sale图标添加到方框),但在WP端,我还需要更新表格以获取新价格,还可以列出每个CPT的所有待售项目。

你能告诉我怎么做吗?代码如下:

<?php
/* Custom Meta Boxex */
add_action(\'add_meta_boxes\', \'cpt_metadata_add\');
add_action(\'save_post\', \'save_options\');
function cpt_metadata_add()
{
    add_meta_box(
        "prodInfo-meta",
        "New Dress Shoe Attributes ",
        "render_meta_elemnts",
        "sport",
        "normal",
        "low"
    );
}
function render_meta_elemnts()
{
    global $post;
    $values  = get_post_custom( $post->ID );
    $price   = isset( $values[\'metadata_price\'] ) ? esc_attr( $values[\'metadata_price\'][0] ) : \'\';
    $sale    = isset( $values[\'metadata_sale\'] ) ? esc_attr( $values[\'metadata_sale\'][0] ) : \'\';
    $saleamount  = isset( $values[\'metadata_sale_amount\'] ) ? esc_attr( $values[\'metadata_sale_amount\'][0] ) : \'\';
    $salepercentage = isset( $values[\'metadata_sale_percentage\'] ) ? esc_attr( $values[\'metadata_sale_percentage\'][0] ) : \'\';
    wp_nonce_field( \'my_meta_box_nonce\', \'meta_box_nonce\' );

?>
<table>
<tr>
  <td><?php echo \'<label for="metadata_price">Price : $</label>\'; ?></td>
  <td><?php echo \'<input name="metadata_price" value="\'. $price . \'" id="metadata_price" />\'; ?></td>
  <td style="width:25px;"></td>
  <td><?php echo \'<label for="metadata_sale">Sale On :</label> <input type="checkbox" name="metadata_sale" id="metadata_sale" <?php checked( $sale, \'on\' ); ?> />\'; ?></td>
  <td><?php echo \'<label for="metadata_sale_percentage">Sale Percentage : %</label>\'; ?></td>
  <td><?php echo \'<input name="metadata_sale_percentage" value="\'. $salepercentage . \'" id="metadata_sale_percentage" />\'; ?></td>
  <td style="width:25px;"></td>
  <td><?php echo \'<label for="metadata_sale_amount">Sale Amount : $</label>\'; ?></td>
  <td><?php echo \'<input name="metadata_sale_amount" value="\'. $saleamount . \'" id="metadata_sale_amount" />\'; ?></td>
</tr>
</table>
<?php
}
function save_options()
{
    global $post;
if (!isset($_POST[\'source\']) || $post->post_type != \'sport\'){
     return $post;
    }
      update_post_meta($post->ID, "price", $_POST[\'price\']);
    }
更新时间:

<?php
$args = array( \'post_type\' => \'sport\');
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$meta = get_post_custom($post->ID);
    the_title();
    echo $meta[\'price\'][0];

endwhile;
?>

Update 2

<?php
$args = array( \'post_type\' => \'sport\');
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$meta = get_post_custom($post->ID);
     if(metadata_sale = checked) {
        echo $meta[\'metadata_price\'][0] - $meta[\'metadata_sale_percentage\'][0];
    }
    else{
       echo $meta[\'metadata_price\'][0];
    }
endwhile;
?>

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

你应该先把重点放在保存上。

在线上有无数关于如何实现这一点的教程,但我建议使用名为“高级自定义字段”的插件。这样,您就可以在特定页面/帖子中创建自定义字段,而无需编写任何代码。该插件还为您提供了用于前端获取内容的函数。

但是,如果您想自己执行此操作,则会将数据保存到Posteta表中。您需要使用此函数get\\u post\\u meta()来检索该数据。

参见法典:http://codex.wordpress.org/Function_Reference/get_post_meta

一旦可以检索数据,就需要检查销售价格是否存在。如果是这样,则在原始价格中添加一个css类以将其划掉。然后显示新价格。如果没有销售价格。。。什么都不做。

<?php
$args = array( \'post_type\' => \'sport\');
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$meta = get_post_custom($post->ID);
    the_title();
    echo $meta[\'price\'][0];

    //Assuming that $meta[\'price\'][0] holds your regular price
    //Assuming that $meta[\'sale\'][0] holds your sale price

    if(isset($meta[\'sale\'][0])){

        echo "<div class=\'sale-price\'>" . $meta[\'sale\'][0] . "</div>";

        echo "<div class=\'old-price\'>" . $meta[\'price\'][0] . "</div>";

    }else{

        echo "<div class=\'regular-price\'>" . $meta[\'price\'][0] . "</div>";

    }


endwhile;
?>

SO网友:cybmeta

首先,您需要访问表单数据并正确保存它。例如,您正在检查$_POST[\'source\'] 已设置,但没有输入name="source" 以你的形式,所以update_post_meta 未执行。即使是它update_post_meta 将被执行,您正在尝试存储$_POST[\'price\'] 但在你的形式中,同样没有price 输入

快速适应:

class Price_Metabox
{
/**
 * This is our constructor
 *
 * @return Price_Metabox
 */
public function __construct() {
    add_action( \'add_meta_boxes\',          array( $this, \'metabox_add\' ) );
    add_action( \'save_post\',               array( $this, \'price_save_postdata\') );
}

/**
 * Add the Metabox
 *
 */
public function metabox_add() {
    // Add Metabox
    add_meta_box(
                     \'prodInfo-meta\',
                     "New Dress Shoe Attributes",
                      array( $this, \'render_meta_elemnts\' ),
                      \'post\',
                      \'normal\',
                      \'low\'
                 );

}

/**
 * Build the Metabox
 *
 * @param object $post
 *
 */

public function render_meta_elemnts( $post ) {
        $values  = get_post_custom( $post->ID );
        $price   = isset( $values[\'metadata_price\'] ) ? esc_attr( $values[\'metadata_price\'][0] ) : \'\';
        $sale    = isset( $values[\'metadata_sale\'] ) ? \'checked\' : \'\';
        $salepercentage = isset( $values[\'metadata_sale_percentage\'] ) ? esc_attr( $values[\'metadata_sale_percentage\'][0] ) : \'\';
        $finalprice = isset( $values[\'metadata_final_price\'] ) ? esc_attr( $values[\'metadata_final_price\'][0] ) : \'\';
        wp_nonce_field( plugin_basename( __FILE__ ), \'prodInfo_noncename\' )

        ?>
<table>
  <tr>
    <td><?php echo \'<label for="metadata_price">Price : $</label>\'; ?></td>
    <td><?php echo \'<input name="metadata_price" value="\'. $price . \'" id="metadata_price" />\'; ?></td>
    <td style="width:25px;"></td>
    <td><?php echo \'<label for="metadata_sale">Sale On :</label> <input type="checkbox" name="metadata_sale" id="metadata_sale" \'.$sale.\'/>\'; ?></td>
    <td><?php echo \'<label for="metadata_sale_percentage">Sale Percentage : %</label>\'; ?></td>
    <td><?php echo \'<input name="metadata_sale_percentage" value="\'. $salepercentage . \'" id="metadata_sale_percentage" />\'; ?></td>
    <td><?php echo \'<label for="metadata_final_price">Final price : $</label>\'; ?></td>
    <td><?php echo \'<input name="metadata_final_price" value="\'. $finalprice . \'" id="metadata_final_price" />\'; ?></td>
  </tr>
</table>
<?php
}

/**
 * Save post meta data
 *
 * This function will save the images ids as post meta data (comma separated string).
 *
 */

    public function price_save_postdata($post_id){

       // First we need to check if the current user is authorised to do this action.
       //Currently capabilities of property post type is the same as normal post type
      if ( isset($_POST[\'post_type\']) && \'post\' == $_POST[\'post_type\'] ) {
        if ( !current_user_can( \'edit_post\', $post_id ) ) return;
       }

     // Secondly we need to check if the user intended to change this value.
     if ( !isset( $_POST[\'prodInfo_noncename\'] ) || ! wp_verify_nonce( $_POST[\'prodInfo_noncename\'], plugin_basename( __FILE__ ) ) )
        return;

        // Thirdly we can save the value to the database
    if(isset($_POST[\'metadata_price\']) ):
            //Don\'t forget sanitize
        update_post_meta($post_id, \'metadata_price\', intval( $_POST[\'metadata_price\'] ) );
    else:
        if (isset($post_id)) {
        delete_post_meta($post_id, \'metadata_price\');
        }
    endif;  

    if(isset($_POST[\'metadata_sale\']) ):
            //Don\'t forget sanitize
        update_post_meta($post_id, \'metadata_sale\', 1 );
    else:
        if (isset($post_id)) {
        delete_post_meta($post_id, \'metadata_sale\');
        }
    endif;

    if(isset($_POST[\'metadata_sale_percentage\']) ):
            //Don\'t forget sanitize
        update_post_meta($post_id, \'metadata_sale_percentage\', intval( $_POST[\'metadata_sale_percentage\'] ) );
        if ( $_POST[\'metadata_sale_percentage\'] > 0 ) {
                         $finalprice  = $_POST[\'metadata_price\'] - ($_POST[\'metadata_sale_percentage\'] * $_POST[\'metadata_price\'])/100;
                         update_post_meta($post_id, \'metadata_final_price\', $finalprice );
                    } else {
                         delete_post_meta($post_id, \'metadata_final_price\');
                    }
    else:
        if (isset($post_id)) {
        delete_post_meta($post_id, \'metadata_sale_percentage\');
        }
    endif;

    }

}

// Instantiate our class
$Price_Metabox = new Price_Metabox();
然后,显示元值:

$meta = get_post_custom($post->ID);
echo \'Price: \' . $meta[\'metadata_price\'][0];
if($meta[\'metadata_sale\'][0] > 0){
    echo \'Discount (%): \' . $meta[\'metadata_sale_percentage\'][0];
    echo \'Final price: \' . $meta[\'metadata_final_price\'][0];
 }
请记住,这只是一个快速代码。它可能有错误,或者可能需要对生产环境进行一些改进。

此外,我建议使用分类术语将产品分组为折扣,并为价格、折扣等使用自定义字段。

结束

相关推荐

shortcode in a custom metabox

我正在尝试将插件中的短代码添加到我的自定义元数据库中。我已经读过,这不是我要做的事情,但在这种情况下,我确实需要它来工作。客户端可能不会添加视频,但可能会向其中添加图像,或者需要一些东西来确保它仍然可以用于标准内容。我遇到的问题是,它只输出这样的短代码-[youtube id=“vfGZZJnoJ0U”]我曾尝试向我的metabox中添加过滤器,但仍然显示了这一点。这是我的自定义metabox设置:add_action(\'add_meta_boxes\', \'testimonials_meta_box