I am trying to send the customer an invoice once an order has been placed, and the user reaches the thankyou page.
I thought i could use the following:
function sendinvoice($orderid)
{
$email = new WC_Email_Customer_Invoice();
$email->trigger($orderid);
}
add_action('woocommerce_thankyou','sendinvoice');
But on the thank you page i then see the following error:
Fatal error: Class 'WC_Email_Customer_Invoice' not found in /***/index.php on line 174
Any ideas on how i can resolve this?
it looks you need to specify the full path where 'WC_Email_Customer_Invoice' class is, you could either use require or include, for example:
include_once(WP_PLUGIN_DIR . 'woocommerce/includes/emails/class-wc-email-customer-invoice.php');
UPDATE: actually the best way to do it, is using global $woocommerce; and then just call it like this:
WC()->mailer()->emails['WC_Email_Customer_Invoice']->trigger($orderid);
Hope this helps!
You need to include these 2 files;
include_once('../wp-content/plugins/woocommerce/includes/emails/class-wc-email.php');
include_once('../wp-content/plugins/woocommerce/includes/emails/class-wc-email-customer-invoice.php');
UPDATED;
There is another dependent file;
include_once('../wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php');
Related
I'm new to WP development. I need to write a hook to check if the currently logged in user is viewing a post listed within a specific category, and then redirect user if they're lacking certain meta data.
I tried creating this function:
add_action('init','check_user_post_category');
however inside that function I was unable to get the post object (I have tried everything I found on the web!)
global $post; // This object is not valid at this time
global $wp; // $wp->request is empty
$_REQUEST; // This var is giving me an empty array! Is this normal??? :(
Could you kindly suggest, what hook is best to use in this case, and how to get the post object? Many thanks!
Use 'wp' hook instead of 'init'.
add_action('wp','check_user_post_category');
Maybe this would work for you.
I need to edit a template's header.php file and I want to check if it has a taxonomy named "store". If so, then I need to extract it's tag_ID.
When I edit the page (it's not a WordPress Page type) I can see these values in the admin url:
taxonomy=store&tag_ID=720
So I know there is a way but I'm having trouble getting any good results. I tried the
method detailed here to extract at least the tag_ID but I'm getting NULL:
$tag_id=get_query_var('tag_ID');
echo $tag_id; //NULL
Edit:
To be clear in regards to the tag_ID because it may be confusing, all I really want is to get the unique id of the requested page so I figure seeing first if it has a taxonomy named "store" and then getting the right one using the tag_id.
AS far as i understand your question, You should try this:-
$data = get_queried_object();
With this, you can get what page/post/taxonomy is being called.
Just print-out/var_dump this $data variable, you will get full object of page/post/taxonomy.
Hope this may help you.
I'm using Contact Form 7 in a wordpress site with multiple forms.
I need to direct one form to a different form action url than the others.
I found the reply below for a previous thread but I'm not sure how to go about it.
Can someone specify what exact code needs to be included in "additional settings"
and what the code in functions.php would look like?
Thanks for your help!
reply from diff. thread, which I don't completely understand...
*Yes, you have to change the "action" attribute in the form using this Filter Hook wpcf7_form_action_url. (what would be the code?) You could add the hook into your theme's functions.php and then just process the form data in your ASP page.(code?) *
Since you're not familiar with PHP code at all, I'll give you a bit of a crash course in coding within the Wordpress API.
First off, you need to know the difference between functions and variables. A variable is a single entity that is meant to represent an arbitrary value. The value can be anything. A number, somebody's name, or complex data.
A function is something that executes a series of actions to either send back - or return - a variable, or alter a given variable.
<?php
$a = 1; //Number
$b = 'b'; //String *note the quotes around it*
$c = my_function(); //Call to a function called my_function
echo $a; //1
echo $b; //b
echo $c; //oh, hello
function my_function()
{
return 'oh, hello';
}
?>
Wordpress utilizes its own action and filter system loosely based on the Event-Driven Programming style.
What this means is that Wordpress is "listening" for a certain event to happen, and when it does, it executes a function attached to that event (also known as a callback). These are the "Actions" and "Filters". So what's the difference?
Actions are functions that do stuff
Filters are functions that return stuff
So how does this all fit in to your problem?
Contact Form 7 has its own filter that returns the URL of where information is to be sent by its forms.
So lets look at the basics of a Filter Hook
add_filter('hook_name', 'your_filter');
add_filter is the function that tells Wordpress it needs to listen
for a particular event.
'hook_name' is the event Wordpress is listening for.
'your_filter' is the function - or callback - that is called when the 'hook_name' event is fired.
The link to the previous thread states that the hook name you need to be using is 'wpcf7_form_action_url'. That means that all you have to do is make a call to add_filter, set the 'hook_name' to 'wpcf7_form_action_url', and then set 'your_filter' to the name of the function you'll be setting up as your callback.
Once that's done, you just need to define a function with a name that matches whatever you put in place of 'your_filter', and just make sure that it returns a URL to modify the form action.
Now here comes the problem: This is going to alter ALL of your forms. But first thing's first: See if you can get some working code going on your own. Just write your code in functions.php and let us know how it turns out.
UPDATE:
The fact that you were able to get it so quickly is wonderful, and shows the amount of research effort you're putting into this.
Put all of this in functions.php
add_filter('wpcf7_form_action_url', 'wpcf7_custom_form_action_url');
function wpcf7_custom_form_action_url()
{
return 'wheretopost.asp';
}
As mentioned before, that will affect ALL of your forms. If this is only supposed to affect a form on a given page, you can do something like this:
add_filter('wpcf7_form_action_url', 'wpcf7_custom_form_action_url');
function wpcf7_custom_form_action_url($url)
{
global $post;
$id_to_change = 1;
if($post->ID === $id_to_change)
return 'wheretopost.asp';
else
return $url;
}
All you would need to do is change the value of $id_to_change to a number that represents the ID of the Post/Page you're trying to affect. So if - for example - you have an About Page that you would like to change the Action URL, you can find the ID number of your About Page in the Admin Dashboard (just go to the Page editor and look in your URL for the ID number) and change the 1 to whatever the ID number is.
Hope this helps you out, and best of luck to you.
Great answer #maiorano84 but I think you should check form ID instead of Post. Here is my version.
add_filter('wpcf7_form_action_url', 'wpcf7_custom_form_action_url');
function wpcf7_custom_form_action_url($url)
{
$wpcf7 = WPCF7_ContactForm::get_current();
$wpcf7_id = $wpcf7->id();
$form_id = 123;
return $wpcf7_id == $form_id? '/action.php' : $url;
}
Another thing you might need to disable WPCF7 AJAX. That can be disabled by placing the following code in your theme functions.php
apply_filters( 'wpcf7_load_js', '__return_false' );
You can add actions after a successful submission like the documentation says
Adding a filter will work in the sense that it will change the action on the form but unfortunately it will also break the functionality of the plugin. If you add the filter like other answers suggest the form will keep the spinner state after submission.
You can make the form do something else on submit by using advanced settings such as:
on_submit: "alert('submit');"
more details about advanced settings here.
According to #abbas-arif, his solution works great, but have a limitation. This solution change the form's action on all forms present in post with that ID.
A better solution should be to use directly the form's ID. To get it, whit wordpress >5.2, you can use:
add_filter('wpcf7_form_action_url', 'wpcf7_custom_form_action_url');
function wpcf7_custom_form_action_url($url)
{
$cf7forms = WPCF7_ContactForm::get_current();
$Form = $cf7forms -> id;
switch($Form){
case 1:
return 'destination like salesforce url 1...';
case 2:
return 'destination like salesforce url 2...';
case 3:
return 'destination like salesforce url 3...';
default:
return $url;
}
}
I'm having trouble dealing with hooks for the Views module in Drupal. What I'm trying to do is determine which view is being rendered so that I can identify it and make changes to it. IOW, I don't know ahead of time which view I'm working on.
In the code below, I've replaced my actual module name with "MODULENAME".
In my .module file I have included a file MODULENAME.views.inc file with the following:
include_once ( dirname(__FILE__) . '/MODULENAME.views.inc');
In the .views.inc file, I have a MODULENAME_views_api function like this:
function MODULENAME_views_api() {
return array('api' => 2, 'path'=> drupal_get_path('module', 'MODULENAME'),
);
}
Those seem to work just fine. So, now I try to get down to business with an actual hook...
function MODULENAME_views_pre_render(&$view) {
$get_view_info = $view->name;
echo $get_view_info;
}
MODULENAME_views_pre_render();
The problem is this throws an error, "Missing argument 1 for MODULENAME_views_pre_render().
So, obviously it expects me to pass in an identifier of some sort to tell it which view I want. But that's the whole point of this function is to determine which view is being rendered. If I knew the answer to that, then I wouldn't need to call the function in the first place.
Am I missing something obvious? Is there a function call that I can use to return this identifier?
You hook into things by implementing hooks, so this part of your code is ok:
<?php
function MODULENAME_views_pre_render(&$view) {
$get_view_info = $view->name;
echo $get_view_info;
}
But this:
<?php
MODULENAME_views_pre_render();
Why? You're not generating a view, Views is. It's not your job to invoke the hook. You just implement it.
So, you need to make changes to the view? you do it right there:
<?php
function MODULENAME_views_pre_render(&$view) {
if ($view->name == 'TheViewIWantToModify') {
// Make some changes to the $view
}
}
And that's it.
Also, note that depending on the type of modifications you want to do, you might want to implement another hook instead of hook_views_pre_render(). Take a look at the docs/docs.php file that comes with Views (version 6.x-2.12 at least, I don't know which version you have, and BTW you should indicate this) and starting on like 538 you'll see a few hook_views_pre_ and hook_views_post_ type of hooks (that is, their descriptions, for you to know what each of them are good for), and then you can decide which one to implement in your module.
I wrote a simple twitter connect plugin which needs to display the 'logged in' user's name in the header after he logs in. The function is working properly but I am unable to display the $user variable in my header or anywhere outside the function even though it is assigned global.
Here is the end of the login function:
$user= $Twitter->get_accountVerify_credentials();
print_r($user);
// show screen name (not real name)
$twitter_user = $user->screen_name;
// show profile image url
$twitter_image = $user->profile_image_url;
I can see that it is successful because the $user gets printed, but when I call it in my header.php file the same way I can an error: Notice: Undefined variable: user
Any suggestions?
As opposed to getting wrapped up in the scope of the variables, I'd write a function to get this information. Something like:
function get_twitter_user_name(){
$user= $Twitter->get_accountVerify_credentials();
return $user->screen_name;
}
Then, in the header, where I want to display the name, I'd call the function like so:
<?php echo get_twitter_user_name(); ?>
Depending on the structure of your code, this may look a little different than what I have here, but hopefully this will give you another way of tackling this problem.