I have a custom post type which has some metadata to check in order to be saved or updated. Now I would like to know if it's possible to abort the post creation or update if the check on metadata fails.
To give a simple context and fix the idea, let's say my custom post has a metabox with two date input, let's call them date_start and date_end. When the user try to publish or update the post in the backend I would like to check those metadata and if date_start >= date_end the process aborts without actually update or insert the post into the database. The logic I'm trying to achieve would be something like this:
add_action( 'before_updating_post', check_metadata );
function check_metadata() {
if ( condition ) {
continue post save/update
} else {
abort post save/update // The post will not be saved/updated
}
}
Where 'before_updating_post' is a fantasy name for an hook which allows me to abort the process of updating the post.
I've looked at some questions related to post update hooks but was unable to find some which allows to abort the process being most of them related to data manipulation before saving.
I am using wordpress.
I need to run a function (send a email) when a scheduled post is automatically posted.
What hook/function should I use ?
Use post status transition hooks
function scheduled_post_published($object)
{
// whatever it is you need to do
}
add_action('future_to_publish', 'scheduled_post_published');
I think you need to use the hook transition_post_status, from the documentation:
transition_post_status is a generic action that is called every time a post changes status.
And on https://wordpress.stackexchange.com/a/100657 I found piece of code that can you use as inspiration.
Here is how I've implemented it:
add_action( 'delete_post', array( 'MyClassName', 'delete' ) );
In the delete function I was using a $wpdb->insert command to see whether the function gets called. But I see that the $wpdb->insert command is called twice (inserts two rows in my table). Any ideas as to why something like this might happen?
I've also attempted to use the before_delete_post hook since it doesn't really make a difference to me but I get the same outcome.
EDIT:
It seems as though the delete function is called for each entry in the wp_posts table for some reason. So if the post has 3 revisions, the delete function will be called 4 times (the original post + 3 revisions). This is really weird behavior.
I found my solution.
The function you hook into delete_post (or probably any other similar hook) executes as many times as needed. Considering delete_post needs to delete the post and all of its revisions, it will always run more than once. In order to avoid having your function execute each time WordPress deletes a record from the database you can use did_action( $hook ). This function returns the number of times the hook executed. With this in consideration, we can fix our multiple-executions problem by placing this condition into our function:
if (did_action('delete_post') === 1)
{
// execute code here
}
I have developed wordpress for days,but I have found no way to these like:add_action,add_filter,user_can, I don't know what are the functions they refere to.
worse still,I don't know the parameter,today I want add a column to user list table admin panel,I fortunatelly found a tutorial, here is the code
add_filter( 'manage_users_columns', 'add_user_column');
function add_user_column( $columns){
$columns['available_stickers'] = __('Stickers Available', 'available_stickers');
return $columns;
}
add_filter('manage_users_custom_column', 'add_user_column_value', 10, 3);
function add_user_column_value( $value, $column_name, $user_id ){
if ( 'available_sticker' == $column_name)
$value = get_user_meta($user_id,"available_stickers",true);
return $value;
}
Even thought I made it, but I don't know where the parameter manage_users_columns comes or why I should use manage_users_columns but not other code? Puzzled
and also they have matched code like apply_filter etc.
some one can help me out of the maze,oops!
WordPress is beautifully designed because most of the actions it does are not executed directly, but through what are called actions and filters. This gives you, the developer, a possibility to hook onto any of these operations. Hooking means you can squeeze your own logic right in the middle of WP's logic, in a very clean way, only by declaring that you want things to be done where the corresponding hooks are used. More precisely:
Actions
So, for example, when a post is saved, WordPress does not just save the post, it does it by executing this line:
do_action( 'save_post', $post_ID, $post );
This is a way to give a name to this action (save_post). That means two things :
1) you can execute the exact same action by using the same line of code somewhere else.
2) you can add your own logic to be executed during this action. How? just by "adding" your custom functions to the action, like this :
add_action('save_post', 'name_of_the_function_you_want_to_execute_when_post_is_saved');
So 'save_post' is the name of the hook, add_action gives you the possibility to add your own function to the action for this hook and do_action actually executes the action.
Filters
Filters are similar to actions, but instead of being used when executing a command, they are used to treat a value, an object, a string or some text (when "filtering" it). Again, instead of just manipulating objects and strings in such a way that you would have no other possibility than dive into the core code to access it, WordPress cleverly does many of its "filtering" operations with a special action called apply_filters(). This gives you the possibility, like for actions, to actually add your own filters to the filters already applied. So when showing the content of a post, WP would execute :
apply_filters('the_content', $post->post_content);
The name of the hook is the_content. If you use :
add_filter('the_content', 'your_function_to_execute_to_further_filter_content');
you can have a function named your_function_to_execute_to_further_filter_content()that can take the content as a parameter and return the filtered version of it after whatever treatment you wish to apply to it. Then this treatment will get applied anywhere in WP where the hook the_content is used to execute these filters (including WP default ones, plug-ins filters that were added to the same hook, and your own).
So here, you are using these hooks so you can interfere with WP operations without messing WP core code. You declare the extra operations you wish to execute and you let WP aware of this. WP will then have the courtesy to execute your functions everytime the corresponding hook action or filter is being executed.
im try to use wp_mail when a post is (created|updated) using the publish_post action
strange thing is it works fine when im editing and existing post, ie all the $post object can be retrieved using:
$post = get_post($post_id);
but when i use it on a new post it doesnt have the post object???
i can get the vars using the global $_POST but that bloats the code so much, checking if it there or now.
ive tried the other actions as well (save_post|wp_insert_post|publish_post-type)
has anyone ever had this?
You shall add a listener to the publish_post method:
add_action('publish_post','do_whatever');
function do_whatever(){
//what do you do
}
OR if you trying to code it in an OO way, you can:
include 'MyObj.php';
$my_obj = new MyObj();
add_action('publish_post', array($my_obj, 'do_whatever'));
//in your object php
class MyObj{
function do_whatever(){
//what do you do
}
}
NOTE: this setup will make the do_whatever call whenever you post is saved/auto saved. you have to do extra coding for your own purpuse.
It will be clear for us to know what are you trying to achieve in order to suggest you more information.