web-dev-qa-db-ja.com

投稿を保存するときに関数を最後の関数として実行させるにはどうすればいいですか?

WPからの他のすべての保存が実行された後に、この関数を最後の関数として実行させる方法はわかりません。

これは私のプラグインの私の現在のコードです:

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 );


}

このコードを強制的に実行し、最後のものとして混合変数を保存するにはどうすればよいですか?他のすべての保存と更新が終わった後。

今は更新されても問題ありませんが、元のマップフィールド$ _POST ['company_map']の値で書き換えられたためです。私はどうにかしてWPに、投稿内容の保存/更新を行うときにこの関数が最後の関数として実行されるべきであることを伝える必要があります。

どうやってするか?

4
Derfder

add_actionには priority というパラメータがあり、これはデフォルトでは 10 です。これを増やすと関数を遅くロードすることができます。

add_action( 'save_post', 'do_custom_save' );を変更する

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

これで優先順位は100に設定され、かなり遅くロードされ、この関数が実行される前に他の関数がロードに関連付けられるようになります。

詳しくは add_action の関数リファレンスをチェックしてください。

9
Maruti Mohanty

Maruti Mohantyの提案は悪くないが、失敗するだろう。優先順位の高いコアアクションが多数あります。

  • 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 );
    

また、プラグインとテーマも優先順位を高くすることができます。

ですから、$GLOBALS['wp_filter']で現在のフィルタやアクションを調べて、最も高いキーを見つけて、何かを追加する必要があります。注意してください、優先順位 は文字列 かもしれません、なぜならそれは配列キーだからです。

キーは integer または string のいずれかです。

それでは、ツールとして関数get_latest_priority()を作りましょう。

/**
 * 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";
}

この関数を使用してください 最近 。他のほとんどのコードがそのコールバックを登録するまで待ちます。それを行うには、まず優先度0で目的のアクションにフックし、必要な最高の優先度を取得して、 次に 実際のコールバックを登録します。

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