过滤器和操作
您可以选择运行限制帖子内容长度的挂钩
save_post
,
save_post_{post_type}
或
edit_post
(或两者兼有)(以下操作在内部执行
wp_publish_post()
/** This action is documented in wp-includes/post.php */
do_action( \'edit_post\', $post->ID, $post );
do_action( "save_post_{$post->post_type}", $post->ID, $post, true );
do_action( \'save_post\', $post->ID, $post, true );
do_action( \'wp_insert_post\', $post->ID, $post, true );
或在内部执行的一个转换后挂钩
wp_transition_post_status()
. 即:
do_action( \'transition_post_status\', $new_status, $old_status, $post );
do_action( "{$old_status}_to_{$new_status}", $post );
do_action( "{$new_status}_{$post->post_type}", $post_id, $post );
要在回调中检查筛选器或操作,如果您使用的是正确的筛选器,可以使用
current_filter()
或
current_action()
(其中later只是
current_filter()
), 它返回一个字符串,其中包含当前正在运行的筛选器或操作的名称。
限制
到限制您可能要使用的字数
wp_trim_words( $content, 300 );
将内容限制为300字。
当内容已经存在时,还有更多内容。要绕过这个,你可以leverage the plugins in this answer 我写信是为了限制摘录的长度。如果您只想在内容上运行它,只需更改它即可。
总体思路(在伪代码中)始终是:
Explode the string of words in an array on empty space
Count the number of array items
If they exceed $limit, loop through them or slice the array
Return everything below and equal to the threshold
核心API
wp_trim_words()
与简单的循环不同的是,它从一个字符串中剥离所有HTML标记(这样它们就不会添加到计数中),并且有一个过滤器在返回结果之前运行回调,允许使用非常细粒度和有针对性的方法
apply_filters( \'wp_trim_words\', $text, $num_words, $more, $original_text );
把一个插件放在一起,只需填写你想做的任何事情。请确保使用以下方法正确通知用户
post_updated_messages
告诉用户为什么你删掉了文字,拒绝保存内容或任何你想要提供的用户体验
<?php
/** Plugin Name: WPSE (#172544) Limit Content by Word Count */
add_action( \'save_post_test_post_type\', function( $id, \\WP_Post $post, $updated )
{
# debug:
# var_dump( $post, $_POST );
// Here you can do whatever you want to do to limit the
}, 10, 3 );