Un plugin que j'utilise contient le code suivant:
$download = array(
'post_title' => $title,
'post_content' => '',
'post_status' => 'publish',
'post_author' => get_current_user_id(),
'post_type' => 'dlm_download'
);
$download_id = wp_insert_post( $download );
if ( $download_id ) {
// Meta
update_post_meta( $download_id, '_featured', 'no' );
update_post_meta( $download_id, '_members_only', 'no' );
Je veux créer mon propre plugin pour définir la valeur _members_only sur yes dans tous les cas. Jusqu'à présent, le code que j'ai est:
function dlmc_members_only_default( $check, $object_id, $meta_key, $meta_value, $prev_value )
{
// Avoid infinite recursion:
remove_filter( current_filter(), __FUNCTION__ );
// Modify the meta value;
$meta_value = "yes";
// Update the modified value.
update_post_meta( $object_id, $meta_key, $meta_value, $prev_value );
// Return something else than null
return true;
}
add_filter( 'update_post_metadata', 'dlmc_members_only_default', 11, 5 );
Malheureusement, cela semble mettre wordpress dans une boucle infinie, malgré la ligne destinée à arrêter cela. Y a-t-il un meilleur moyen d'atteindre mon objectif? Merci!
Si vous raccrochez dans les crochets fournis dans la fonction update_post_meta()
et que vous utilisez toujours cette fonction dans votre rappel, cela entraînerait une boucle qui se terminerait probablement par le délai d'attente.
Selon les commentaires:
add_action("wp_insert_post", function( $post_ID ) {
if ( ! $post_data = get_post( $post_ID ) ) return;
// try to make this run only once needed ( from the question, the content is empty and cPT is dlm_download )
if ( "dlm_download" == $post_data->post_type && ! $post_data->post_content ) {
update_option( "dlm_download_members_only_yes", $post_data->ID );
}
return;
}, 10);
add_action("init", function() {
if ( $pid = (int) get_option( "dlm_download_members_only_yes" ) ) {
update_post_meta( $pid, "_members_only", "yes" );
delete_option( "dlm_download_members_only_yes" );
} return;
});
init
hook est toujours présent (chargement de page, AJAX, etc.), donc cela devrait toujours fonctionner et fonctionnerait également sur plusieurs entrées.