**章节导航:**
[TOC]
# 默认加载CSS/JS及标题问题
## 1.去掉默认头部底部多余加载信息
```
/*
* 去除头部多余加载信息
* @link https://www.sucaihu.com/14471.html
*/
remove_action( 'wp_head', 'wp_generator' );//移除WordPress版本
remove_action( 'wp_head', 'rsd_link' );//移除离线编辑器开放接口
remove_action( 'wp_head', 'wlwmanifest_link' );//移除离线编辑器开放接口
remove_action( 'wp_head', 'index_rel_link' );//去除本页唯一链接信息
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 ); //清除前后文信息
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );//清除前后文信息
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );//清除前后文信息
remove_action( 'wp_head', 'feed_links', 2 );//移除文章和评论feed
remove_action( 'wp_head', 'feed_links_extra', 3 ); //移除分类等feed
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 ); //移除wp-json
remove_action( 'wp_head', 'print_emoji_detection_script', 7 ); //头部的JS代码
// add_filter( 'show_admin_bar', '__return_false' );//移除wp-json链接
remove_action( 'wp_head', 'rel_canonical' ); //rel=canonical
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 ); //rel=shortlink
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );//移除emoji载入js
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );//emoji载入js
remove_action( 'wp_print_styles', 'print_emoji_styles' );//移除emoji载入css
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
remove_action('wp_head','wp_resource_hints',2);//移除dns-prefetch
// 禁用 REST API、移除 wp-json @link https://www.hack520.com/474.html
add_filter('rest_enabled', '_return_false');
add_filter('rest_jsonp_enabled', '_return_false');
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links', 10 );
//移除头部多余.recentcomments 样式
function Fanly_remove_recentcomments_style() {
global $wp_widget_factory;
remove_action( 'wp_head', array( $wp_widget_factory->widgets['WP_Widget_Recent_Comments'], 'recent_comments_style' ) );
}
add_action( 'widgets_init', 'Fanly_remove_recentcomments_style' );
// 移除头部多余block-library/style.min.css
add_action('wp_enqueue_scripts', function () {
wp_dequeue_style('wp-block-library');
});
// 移除底部wp-embed.min.js文件
function disable_emojis() {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
add_filter( 'tiny_mce_plugins', 'disable_emojis_tinymce' );
}
add_action( 'init', 'disable_emojis' );
```
## 2.让WordPress管理文档标题
```
/*
* 让WordPress管理文档标题。
* 通过添加主题支持,我们声明这个主题不使用
* 在文档头中使用ard编码的<title>标签,预计WordPress也会这样做
* 为我们提供吧。
*/
/* add_theme_support( 'title-tag' );
* 这里通过注释代码,删除了<title>标签。
*/
```
## 3.自定义文章类型标题显示问题
```
/*
* 自定义文章类型标题显示问题
* 使用setTitle();代替wp_title();
* 因为现在不打算搞自定义文章类型,所以注释掉。
*/
function setTitle(){
$term = get_term_by('slug',get_query_var('term'),get_query_var('taxonomy'));
echo $title = $term->name;
}
```
# 注册导航菜单
*****
```
/*
* 注册导航菜单
* 这里分别注册了头部导航、底部导航、内页侧栏导航,可根据需要增删。
* 使用方法:在主题一个位置使用wp_nav_menu()
*/
register_nav_menus(
array(
'header-menu' => esc_html__( 'Primary', 'wp_yiqi' ),
'footer-menu' => esc_html__( 'Footnav', 'wp_yiqi' ),
// 'about-menu' => esc_html__( 'Aboutnav', 'wp_yiqi' ),
)
);
/*
* 删除导航li的多余id和class
*/
// add_filter('nav_menu_css_class', 'rm_css_attributes_filter', 100, 1);
add_filter('nav_menu_item_id', 'rm_css_attributes_filter', 100, 1);
add_filter('page_css_class', 'rm_css_attributes_filter', 100, 1);
function rm_css_attributes_filter($var) {
return is_array($var) ? array() : '';
}
```
# 缩略图问题
*****
## 1.启用对帖子和页面的帖子缩略图的支持
```
/*
* 启用对帖子和页面的帖子缩略图的支持。
*
* @link https://developer.wordpress.org/themes/functionality/featured-images-post-thumbnails/
*/
add_theme_support( 'post-thumbnails' );
```
## 2.注册自定义尺寸的缩略图
```
/*
* 注册自定义尺寸的缩略图
*/
if (function_exists('add_image_size')){
add_image_size( 'news_list_size', 180, 125, true );
}
/*
* 响应式主题必须去掉缩略图srcset属性,否则移动端尺寸不一致
* 去除WordPress文章中图片自动加的srcset属性
* @link http://www.krseo.com/web/162.html
*/
add_filter( 'max_srcset_image_width', create_function('', 'return 1;'));
```
## 3.文章自动调用缩略图,后台文章列表显示缩略图
```
/*
* WordPress文章自动调用缩略图
*
* 1.判断文章是否设置了特色图像,若有则显示特色图像;
* 2.若没有特色图像时,查找文章中是否包含图片,若有图片,则调用第一张图片;
*/
function autoset_featured() {
global $post;
$already_has_thumb = has_post_thumbnail($post->ID);
if (!$already_has_thumb) {
$attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
if ($attached_image) {
foreach ($attached_image as $attachment_id => $attachment) {
set_post_thumbnail($post->ID, $attachment_id);
}
}
}
}
add_action('the_post', 'autoset_featured');
add_action('save_post', 'autoset_featured');
add_action('draft_to_publish', 'autoset_featured');
add_action('new_to_publish', 'autoset_featured');
add_action('pending_to_publish', 'autoset_featured');
add_action('future_to_publish', 'autoset_featured');
/*
* 为WordPress后台文章列表添加缩略图
*
* @link https://zmingcx.com/back-to-list-of-articles-to-add-thumbnail-wordpress.html
*/
if ( !function_exists('fb_AddThumbColumn') && function_exists('add_theme_support') ) {
// for post and page
add_theme_support('post-thumbnails', array( 'post', 'page' ) );
function fb_AddThumbColumn($cols) {
$cols['thumbnail'] = __('Thumbnail');
return $cols;
}
function fb_AddThumbValue($column_name, $post_id) {
$width = (int) 160;
$height = (int) 120;
if ( 'thumbnail' == $column_name ) {
// thumbnail of WP 2.9
$thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
// image from gallery
$attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image') );
if ($thumbnail_id)
$thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true );
elseif ($attachments) {
foreach ( $attachments as $attachment_id => $attachment ) {
$thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true );
}
}
if ( isset($thumb) && $thumb ) {
echo $thumb;
} else {
echo __('None');
}
}
}
// for posts
add_filter( 'manage_posts_columns', 'fb_AddThumbColumn' );
add_action( 'manage_posts_custom_column', 'fb_AddThumbValue', 10, 2 );
// for pages
add_filter( 'manage_pages_columns', 'fb_AddThumbColumn' );
add_action( 'manage_pages_custom_column', 'fb_AddThumbValue', 10, 2 );
}
```
## 4.为WordPress后台文章列表添加缩略图
```
/*
* 为WordPress后台文章列表添加缩略图
*
* @link https://zmingcx.com/back-to-list-of-articles-to-add-thumbnail-wordpress.html
*/
if ( !function_exists('fb_AddThumbColumn') && function_exists('add_theme_support') ) {
// for post and page
add_theme_support('post-thumbnails', array( 'post', 'page' ) );
function fb_AddThumbColumn($cols) {
$cols['thumbnail'] = __('Thumbnail');
return $cols;
}
function fb_AddThumbValue($column_name, $post_id) {
$width = (int) 160;
$height = (int) 120;
if ( 'thumbnail' == $column_name ) {
// thumbnail of WP 2.9
$thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
// image from gallery
$attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image') );
if ($thumbnail_id)
$thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true );
elseif ($attachments) {
foreach ( $attachments as $attachment_id => $attachment ) {
$thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true );
}
}
if ( isset($thumb) && $thumb ) {
echo $thumb;
} else {
echo __('None');
}
}
}
// for posts
add_filter( 'manage_posts_columns', 'fb_AddThumbColumn' );
add_action( 'manage_posts_custom_column', 'fb_AddThumbValue', 10, 2 );
// for pages
add_filter( 'manage_pages_columns', 'fb_AddThumbColumn' );
add_action( 'manage_pages_custom_column', 'fb_AddThumbValue', 10, 2 );
}
```
# 设定摘要的长度
*****
```
//设定摘要的长度及结尾
function new_excerpt_length($length) {
return 120;
}
add_filter('excerpt_length', 'new_excerpt_length');
// 把摘要默认的结尾[...]换成...
function new_excerpt_more(){
global $post;
return '...';
}
add_filter('excerpt_more', 'new_excerpt_more');
```
# 文章相关问题
## 1.WordPress实现不同分类显示不同的文章数量分页
```
/*
* WordPress实现不同分类显示不同的文章数量分页
* @link https://www.xuewangzhan.net/wpbbs/17057.html
*/
function filter_pre_get_posts( $query ){
if ( $query->is_main_query() ){
$num = '';
// if ( is_category(array('news')) ){ $num = 3; } // 为指定ID的栏目设置每页显示个数
// if ( is_taxonomy_hierarchical('product', 'img') ){ $num = 9; } // 为指定自定义分类法设置每页显示个数
//if ( is_category(array(10)) ){ $num = 14; }
//if ( is_category(array('questions')) ){ $num = 14; }
// if ( in_category(array('jhg','hjj','yjj','xxj','jlg')) ){ $num = 10; }
//if ( is_home() ){ $num = 10; }
// else if ( is_category() ){ $num = 10; }
// else if ( is_tag() ){ $num = 10; }
// else if ( is_date() ){ $num = 10; }
// else if ( is_author() ){ $num = 10; }
// else if ( is_search() ){ $num = 10; }
// else if ( is_archive() ){ $num = 10; }
if ( '' != $num ){ $query->set( 'posts_per_page', $num ); }
}
return $query;
}
add_action('pre_get_posts', 'filter_pre_get_posts');
```
## 2.获取文章所在的自定义分类法分类项目
```
/*
* 获取文章所在的自定义分类法分类项目
* 本主题不使用自定义分类法,所以注释掉
*/
function custom_taxonomies_terms_links(){
//根据当前文章ID获取文章信息
$post = get_post( $post->ID );
//获取当前文章的文章类型
$post_type = $post->post_type;
//获取文章所在的自定义分类法
$taxonomies = get_object_taxonomies( $post_type, 'objects' );
$out = array();
foreach ( $taxonomies as $taxonomy_slug => $taxonomy ){
$term_list = wp_get_post_terms($post->ID, $taxonomy_slug, array("fields" => "all"));
echo $term_list[0]->name; //显示文章所处的分类中的第一个
}
return implode('', $out );
}
```
## 3.文章列表页分页
```
/* 文章列表页分页
* 在文章列表循环结束后调用mo_paging()方法即可显示
* @link https://www.daimadog.com/3272.html
*/
function mo_paging() {
$p = 3;
if ( is_singular() ) return;
global $wp_query, $paged;
$max_page = $wp_query->max_num_pages;
if ( $max_page == 1 ) return;
echo '<div class="pagination"><dl>';
if ( empty( $paged ) ) $paged = 1;
echo '<dd class="prev-page">'; previous_posts_link('上一页'); echo '</dd>';
if ( $paged > $p + 1 ) _paging_link( 1, '<dd>第一页</dd>' );
if ( $paged > $p + 2 ) echo "<dd><span>···</span></dd>";
for( $i = $paged - $p; $i <= $paged + $p; $i++ ) {
if ( $i > 0 && $i <= $max_page ) $i == $paged ? print "<dd class=\"active\"><span>{$i}</span></dd>" : _paging_link( $i );
}
if ( $paged < $max_page - $p - 1 ) echo "<dd><span> ... </span></dd>";
echo '<dd class="next-page">'; next_posts_link('下一页'); echo '</dd>';
echo '<dd><span>共 '.$max_page.' 页</span></dd>';
echo '</dl></div>';
}
function _paging_link( $i, $title = '' ) {
if ( $title == '' ) $title = "第 {$i} 页";
echo "<dd><a href='", esc_html( get_pagenum_link( $i ) ), "'>{$i}</a></dd>";
}
```
### 分页CSS样式
```
/* 分页CSS样式 */
.pagination{clear: both; text-align: center; font-size: 12px; padding: 30px 0 0;}
.pagination dl{display: inline-block; margin-left: 0; margin-bottom: 0; padding: 0;}
.pagination dl>dd{display: inline;}
.pagination a:hover{background-color: #e60013; color: #fff;}
.pagination dl>.active>a,
.pagination dl>.active>span{background-color: #e60013; color: #fff; cursor: default;}
.pagination dl>dd>a,
.pagination dl>dd>span{margin: 0 2px; float: left; padding: 7px 14px; background-color: #f6f6f6; color: #666; border-radius: 2px;}
```
## 4.如何获得WordPress文章浏览次数的统计
```
/* 如何获得WordPress文章浏览次数的统计
* 在需要显示该统计次数的地方使用下面的代码调用即可: 文章被阅读:<?php post_views(' ', ' 次'); ?>
*/
function record_visitors() {
if (is_singular())
{
global $post;
$post_ID = $post->ID;
if($post_ID)
{
$post_views = (int)get_post_meta($post_ID, 'views', true);
if(!update_post_meta($post_ID, 'views', ($post_views+1)))
{
add_post_meta($post_ID, 'views', 1, true);
}
}
}
}
add_action('wp_head', 'record_visitors');
/// 函数名称:post_views
/// 函数作用:取得文章的阅读次数
function post_views($before = '(点击 ', $after = ' 次)', $echo = 1)
{
global $post;
$post_ID = $post->ID;
$views = (int)get_post_meta($post_ID, 'views', true);
if ($echo) echo $before, number_format($views), $after;
else return $views;
}
```
# 启用媒体文件上传自动按年月日重命名
*****
```
/**
* 启用媒体文件上传自动按年月日重命名
*/
function git_upload_filter($file) {
$time = date("YmdHis");
$file['name'] = $time . "" . mt_rand(1, 100) . "." . pathinfo($file['name'], PATHINFO_EXTENSION);
return $file;
}
add_filter('wp_handle_upload_prefilter', 'git_upload_filter');
```
# 在后台“外观”菜单中添加 【主题设置】 这个子菜单
*****
```
/*
* 在后台“外观”菜单中添加 【主题设置】 这个子菜单
* add_theme_page():给“外观”导航创建子菜单;
* 参数解说:
* 参数1-----标题的内容
* 参数2-----显示在后台左边菜单的标题
* 参数3-----访问这个页面需要的权限
* 参数4-----别名,需要独一无二哦
* 参数5-----执行的函数(我们自定义的函数)
*
* add_action():这是一个添加勾子的函数,这里将“Themes_Set”函数添加到“admin_menu”后台菜单的勾子中。
*
* @link http://wanlimm.com/77202006258703.html
*/
function Themes_Set(){
add_theme_page( 'wp_yiqi主题设置', 'wp_yiqi主题设置', 'administrator', 'wp_yiqi_slug','ssmay_set');
}
add_action('admin_menu', 'Themes_Set');
function ssmay_set(){ //主题设置函数
include("theme_set.php");//这里是自己创建的一个php文件,用来设置选项内容
}
```
# 后台开启友情链接功能
*****
```
/**
* 开启wordpress友情链接管理
*
* 使用方法:
* <ul class="dhnblog_link"><center>
* <li>友情链接: <?php wp_list_bookmarks('title_li=&categorize=0&orderby=rand&limit=24'); ?></li>
* </ul>
*
* @link https://blog.csdn.net/qq_39086902/article/details/105523963
*/
add_filter( 'pre_option_link_manager_enabled', '__return_true' );
```
# 排队引入css样式和js脚本
*****
```
/**
* 排队引入css样式和js脚本。
* 模板中通过使用wp_head()和wp_footer()分别来引入页头页脚的css和js文件
* 在WordPress管理后台正确加载js和css脚本
* @link https://www.wpdaxue.com/wordpress-admin-enqueue-scripts.html
*
* 使用 wp_enqueue_style() 函数引入css文件教程:
* wp_enqueue_style( $handle, $src, $deps, $ver, $media );
* --------------------------------------------------------
* $handle(字符串,必需)是你的样式表唯一名称。其他函数将使用这个“handle”来排队并打印样式表。
* $src(字符串,必需)指的是样式表的URL。您可以使用函数,如 get_template_directory_uri() 来获取主题目录中的样式文件。永远不要去想硬编码了!
* $deps (数组,可选)处理相关样式的名称。如果丢失某些其他样式文件将导致你的样式表将无法正常工作,你可以使用该参数设置“依赖关系”。
* $ver (字符串或布尔型,可选)版本号。你可以使用你的主题的版本号或任何一个你想要的。如果您不希望使用一个版本号,将其设置为null。默认为false,这使得WordPress的添加自己的版本号。
* $media (字符串,可选)是指CSS的媒体类型,比如“screen”或“handheld”或“print”。如果你不知道是否需要使用这个,那就不使用它。默认为“all”。
* @link https://www.wpdaxue.com/loading-css-into-wordpress.html
*
* 使用 wp_enqueue_script() 引入js文件
* wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer );
* --------------------------------------------------------
* $handle(字符串,必需)是你的样式表唯一名称。其他函数将使用这个“handle”来排队并打印样式表。
* $src(字符串,必需)指的是样式表的URL。您可以使用函数,如 get_template_directory_uri() 来获取主题目录中的样式文件。永远不要去想硬编码了!
* $deps (数组,可选)处理相关样式的名称。如果丢失某些其他样式文件将导致你的样式表将无法正常工作,你可以使用该参数设置“依赖关系”。
* $ver (字符串或布尔型,可选)版本号。你可以使用你的主题的版本号或任何一个你想要的。如果您不希望使用一个版本号,将其设置为null。默认为false,这使得WordPress的添加自己的版本号。
* $in_footer 是否在</body>之前而不是<head>中加载脚本。默认为'false'。
* @link https://www.wpdaxue.com/how-to-add-css-and-javascript-to-wordpress-theme.html
*
*/
function wp_yiqi_scripts() {
// 加载css
wp_enqueue_style( 'wp_yiqi-style', get_stylesheet_uri(), array(), _S_VERSION );
wp_enqueue_style( 'wp_yiqi-main', get_template_directory_uri() . '/assets/css/main.css', array(), _S_VERSION );
wp_enqueue_style( 'wp_yiqi-flexslider-css', '//cdn.bootcss.com/flexslider/2.6.3/flexslider.min.css', array(), _S_VERSION );
// 加载页眉js
wp_enqueue_script('wp_yiqi-jquery', '//cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js', array(), _S_VERSION, false );
wp_enqueue_script('wp_yiqi-flexslider-js', '//cdn.bootcss.com/flexslider/2.6.3/jquery.flexslider-min.js', array(), _S_VERSION, false );
wp_enqueue_script( 'wp_yiqi-header', get_template_directory_uri() . '/assets/js/header.js', array(), _S_VERSION, false );
// 加载页脚js
if ( is_home() || is_front_page() ) { //判断首页与内页
wp_enqueue_script( 'wp_yiqi-footer-index', get_template_directory_uri() . '/assets/js/footer-index.js', array(), _S_VERSION, true );
} else {
wp_enqueue_script( 'wp_yiqi-footer-sidebar', get_template_directory_uri() . '/assets/js/footer-sidebar.js', array(), _S_VERSION, true );
}
wp_enqueue_script( 'wp_yiqi-footer', get_template_directory_uri() . '/assets/js/footer.js', array(), _S_VERSION, true );
if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
wp_enqueue_script( 'comment-reply' );
}
}
add_action( 'wp_enqueue_scripts', 'wp_yiqi_scripts' );
```
# 自动使用文章ID作为别名(slug)
*****
为了安全起见,请先备份网站的数据库,然后再按照下文操作!
## 1.更改固定链接结构
假设你原来的固定链接结构设置为*/%post\_id%*,现在你可以将它改为*/%postname%*,这时候你会发现,新建文章和老文章都使用文章标题作为别名
## 2.批量修改老文章的别名为ID
将下面的代码添加到网站根目录的 wp-config.php 的最底部,保存后访问一次网站首页(你将看到浏览器一直都在努力打开网页,不要急,耐心等待,直到网页真正打开,所需时间看文章数和网络情况而定)。**网页打开后,删除刚刚添加到 wp-config.php 的代码!**
~~~
/**
* 批量更改旧文章的别名为ID
* 使用方法:将代码添加到网站根目录的 wp-config.php 的最底部,访问一次网站首页,等页面打开后,再删除这些代码
* https://www.wpdaxue.com/wordpress-using-post-id-as-slug.html
*/
// 添加一个变量来包容文章标题数组,防止重复操作
$slug_done = array();
// 查询所有文章
$posts = $wpdb->get_results( "
SELECT
`ID`,
`post_title`
FROM
`" . $wpdb->posts . "`
WHERE
`post_type` = 'post'
" );
// 输出文章
foreach( $posts AS $single ) {
$this_slug = $single->ID;
$slug_done[] = $this_slug;
// 使用文章ID替换文章原来的别名
$wpdb->query( "
UPDATE
`" . $wpdb->posts . "`
SET
`post_name` = '" . $this_slug . "'
WHERE
`ID` = '" . $single->ID . "'
LIMIT 1
" );
}
~~~
## 3.新文章自动使用ID作为别名
将下面的代码添加到主题的 functions.php ,新建的文章都会自动使用ID作为别名
~~~
/**
* 新文章自动使用ID作为别名
* 作用:即使你设置固定连接结构为 %postname% ,仍旧自动生成 ID 结构的链接
* https://www.wpdaxue.com/wordpress-using-post-id-as-slug.html
*/
add_action( 'save_post', 'using_id_as_slug', 10, 2 );
function using_id_as_slug($post_id, $post){
global $post_type; if($post_type=='post'){ //只对文章生效 // 如果是文章的版本,不生效
if (wp_is_post_revision($post_id))
return false;
// 取消挂载该函数,防止无限循环
remove_action('save_post', 'using_id_as_slug' );
// 使用文章ID作为文章的别名
wp_update_post(array('ID' => $post_id, 'post_name' => $post_id ));
// 重新挂载该函数
add_action('save_post', 'using_id_as_slug' );
}}
}
~~~