如何在保存帖子时强制函数作为最后一个函数运行?

时间:2013-09-30 作者:Derfder

我不知道如何强制此函数在执行了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 );


}

How to force this code to be executed and saved the mixed variable as the last thing? After all the other saving and updating is done.

因为现在它已经更新好了,但又被原始地图字段$\\u POST[\'company\\u map\']中的值重写了。我需要告诉WP,在执行保存/更新帖子内容时,此函数应该作为最后一个函数运行。

如何做到这一点?

2 个回复
最合适的回答,由SO网友:Maruti Mohanty 整理而成

add_action 有一个priority 参数为10 默认情况下,可以增加该值以延迟加载函数。

改变add_action( \'save_post\', \'do_custom_save\' );

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

现在,优先级设置为100,将很晚加载,并允许在执行此函数之前加载其他相关函数。

有关更多详细信息,请查看函数参考add_action.

SO网友:fuxia

马鲁蒂·莫汉蒂的建议不错,但会失败。有许多具有更高优先级的核心行动:

  • 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\'], 找到最高键并添加一些内容。请注意,这是一个优先事项could be a string, 因为它是一个数组键:

    键可以是integer 或astring.

    让我们做一个函数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";
    }
    
    使用此功能lately. 等待大多数其他代码注册其回调。要做到这一点,首先要优先采取你想要的行动0, 获得所需的最高优先级then 注册实际回调:

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

结束

相关推荐

Updates for a private plugin?

如果我写一个私有插件,有没有办法使用WordPress自动更新机制来更新它 我想封装这个功能,但它是我自己的5个博客特有的,所以它不是公共插件资源的好候选。但我喜欢这种简单的更新机制 有没有办法做到这一点