all. Please give some help to me, i am a bit newbie in woocommerce mechanics.
I've got a single product page where after clicking on Buy button product is added to cart with variation data in POST query (wc-ajax: add_to_cart). In this case POST data looks like this:
woovr_variation_1465: on
woovr_variation_1465: on
attribute_%d0%be%d0%b1%d1%8a%d0%b5%d0%bc: 2 x 1000 ml + 500 ml
quantity: 1
(empty)
product_id: 1467
variation_id: 1467
Button that is clicked on in this case:
<button type="submit" class="single_add_to_cart_button button alt added">Buy</button>
And there are also some hidden inputs near with variation data etc:
<input type="hidden" name="add-to-cart" value="1465">
<input type="hidden" name="product_id" value="1465">
<input type="hidden" name="variation_id" class="variation_id" value="1467">
So, after all everything is working great, product is added to cart and if no variation selected it is added with default variation id.
But on my main page, products are generated customly. And same wc-ajax: add_to_cart method has little less POST data:
product_sku:
product_id: 1465
quantity: 1
Button itself:
<a href="?add-to-cart=1465" data-quantity="1" class="product-add-to-cart product_type_simple add_to_cart_button ajax_add_to_cart added" data-product_id="1465" data-product_sku="" aria-label="Add to label" rel="nofollow">
In this case product is added to cart without any variation.
I need to repeat same behaviour in 2nd case as it works in 1st case i wrote about in the beggining of the post. In other words how do i generate same hidden input fields and add product to cart with variation id ?
Related
I have created the following code which I have added to the PHP function to create two input fields placed just below the fixed-rate shipping method on the check out page. In these two input fields customers can enter their shipping provider and account number.
The input fields work perfectly, the problem is that when the order is placed, the values entered (shipping provider name and account number) in these two fields do not appear in the order details on woocommerce.
Can you please advise me how I can make the two fields appear on the woocommerce order management page so that I know what customers have entered?
code:
function checkout_shipping_additional_field( $method, $index )
{
if( $method->get_id() == 'flat_rate:35' ){
echo '<br>
<input type="text" id="Name" name="Name" placeholder="Shipping Provider">
<input type="text" id="Name" name="Name" placeholder="Account Number">';
}
}
I'd like to modify cart.php to contain a dropdown list of "checkout agents" and then retrieve that data when checking out to redirect to the correct agent (different URLs).
I already have cart.php in the child theme. I have created a cart-custom-checkout.php page to handle retrieving the cart contents and redirecting (wp_redirect) to an agents URL (I tested a single agent by building the URL from the cart contents and it works great).
I enabled the custom checkout via modifying the child theme functions.php as follows:
// enable custom checkout for woocommerce
add_shortcode( 'cart_custom_checkout', 'cart_custom_checkout_function' );
function cart_custom_checkout_function() {
wc_get_template('cart/cart-custom-checkout.php');
}
Then used that shortcode on the checkout page.
Now that everything works like I want in concept, the final step is to create the dropdown list in the cart.php so one of several agents can be chosen. From there I then need to somehow retrieve that in the cart-custom-checkout.php page. If it were part of the WC() cart data or something like that would be great.
Can someone help explain how I can do what I'm wanting to do?
TIA!!
Update: I've gone a little further and added my dropddown list as follows:
add_action('woocommerce_after_cart_totals', 'woocommerce_cart_add_resellers');
function woocommerce_cart_add_resellers() {
wc_get_template('cart/cart-add-reseller.php');
}
The cart-add-reseller.php contents are:
<div style="margin-top:5px">
<select name="agent">
<option value="Agent1">Use Agent1</option>
<option value="Agent2">Use Agent2</option>
</select>
</div>
Now just need to get what agent value is in the cart-custom-checkout.php page. How do I do that?
Update2: I am not getting any $_POST data when clicking the proceeded to checkout button.
// enable custom checkout for woocommerce
add_shortcode( 'cart_custom_checkout', 'cart_custom_checkout_function' );
function cart_custom_checkout_function() {
var_dump($_POST);
wc_get_template('cart/cart-custom-checkout.php');
}
It's empty.
Update 3: I've check $post which just gives me the checkout page itself with the shortcode in it, $_POST is empty, $_SESSIONS is empty, $_GET is empty. I'm not sure where the $_POST data went, maybe some javascript or something like that which I know nothing about. If I could just know a filter or action or something to give me the $_POST data, it will have the value I need. So I give up for now.
Any help would be appreciated.
If I fully understand what you have, if you were to add the following in functions.php, it will add the required field to the cart page and allow it to be accessible via $_POST on the checkout page. This essential replaces the default Proceed to Checkout button, with a new one that includes the select field and a post action.
add_action( 'woocommerce_proceed_to_checkout', 'add_agent_before_proceed_to_checkout', 15 );
function add_agent_before_proceed_to_checkout() {
remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );
?>
<form id="checkout_form" method="POST" action="<?php echo esc_url ( wc_get_checkout_url() ); ?>">
<div style="margin-top:5px">
<select name="agent">
<option value selected="selected">-- Select an Agent --</option>
<option value="Agent1">Use Agent1</option>
<option value="Agent2">Use Agent2</option>
</select>
</div>
<button type="submit" class="checkout-button button alt wc-forward" style="width:100%;"><?php
esc_html_e( 'Proceed to checkout', 'woocommerce' ) ?></button>
</form>
<?php
}
The reason what you had added to cart didn't work, is the Proceed to Checkout button (woocommerce\templates\cart\proceed-to-checkout-button.php) by default doesn't do a post action, it is actually a link. Also the spot you were adding your input was not within a form so wouldn't have posted the value.
I used the following to change minimum product quantity for cart page:
add_filter( 'woocommerce_quantity_input_args', 'custom_cart_min_qty', 10, 2 );
function custom_cart_min_qty( $args, $product ) {
$args['min_value'] = 1;
return $args;
}
This time instead of changing min, I would like to read max value on both product and cart page (there would be a loop for all cart products I understand) and then use this information to decide whether to display quantity increment buttons for fields or not. I would like not to display them when maximum quantity is 1 (even if min = 0) or when min quantity = maximum quantity.
LoicTheAztec mentioned than equal min and max will hide input field, it is a very valuable information, kind of complicates things for me even more and I created a separate question for it:
question
I could write jQuery script to do the job, but I need PHP solution in order to avoid page load flash.
Input field with quantity buttons on product and cart page have the following HTML structure, after I've inserted these buttons using WooCommerce hooks:
<div id="qib-container">
<button type="button" class="minus qib-button">-</button>
<div class="quantity">
<label class="screen-reader-text" for="quantity_5ce95c090e36b">Product name</label>
<input type="number" id="quantity_5ce95c090e36b" class="input-text qty text" step="1" min="1" max="120" name="quantity" value="1" title="Qty" size="4" inputmode="numeric">
</div>
<button type="button" class="plus qib-button">+</button>
</div>
Sorry for the confusion and please let me know if additional information is needed.
Note: WooCommerce quantity input field is hidden if the min_value is equal to max_value
To read the product quantity max_value and check if it is equal to 1 (to hide quantity fields from product and cart pages), you will use the following:
add_filter( 'woocommerce_quantity_input_args', 'custom_cart_min_qty', 10, 2 );
function custom_cart_min_qty( $args, $product ) {
// When max value is equal to 1
if( $args['max_value'] == 1 ) {
$args['min_value'] = 1; // Set min value to 1 to hide the field
}
return $args;
}
Code goes in functions.php file of your active child theme (or active theme). Tested and work.
So, I got a payment plugin where some information is entered in an popup.
The popup stores the input data in a hidden input on the payment page
In payments field I got this for the hidden input:
<input type="hidden" class="" name="auth" id="auth" placeholder="" value="">
Via JS I put the value from the popup to the input hidden data, which definetly works!
Then I add an action:
add_action( 'woocommerce_checkout_update_order_meta', 'ccp_payment_update_order_meta' );
function ccp_payment_update_order_meta( $order_id ) {
update_post_data( $order_id, 'auth', sanitize_text_field($POST['auth']) );
}
Somehow after the submission of the checkout form the data ($POST['auth']) is empty.
Why is this happening?
How can I store the value right?
Got it sorted out. It need to be in an paragraph like that
<p class="form-row form-row-wide"><input type="hidden" ...></p>
I am working on a plugin, which creates a couple of Virtual pages, and I wish these links to be available in Menu admin page, to let users have the liberty to add them as they create menus.
I want to add a Meta box in Menu administration, very similar to Page/Category meta boxes, to let users select what page to add in their menu.
Apparently, the only possible research is in the core itself.
Here, /wp-includes/nav-menu.php, we can get how to insert the meta box:
add_action('admin_init', 'so_13875144_nav_menu_meta_box');
function so_13875144_nav_menu_meta_box() {
add_meta_box(
'my-custom-nav-box',
__('Custom Box'),
'so_13875144_display_menu_custom_box',
'nav-menus',
'side',
'default'
);
}
function so_13875144_display_menu_custom_box() {
/* Not sure about this global var */
//global $_nav_menu_placeholder;
//$_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1;
?>
<p id="menu-item-custom-box">
<label class="howto" for="custom-menu-item-custom-box">
<span><?php _e('URL'); ?></span>
<input id="custom-menu-item-custom-box" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-custom-box]" type="text" class="code menu-item-textbox" value="my text" />
</label>
</p>
<?php
}
But, the hard part, which I haven't managed to make work, is to save the value.
This is the file /wp-admin/nav-menus.php that has to be studied.
Tried to hook into the action wp_update_nav_menu, but the custom meta box input field is not being passed into $_POST.
WordPress Answers may have some hint: https://wordpress.stackexchange.com/search?q=wp_update_nav_menu
http://codex.wordpress.org/Function_Reference/add_meta_box
Use the post_type 'nav-menus'
I know I'm late to the party but just for anyone else trying to do this...
b__ is right, that is the way to get it to show on the page except it is much easier to use checkboxes than any other field because there is an inbuilt javascript function that looks for checkboxes.
All you need to do is copy the html from an existing checkbox -
<li><label class="menu-item-title"><input type="checkbox" class="menu-item-checkbox" name="menu-item[-1][menu-item-object-id]" value="2"> Sample Page</label><input type="hidden" class="menu-item-db-id" name="menu-item[-1][menu-item-db-id]" value="0"><input type="hidden" class="menu-item-object" name="menu-item[-1][menu-item-object]" value="page"><input type="hidden" class="menu-item-parent-id" name="menu-item[-1][menu-item-parent-id]" value="0"><input type="hidden" class="menu-item-type" name="menu-item[-1][menu-item-type]" value="post_type"><input type="hidden" class="menu-item-title" name="menu-item[-1][menu-item-title]" value="Sample Page"><input type="hidden" class="menu-item-url" name="menu-item[-1][menu-item-url]" value=""><input type="hidden" class="menu-item-target" name="menu-item[-1][menu-item-target]" value=""><input type="hidden" class="menu-item-attr_title" name="menu-item[-1][menu-item-attr_title]" value=""><input type="hidden" class="menu-item-classes" name="menu-item[-1][menu-item-classes]" value=""><input type="hidden" class="menu-item-xfn" name="menu-item[-1][menu-item-xfn]" value=""></li>
but give them each a unique ID and put your details in for the URL, title etc.
Then, add a submit button at the end to add to the menu -
<input type="submit" class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="YOUR NAME" id="YOUR ID" onclick="(function(){$('#THE DIV YOU HAVE PUT YOUR LIST IN').addSelectedToMenu( api.addMenuItemToBottom );})"/>
And that should add the item to the list.
This is a pretty old question but I was trying to do this today so in case it points anyone in the right direction...
I won't cover adding the meta box, as it's covered above. I'll also only cover a custom link as I haven't looked into adding a post, page, term link etc.
Just to cover the logic of how I got there...Looking at wp-admin/js/nav-menu.js, for a custom link you'll want to use window.wpNavMenu.addItemToMenu(). This ajax submits to the function wp_ajax_add_menu_item() in wp-admin/includes/ajax-actions.php. This then submits to wp_save_nav_menu_items() in wp-admin/includes/nav-menu.php. The upshot from looking at these files is that all menu items are of a post_type, taxonomy, post_type_archive or custom type.
Hook the javascript to the HTML as you wish, but if you want to submit a custom link, you need to call addItemToMenu() as follows:
var url = 'http://example.com';
var title = 'Link text';
window.wpNavMenu.addItemToMenu({
'-1': {
'menu-item-type': 'custom',
'menu-item-url': url,
'menu-item-title': title,
}
}, window.wpNavMenu.addMenuItemToBottom);
Menu item type has to be "custom" otherwise it requires info for a post, page etc. with which to associate the menu item.