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>
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.
Does anyone know how to not clear the form on submit when using WPForms (Wordpress). I have hooked in custom processing on submit and I want to just leave the form up on the page, and ajax process the input, and not clear the form on completion (so the user can submit again easily on any error).
If you are willing to make changes to the code, you could consider returning the input value which has been submitted to be displayed in the input field... I have extracted some code from the woocommerce form-login.php as an example:
<input type="email" class="woocommerce-Input woocommerce-Input--text input-text" name="username" id="username" autocomplete="username" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; ?>" />
If you input a value for username, hit submit, and the form returns for any reason to that same page, the last entered value would be displayed in that input field.
I wrote my own WordPress Plugin and I am trying to just refresh the page after form submit.
My code looks like this:
<form method="post" action="<?php echo get_admin_url();?>admin-post.php">
<input type="hidden" name="action" value="send_nl">
<input type="text" name="nl_title" placeholder="Title">
<textarea type="text" name="nl_text" placeholder="Message"></textarea>
<input type="submit" name="submit_nl">
</form>
If I submit the form everything works fine. I get an Email with the right data, but I get redirected to a white page: to https://www.myurl.com/wp-admin/admin-post.php! Now I would need a hook or something similar to redirect to my plugin page again.
I searched a lot, but I couldn't find the right solution - god knows why.
Thank you.
After you have send, save your date you should the function wp_safe_redirect() from the WP API to redirect to your page. A source example below.
wp_safe_redirect(
// Sanitize.
esc_url(
// Retrieves the site url for the current site.
site_url( '/wp-admin/admin-post.php' )
)
);
exit();
You see this usage here in this repo in a function to import data from a json string in the database in the full context.
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.