web-dev-qa-db-fra.com

Comment utiliser un hook pour écraser un appel update_post_meta dans un plugin?

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!

1
Highly Irregular

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.

1
Samuel Elh