I want to add some user meta to a post (in my case WooCommerce product) after saving it. I guess that’s the best approach?
I found a solution which does somehting like this: https://wordpress.stackexchange.com/a/273271/96806
But it seems, that it does that only once?
Here’s the code:
function update_post_meta_with_user_meta() {
//setup arguments to only get users with author role
$user_args = array(
'role' => 'author',
);
$authors = get_users( $user_args );
//the below foreach could be replaced by adding something like:
// fields => array( 'ID' ) to $user_args
//instead I am just going through returned array of WP_User objects
// and putting IDs into array
foreach ( $authors as $a ) {
$author_ids[] = $a->ID;
}
//setup post query arguments to only give us posts with authors in author_id array
//which means only posts that have an author with the WP role of author
// should exclude Editors, Admins, etc. that maybe have authored posts
$post_args = array(
'author__in' => $author_ids,
);
//a new WP_Query with these args
$post_query = new WP_Query( $post_args ) ) );
//make sure we have posts returned
if ( $post_query->have_posts() ) {
//loop
while ( $post_query->have_posts() ) {
$post_query->the_post();
//set $post_id variable to current post
$post_id = get_the_id();
//get author meta for author of current post
$author_genere = get_the_author_meta('genere');
//update the meta of the current post (by ID)
// with the value of its author's user meta key
update_post_meta( $post_id, 'genere', $author_genere );
}
//reset the postdata
wp_reset_postdata();
}
}
//hook the above to init
add_action( 'init', 'update_post_meta_with_user_meta' );
Is there any way to do that when saving the post/product?
2
Answers
I guess I found an answer:
The function gets the meta field of the user and stores it in the database after saving.
While your answer may work as ‘workaround’, it contains some unnecessary steps and there is a much more suitable hook for this.
woocommerce_admin_process_product_object
– save product meta data when saving the product in backend: