GT Toledo GT Toledo - 3 months ago 9
PHP Question

wordpress add field for every custom type

I want to create a stock level field in WooCommerce Products for every Store custom post type.
I've already created the Store custom post type and added 3 stores to it. I want to automatically add a "stock level at store" field every time someone adds a Store so that I could check the stocks at store level.

I'm trying to put the custom field at the Products->Inventory-> right under the Stock Quantity.

I've tried this:

$post_type = 'store';
$tax = 'show-topic';
$inv_arg_terms = get_terms(array('orderby' => 'id', 'order' => 'ASC'));
if ($inv_arg_terms) {
$args = array(
'post_type' => $post_type,
'post_status' => 'publish',
'posts_per_page' => - 1,
'orderby' => 'title',
'order' => 'ASC'
); // END $args
$my_query = null;
$my_query = new WP_Query($args);
if ($my_query->have_posts()) {
while ($my_query->have_posts()) : $my_query->the_post();

add_action( 'woocommerce_product_options_inventory_product_data', 'wc_inventory_stock_product_field' );
function wc_inventory_stock_product_field() {
woocommerce_wp_text_input( array( 'id' => 'stock_level_' . the_title(), 'class' => 'short wc_input_stock', 'label' => __( 'Stock Level at ' . the_title(), 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')' ) );
}

add_action( 'save_post', 'wc_cost_save_product' );
function wc_cost_save_product( $product_id ) {

// stop the quick edit interferring as this will stop it saving properly, when a user uses quick edit feature
if (wp_verify_nonce($_POST['_inline_edit'], 'inlineeditnonce'))
return;

// If this is a auto save do nothing, we only save when update button is clicked
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( isset( $_POST['stock_level_' . the_title()] ) ) {
if ( is_numeric( $_POST['stock_level_' . the_title()] ) )
update_post_meta( $product_id, 'stock_level_' . the_title(), $_POST['cost_price'] );
} else delete_post_meta( $product_id, 'stock_level_' . the_title() );
}
endwhile;
} // END if have_posts loop
wp_reset_query();
} // END if $inv_arg_terms


and I got this:


Fatal error: Call to undefined function get_userdata() in
.../wp-includes/query.php on line 4758


Is what I'm thinking possible? How do I go about it?

Thanks, appreciate every help I could get.

Answer

Finally got it to work. Here's the code:

add_action( 'woocommerce_product_options_inventory_product_data', 'wc_stock_product_field' );

add_action( 'woocommerce_process_product_meta', 'wc_stock_save_product' );

function wc_stock_product_field() {

  global $woocommerce, $post;

$post_type = 'store';
$args = array(
    'post_type' => $post_type,
    'post_status' => 'publish',
    'posts_per_page' => - 1,
    'orderby' => 'id',
    'order' => 'ASC',
    'caller_get_posts' => 1
    ); // END $args

$store_query = null;
$store_query = new WP_Query($args);

if ($store_query->have_posts()) {
    while ($store_query->have_posts()) : $store_query->the_post();
        woocommerce_wp_text_input( 
            array( 
                'id' => get_the_id() , 
                'class' => 'short wc_input_stock', 
                'label' => __( 'Stock Level @ ' . get_the_title(), 'woocommerce' ) ) );
    endwhile;
} // END if have_posts loop
wp_reset_query();

}

 function wc_stock_save_product( $product_id ) {

 // stop the quick edit interferring as this will stop it saving properly, when a user uses quick edit feature
 if (wp_verify_nonce($_POST['_inline_edit'], 'inlineeditnonce'))
    return;

// If this is a auto save do nothing, we only save when update button is clicked
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
    return;

    $post_type = 'store';
    $args = array(
        'post_type' => $post_type,
        'post_status' => 'publish',
        'posts_per_page' => - 1,
        'orderby' => 'id',
        'order' => 'ASC',
        'caller_get_posts' => 1
        ); // END $args

    $store_query = null;
    $store_query = new WP_Query($args);

    if ($store_query->have_posts()) {
        while ($store_query->have_posts()) : $store_query->the_post();
            if ( isset( $_POST[get_the_id()] ) ) {
                if ( is_numeric( $_POST[get_the_id()] ) )
                    update_post_meta( $product_id, get_the_id(), $_POST[get_the_id()] );
            } else delete_post_meta( $product_id, get_the_id() );
        endwhile;
    } // END if have_posts loop
    wp_reset_query();


}