Hook inside a hook

时间:2017-01-13 作者:jetgo

我正迷上the_editor_content 为新帖子添加签名。但是,当用户编辑其帖子时,内容将丢失并替换为签名。

我尝试了以下方法,希望the_editor_content 只会对新职位开火:

add_action( \'new_to_publish\', \'my_new_post\');
function my_new_post( $post ) {
    function my_editor_content( $content ) {
        $current_user = wp_get_current_user();
        $author_name = $current_user->display_name;
        $editor_content = \'<br><br><br><br><br>--<br>\'.$author_name;
        return $editor_content;
    }
    add_filter( \'the_editor_content\', \'my_editor_content\', \'tinymce\' );
}
但它不起作用,我没有得到新帖子或任何帖子的签名。这样能做到吗?请注意my_editor_content 它本身工作得很好。

提前谢谢。

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

我用了一种不同的方法来解决这个问题(可能不是最干净的方法,但它对我有效)。

我分析了当前url并添加了签名the_editor_content 如果在新帖子页面上。

如果在编辑帖子的页面上,我再次解析url以获取帖子id并在编辑器中返回帖子内容。

我有前端张贴表单,所以它的工作。

SO网友:Mike

好的,那么new_to_publish 钩子可能不是这里使用的正确钩子。

这个status_to_status 挂钩在立柱从第一个状态过渡到第二个状态期间运行。到了这个阶段,编辑不再扮演角色。

如果我的理解the_editor_content 是正确的,这将在加载编辑后屏幕时过滤编辑器中显示的默认内容。

您需要将签名附加到数据库中的实际帖子内容中,还是仅在前端显示?

如果是后者,您可以使用the_content 滤器

function mh_add_signature_after_content( $content ) {
    global $post;

    $signature = \'\';

    // Specify the post type on which to display, otherwise you\'ll see on pages also!
    if ( \'post\' == $post->post_type )   {

        $author_name = get_the_author_meta( \'display_name\', 25 );

        $signature = \'<br><br><br><br><br>--<br>\' . $author_name;

    }

    return $content . $signature;
} // kbs_after_article_content
add_filter( \'the_content\', \'mh_add_signature_after_content\', 999 );
这样做的结果是,在post edit屏幕中,编辑器将显示post内容,无签名。但当加载到你的网站前端时,帖子将包含签名。

UPDATED

这应该达到你想要的。。。

add_action( \'save_post\', \'my_new_post\');
function my_new_post( $post_id ) {

    // Specify the post type on which to run
    if ( \'post\' == $post->post_type )   {

        // Prevent loops
        remove_action( \'save_post\', \'my_new_post\' );

        // Make sure we haven\'t already run for this post
        if ( get_post_meta( $post_id, \'signature_added\', true ) )   {
            return;
        }

        $signature = \'\';
        $post      = get_post( $post_id );

        $author_name = get_the_author_meta( \'display_name\', $post_id );

        $signature = \'<br><br><br><br><br>--<br>\' . $author_name;

        $update = wp_update_post( array(
            \'ID\'           => $post_id,
            \'post_content\' => $post->post_content . $signature
        ) );

        // Add a placeholder so we know the signature was added
        if ( ! is_wp_error( $update ) ) {
            add_post_meta( $post_id, \'signature_added\', true, true );
        }

        add_action( \'save_post\', \'my_new_post\' );

    }

}