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?
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
.
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:
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
);
}