使用更新的字段在保存时更改帖子内容

时间:2018-02-22 作者:hnldesign

Short:

我想在保存后更改帖子的slug(用于永久链接),并使用我刚刚在帖子编辑器中输入的数据对其进行修改。

Long:

我当前正在使用Tribe Events Calendar 插件,并希望创建具有相同标题的多个事件,因此为了确保永久链接是唯一的,我在保存事件(post)时将事件日期(与post一起存储)添加到slug的末尾。

What I have done so far

我使用save_post 挂钩:

function change_event_slug_on_save( $post_id ) {
    if ( ! wp_is_post_revision( $post_id ) && tribe_is_event($post_id) ) {
        // verify post is not a revision, and an event
        $post = get_post($post_id);
        $slug = sanitize_title($post->post_title);
        $newslug = $slug . \'-\' . tribe_get_start_date( $post_id, false, \'j F Y\' );
        if ($post->post_name !== $newslug) {
            // unhook this function to prevent infinite looping
            remove_action( \'save_post\', \'change_event_slug_on_save\' );
            // update the post slug
            wp_update_post( array(
                \'ID\' => $post_id,
                \'post_name\' => $newslug
            ));
            // re-hook this function
            add_action( \'save_post\', \'change_event_slug_on_save\', 10, 1 );
        }
    }
}

add_action( \'save_post\', \'change_event_slug_on_save\', 10, 1 );

The problem

当我更改活动的日期时,我当然也想更新永久链接。问题是:我刚刚更改的事件日期在数据库中还没有更改,所以在save_post, 它仍然使用last stored (旧)事件日期。这意味着我需要保存一个事件(post)两次来更新链接。

我试着pre_update_post, 但这给了我同样的问题。我还查看了所有的hooks-Tribe插件,但没有发现任何提供挂钩到更新事件的插件。

Bottom line: 我需要找到一种方法,在更新帖子编辑器的字段时(在实际发布或更新帖子之前),使用当时的字段(而不是来自数据库)更新永久链接。任何帮助都将不胜感激。

<小时>

UPDATE

幸亏ahendwh2\'我的答案是,我通过勾住部落的tribe_events_update_meta 钩子,更新代码:

function change_event_slug_on_save( $post_id, $event_data, $event ) {
    //$event_data holds the changed event data, $event is the actual event (post)
    if ( ! wp_is_post_revision( $post_id ) && tribe_is_event($post_id) ) {
        // verify post is not a revision, and an event
        $slug = sanitize_title($event->post_title);
        $newslug = $slug . \'-\' . tribe_format_date($event_data[\'EventStartDate\'], false, \'j-F-Y\');
        if ($event->post_name !== $newslug) {
            // unhook this function to prevent infinite looping
            remove_action( \'tribe_events_update_meta\', \'change_event_slug_on_save\' );
            // update the post slug
            wp_update_post( array(
                \'ID\' => $post_id,
                \'post_name\' => $newslug
            ));
            // re-hook this function
            add_action( \'tribe_events_update_meta\', \'change_event_slug_on_save\', 10, 3 );
        }
    }
}
add_action( \'tribe_events_update_meta\', \'change_event_slug_on_save\', 10, 3);

1 个回复
最合适的回答,由SO网友:ahendwh2 整理而成

尝试使用操作提供的post对象作为第二个参数,而不是从数据库获取它:

function change_event_slug_on_save( $post_id, $post ) {
    ...
}

add_action( \'save_post\', \'change_event_slug_on_save\', 10, 2 );
这样,您就可以删除该行$post = get_post($post_id);

<小时>EDIT:部落事件日历有自己的保存事件的操作:tribe_events_event_savetribe_events_update_meta. 由于事件日期保存在post\\u meta中,因此应使用第二个操作:

/**
 * @param int     $event_id The event ID (alias post ID).
 * @param array   $data     The saved meta fields. The new date should be somewhere in this array
 * @param WP_Post $event    The event itself (alias $post).
 */
function change_event_slug_on_save($event_id, $data, $event) {
    ...
}

add_action(\'tribe_events_update_meta\', \'change_event_slug_on_save\', 10, 3);

结束

相关推荐

add_action in the loop hooks

我有以下结构:add_action(\'my_content\', \'standard_loop\'); function standard_loop() { if (have_posts()) : while (have_posts()) : the_post(); do_action(\'loop_entry_before\'); do_action(\'loop_entry\');