web-dev-qa-db-fra.com

Comment forcer la fonction à fonctionner en dernier lors de la sauvegarde du post?

Je ne sais pas comment forcer cette fonction à s'exécuter en tant que dernière fonction après l'exécution de toutes les autres opérations de sauvegarde de WP.

Ceci est mon code actuel dans mon plugin:

add_action( 'save_post', 'do_custom_save' ); 
function do_custom_save( $post_id ) { 


    // No auto saves 
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; 

    // make sure the current user can edit the post 
    if( ! current_user_can( 'edit_post' ) ) return;

    // assure the post type
    if ( ! get_post_type($post_id) == 'post' ) return;


    $latitude  = $_POST['rw_company_latitude'];
    $longitude = $_POST['rw_company_longitude'];
    $zoom      = '6';

    $lat_lon_zoom = $latitude . ', ' . $longitude . ', ' . $zoom ;

    update_post_meta($post_id, 'company_map', $lat_lon_zoom );


}

Comment forcer ce code à être exécuté et enregistré la variable mélangée comme dernière chose? Une fois toutes les autres sauvegardes et mises à jour terminées.

Parce qu’à présent, elle est mise à jour, mais elle est réécrite à nouveau avec la valeur du champ de carte original $ _POST ['company_map']. Je dois dire en quelque sorte à WP que cette fonction doit être exécutée en tant que dernière fonction lors de la sauvegarde/mise à jour des éléments de publication.

Comment faire ça?

4
Derfder

add_action a un paramètre priority qui est 10 par défaut, vous pouvez l'augmenter pour charger votre fonction en retard.

Changer add_action( 'save_post', 'do_custom_save' );

à

add_action( 'save_post', 'do_custom_save', 100 );

Désormais, la priorité est fixée à 100. Le chargement sera assez tardif et permettra à d'autres fonctions associées de se charger avant que cette fonction ne soit exécutée.

Pour plus de détails, vérifiez la référence de la fonction pour add_action .

9
Maruti Mohanty

La suggestion de Maruti Mohanty n’est pas mauvaise, mais elle échouera. Il existe de nombreuses actions principales avec une priorité plus élevée:

  • wp-admin/menu.php:

    add_action('admin_menu', '_add_themes_utility_last', 101);
    
  • wp-includes/admin-bar.php:

    add_action( 'wp_footer', 'wp_admin_bar_render', 1000 );
    
  • wp-includes/canonical.php

    add_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );
    
  • wp-includes/class-wp-admin-bar.php:

    add_action( 'admin_bar_menu', 'wp_admin_bar_add_secondary_groups', 200 );
    
  • wp-includes/class-wp-customize-manager.php:

    add_action( 'wp_redirect_status', array( $this, 'wp_redirect_status' ), 1000 );
    add_action( 'shutdown', array( $this, 'customize_preview_signature' ), 1000 );
    
  • wp-includes/widgets.php:

    add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 );
    

Et les plugins et les thèmes peuvent également utiliser une priorité plus élevée.

Vous devez donc inspecter le filtre ou l'action en cours dans $GLOBALS['wp_filter'], rechercher la clé la plus élevée et ajouter quelque chose. Sachez qu'une priorité pourrait être une chaîne , car il s'agit d'une clé de tableau:

La clé peut être soit un entier ou un chaîne .

Faisons donc une fonction get_latest_priority() comme outil:

/**
 * Get the highest needed priority for a filter or action.
 *
 * If the highest existing priority for filter is already PHP_INT_MAX, this
 * function cannot return something higher.
 *
 * @param  string $filter
 * @return number|string
 */
function get_latest_priority( $filter )
{
    if ( empty ( $GLOBALS['wp_filter'][ $filter ] ) )
        return PHP_INT_MAX;

    $priorities = array_keys( $GLOBALS['wp_filter'][ $filter ] );
    $last       = end( $priorities );

    if ( is_numeric( $last ) )
        return PHP_INT_MAX;

    return "$last-z";
}

Utilisez cette fonction dernièrement . Attendez que la plupart des autres codes aient enregistré leur rappel. Pour ce faire, branchez d'abord l'action souhaitée avec une priorité 0, obtenez la priorité la plus élevée dont vous avez besoin, et then enregistrez le rappel réel:

add_action( 'save_post', 'register_custom_save', 0 ); 

function register_custom_save() 
{
    add_action( 
        'save_post', 
        'do_custom_save',
        get_latest_priority( current_filter() ),
        2 
    ); 
}
15
fuxia