WordPress编辑器与后台文章列表能否显示slug而非标题?
嘿,这两个问题都挺贴合实际需求的,我来给你一步步拆解解决方案,都是用代码实现(不用额外装插件,更稳定):
问题1:在WordPress编辑器中显示slug而非文章标题?
WordPress默认编辑器不管是古腾堡还是经典版,都不会直接让你替换标题显示为slug,但我们可以通过自定义代码实现:
如果你用的是经典编辑器
把这段代码添加到主题的functions.php文件,或者用「Code Snippets」这类自定义代码插件(更推荐后者,避免主题更新丢失代码):
add_action('admin_head-post.php', 'show_slug_instead_title_classic'); add_action('admin_head-post-new.php', 'show_slug_instead_title_classic'); function show_slug_instead_title_classic() { global $post; if (!$post) return; $slug = $post->post_name; ?> <script type="text/javascript"> jQuery(document).ready(function($) { // 隐藏标题输入框的默认提示文字 $('#title-prompt-text').hide(); // 如果文章已有slug,把标题输入框的值替换为slug并设置为只读 if ('<?php echo esc_js($slug); ?>' !== '') { $('#title').val('<?php echo esc_js($slug); ?>').attr('readonly', true); } }); </script> <?php }
这段代码会把经典编辑器里的标题输入框替换成当前文章的slug,并且锁定输入(如果是已发布的文章),新文章的话可以先设置slug再保存,保存后输入框就会显示slug了。
如果你用的是古腾堡(区块)编辑器
用这段代码替换标题区块的显示内容为slug:
add_filter('register_block_type_args', 'replace_title_block_with_slug', 10, 2); function replace_title_block_with_slug($args, $block_name) { if ($block_name === 'core/post-title') { $args['render_callback'] = function($attributes) { global $post; $slug = $post->post_name; // 保留标题区块的样式,只是把内容换成slug return '<h1 class="wp-block-post-title">' . esc_html($slug) . '</h1>'; }; } return $args; }
这样编辑器里的标题区块就会显示文章slug,而不是标题文字,实际文章的标题字段还是会保留原内容,只是编辑器预览显示slug。
问题2:在后台文章管理列表中显示slug替代标题?
这个需求更常见,直接替换标题列的内容为slug就可以,还能保留原有的编辑、查看等操作功能:
添加这段代码到functions.php或代码插件:
add_filter('manage_posts_columns', 'replace_title_column_with_slug'); add_action('manage_posts_custom_column', 'display_slug_in_title_column', 10, 2); function replace_title_column_with_slug($columns) { // 把原标题列的表头改成「Slug」,也可以保留「标题」字样,看你习惯 $columns['title'] = 'Slug'; return $columns; } function display_slug_in_title_column($column, $post_id) { if ($column === 'title') { $post = get_post($post_id); $slug = $post->post_name; // 保留原标题列的编辑链接 $edit_link = get_edit_post_link($post_id); echo '<a href="' . esc_url($edit_link) . '" class="row-title">' . esc_html($slug) . '</a>'; // 保留快速编辑、查看等操作菜单 echo '<div class="row-actions">'; $actions = array( 'edit' => '<a href="' . esc_url($edit_link) . '">编辑</a>', 'view' => '<a href="' . esc_url(get_permalink($post_id)) . '" target="_blank">查看</a>', 'trash' => '<a href="' . esc_url(get_delete_post_link($post_id)) . '" class="submitdelete">移至回收站</a>' ); echo implode(' | ', $actions); echo '</div>'; } }
添加后刷新后台文章列表,原本的标题列就会显示每篇文章的slug,再也不用担心相同标题找不到目标文章了。
如果你不想替换原标题列,而是新增一个Slug列再隐藏原标题,也可以用这段代码:
add_filter('manage_posts_columns', 'add_slug_column'); add_action('manage_posts_custom_column', 'display_slug_column', 10, 2); add_action('admin_head-edit.php', 'hide_default_title_column'); function add_slug_column($columns) { $columns['post_slug'] = 'Slug'; return $columns; } function display_slug_column($column, $post_id) { if ($column === 'post_slug') { echo esc_html(get_post_field('post_name', $post_id)); } } function hide_default_title_column() { echo '<style>.column-title { display: none; }</style>'; }
内容的提问来源于stack exchange,提问作者Silverwings
相关产品推荐
相关产品推荐

