主题目录结构
-
assets 存放img css js font
-
front-page 主页
- get_header() get_footer() 调用头部与脚部
-
header 头部
-
footer 脚部
-
functions 函数文件
-
single 单个文章页面
-
template-parts 拆分single文件的,区分文章类型(图片,文字,视频)
-
comments 文章评论页面
-
archive 存档页面(归档)
设置引入的css和js
get_stylesheet_directory_uri()
get_template_directory_uri()
<?php wp_head() ?>
<?php wp_footer() ?>
functions.php
<?php
// wp_head()
function followandrew_regsiter_styles() {
wp_enqueue_style('followandrew',get_template_directory_uri()."/style.css", array(), '1.0', 'all');
wp_enqueue_style('followandrew-bootstrap',"https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css", array(), '4.4.1', 'all');
wp_enqueue_style('followandrew-font-awesome',"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css", array(), '5.13.0', 'all');
}
add_action('wp_enqueue_scripts', 'followandrew_regsiter_styles');
// true代表放在文件底部,一般js放在底部
// wp_footer()
function followandrew_regsiter_scripts() {
wp_enqueue_script('followandrew-jquery',"https://code.jquery.com/jquery-3.4.1.slim.min.js", array(), '3.4.1', true);
wp_enqueue_script('followandrew-popper',"https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js", array(), '1.16.0', true);
wp_enqueue_script('followandrew-bootstrap',"https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js", array(), '4.4.1', true);
wp_enqueue_script('followandrew-main',get_template_directory_uri()."/assets/js/main.js", array(), '1.1.1', true);
}
add_action('wp_enqueue_scripts', 'followandrew_regsiter_scripts');
获取header.php 文件 头部文件
<?php get_header() ?>
获取footer.php
<?php get_footer() ?>
设置网站标题
functions.php
function followandrew_theme_support() {
add_theme_support('title-tag');
}
add_action('after_setup_theme', 'followandrew_theme_support');
设置默认静态页面
新建页面
设置页面
<?php get_header() ?>
<article class="content px-3 py-5 p-md-5">
<?php
// 判断有没有页面
if(have_posts()) {
while (have_posts()) {
// 获取到页面
the_post();
// 获取到页面标题
the_title();
// 获取到页面内容
the_content();
}
}
?>
</article>
<?php get_footer() ?>
动态添加nav&menu
functions.php
function followandrew_menus() {
$lcation = [
'primary' => 'primary-test',
'footer' => 'footer-test',
];
register_nav_menus($lcation);
};
add_action('init','followandrew_menus');
写完上面代码,后台外观会出现菜单选项
我们在这里面新建菜单
将菜单渲染到页面上
<?php
wp_nav_menu(
[
'menu' => 'primary',
'container' => '',
'theme_location' => 'primary',
// 外层包裹的标签
'items_wrap' => '<ul class="navbar-nav flex-column text-sm-center text-md-left">%3$s</ul>'
]
?>
添加网站logo
functions.php
function followandrew_theme_support() {
add_theme_support('title-tag');
add_theme_support('custom-logo');
}
add_action('after_setup_theme', 'followandrew_theme_support');
<?php
if(function_exists('get_custom_logo')) {
$custom_logo_id = get_theme_mod('custom_logo');
$logo = wp_get_attachment_image_src($custom_logo_id);
}
?>
<img class="mb-3 mx-auto logo" src="<?php echo $logo[0] ?>" alt="logo" >
网站name(title)
外观->主题->自定义->站点身份->站点标题
<?php echo get_bloginfo('name') ?>
文章支持图片-缩略图
写文章页面默认是没有插入图片的
functions.php
function followandrew_theme_support() {
// 标题
add_theme_support('title-tag');
// 网站logo
add_theme_support('custom-logo');
// 支持图片缩略图
add_theme_support('post-thumbnails');
}
add_action('after_setup_theme', 'followandrew_theme_support');
可以看到已经有选择图片的
文章
此时会发现浏览器是空白的,那是我们还没有编写single的代码
single.php
<!-- 文章内容 -->
<?php get_header() ?>
<article class="content px-3 py-5 p-md-5">
<?php
// 判断有没有页面
if(have_posts()) {
while (have_posts()) {
// 获取到页面
the_post();
get_template_part('template-parts/content', 'article');
}
}
?>
</article>
<?php get_footer() ?>
template-ports/content-article.php
<div class="container">
<header class="content-header">
<div class="meta mb-3">
<span class="date">Published 3 months ago</span>
<span class="tag"><i class='fa fa-tag'></i> tag</span>
<span class="tag"><i class='fa fa-tag'></i> category</span>
<span class="comment"><a href="#comments"><i class='fa fa-comment'></i> 3 comments</a></span>
</div>
</header>
<?php
the_content();
?>
</div>
文章发布时间
跟PHP语法相似,可以传入参数
the_date();
the_date('D'); // 周几
the_date('Y.m.d'); // 2022.09.25
文章标签
1.直接获取
<span class="tag"><i class='fa fa-tag'></i><?php the_tags() ?> </span>
2.分离每个标签
<?php
the_tags("<span class='tag'><i class='fa fa-tag'></i>","</span><span class='tag'><i class='fa fa-tag'></i>","</span>");
?>
分类
the_category();
评论数量
comments_number()
文章评论模板
获取comments.php 文件模板
在template-parts文件下
<?php
comments_template();
?>
评论列表
<?php
wp_list_comments(
[
'avater_size' => 120, //头像大小
'style' => 'div'
]
);
?>
评论文章的表格控件
<?php
// 检查当前文章是否允许评论
if(comments_open()){
comment_form([
'class_form' => '',
'title_reply_before' => '<h2 id="reply-title" class="comment-reply-title">',
'title_reply_after' => '</h2>'
]);
}
?>
插件
插件的创建及使用
插件的目录及入口文件
wp-content/plugin
定义一个插件要在插件首部定义插件的信息,我们的后台才能识别到这是一个插件
<?php
/*
Plugin Name: copyright
Description: this is copyright plugin
Version: 1.0
Author: code_haoran
Author URI: http://codehaoran.top
*/
插件的启用函数
// 定义插件启动时候调用的方法
register_activation_hook(__FILE__,'copyright_install');
function copyright_install() {
// 插件启动,添加一个默认的版权信息
update_option("copyright_text","<p style='color: red'>本站点所有文章均为原创,转载请注明出处</p>");
}
插件的停用函数
// 定义插件停用时候调用的方法
register_deactivation_hook(__FILE__,'copyright_deactivate');
function copyright_deactivate() {
// 设置一个copyright_deactivate_text选项为yes
update_option("copyright_deactivate_text","yes");
}
插件删除后执行的操作
在同目录下创建uninstall.php文件
<?php
// 如果uninstall不是从WordPress中调用的 则退出
if (!defined('WP_UNINSTALL_PLUGIN')) {
exit();
}
// 删除插件创建的项目
delete_option('copyright_text');
delete_option('copyright_deactivate_text');
钩子:
动作(add_action与do_action)
function wp_head() {
do_action('wp_head');
}
do_action函数:do_action执行了一个“动作”,这个动作名称就是这个参数"wp_head",这个“wp_head动作”是不需要定义的,do_action含有自动定义的功能。也就是不需要事先定义这个参数wp_head是什么、要干嘛,而do_action就会自动定义一个名叫wp_head的动作,并执行它。
add_action()函数可以给“动作”添加具体事务,比如我们已经定义并执行了一个动作“饭前”,然后我们add_action('饭前 ','洗手'),就给这个“饭前”动作添加了具体内容,在程序中来讲,“洗手”这个参数应该是个函数名称,也就是‘饭前’动作要执行这个函数。
do_action里面的动作——'wp_head',叫做动作钩子(hook),钩子可以挂东西,所以add_action就是往这个钩子上挂函数,然后执行那个钩子的时候,也就是执行所有挂在这个钩子上的函数!
函数:
<?php
do_action($tag, $arg);
//$tag 必需、你想创建的动作钩子的名称
//$arg 传递给已有的动作钩子的值
?>
<?php
add_action( $tag, $function_to_add, $priority, $accepted_args );
//$tag 参数必需,动作钩子的名称
//$function_to_add 参数为必需,要执行的函数
//$priority 参数为int(整数),数字越小越先调用
//$accepted_args 参数为int(整数),函数需要的参数个数,默认1;自己理解:就是$function_to_add函数需要的参数个数
?>
动作(加载过程)
init
// 在输出内容之前,给页面管理添加摘要功能
add_action('init','add_excerpts_to_pages');
function add_excerpts_to_pages() {
// 给页面管理添加摘要功能
add_post_type_support('page',array('excerpt'));
}
wp_head
wp_enqueue_scripts
添加引用文件的
wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer );
-
$handle – 调用的脚本名称,用于区别其它js,因此不能和其它js文件命名相同。
-
$src – js文件的路径(即url),不要直接使用域名url,要使用路径函数,如parent theme使用get_template_directory_uri,child theme使用get_stylesheet_directory_uri。(WP模板路径相关的函数中,通常带有template的是指parent theme,带有stylesheet的指向child theme)
-
$deps – 依赖关系,加载的js文件所依存的其它js的标识字串数组(array:string),即需要在本代码之前加载的代码的名称(如js脚本依赖jquery库,那么这里要用数组的形式写上jquery),非必需。
-
$ver – 加载js文件的版本号,作为查询字串附加在路径的末尾,作用是确保正确的版本信息传递给了客户端,以免受到缓存的影响(如js脚本发生变化时,通过更改版本号可以强制客户浏览器更新缓存),默认为false,调用当前wordpress程序的版本号,如果不想显示,则设置为NULL(不推荐)。
-
$in_footer – boolean类型,设置js文件调用代码是否放置在html底部,设置为ture则放在底部,设置为false则放置在head部分。提示需要模板正确放置wp_footer()函数。
使用方法
通过wp_enqueue_script函数加载js文件时,应该将它分配给一个钩子,如只在前台调用,使用钩子wp_enqueue_script;只在后台调用,使用admin_enqueue_scripts。
//自定义引用样式表 function copyright_enqueue_styles() { wp_enqueue_style('core',plugins_url('css/style.css'),false); } // 自定义引用脚本文件 function copyright_enqueue_scripts() { wp_enqueue_script('my-js',plugins_url('js/script.css',__FILE__),false); } add_action('wp_enqueue_scripts','copyright_enqueue_styles'); add_action('wp_enqueue_scripts','copyright_enqueue_scripts');
wp_footer
动作(文章)
save_post
文章保存或更新的时候触发
wp_trash_post
文章被放入回收站时触发
delete_post
删除文章时触发
移除动作
remove_action()
remove_all_actions()
过滤器
apply_filters
$value = '123456';
$myvar = apply_filters('hr_filter', $value);
echo $myvar; // 123456
add_filter
add_filter( string $hook_name, callable $callback, int $priority = 10, int $accepted_args = 1 )
过滤器挂载方法
$value = '123456';
add_filter('hr_filter', 'filter_fun');
function filter_fun($val) {
return $val . '----filter';
}
$myvar = apply_filters('hr_filter', $value);
echo $myvar; // 123456----filter
可以给过滤器挂载多个方法
$value = '123456';
add_filter('hr_filter', 'filter_fun');
add_filter('hr_filter', 'filter_fun_add_time');
function filter_fun($val) {
return $val . '----filter';
}
function filter_fun_add_time($val) {
return $val . '---' . date('Y-m-d');
}
$myvar = apply_filters('hr_filter', $value);
echo $myvar; // 123456----filter---2022-10-01
也可以给WordPress方法添加过滤方法
function footer_filter_fun($value) {
return date('Y-m-d') . $value;
}
add_filter('the_content','footer_filter_fun');
带参数,给title添加过滤器
function title_filter_if_hr($title, $id = null) {
// 如果文章是hr分类下的
if(in_category('hr', $id)) {
return 'hr分类__:'. $title;
}
// 否则
return $title;
}
add_filter('the_title', 'title_filter_if_hr', 10, 2);
在文章保存之前过滤
// 在文章保存之前过滤
function hr_auto_link($conten) {
return str_replace('浩然', "<a href='baidu.com'>浩然</a>",$conten);
}
add_filter('content_save_pre','hr_auto_link');
后台整合:
创建顶级菜单
add_menu_page(page_title, menu_title, capability, menu_slug, function, icon_url, position);
- page_title 页面的title,和显示在
</strong>标签里的一样</li> <li>menu_title 在控制面板中显示的名称</li> <li>capability 要引用该菜单所要的最低权限</li> <li>menu_slug 要引用该菜单的别名,必须是唯一的</li> <li>function 要显示菜单对应的页面内容所调用的函数</li> <li>icon_url 菜单的icon图片的URL</li> <li>position 出现在菜单列表中的次序</li> </ul> <p>要在admin_menu钩子中使用</p> <pre><code class="language-php">function create_banner_menu() { add_menu_page( 'banner', 'banner', 'manage_options', 'hr_banner', 'hr_settings_page', plugins_url('/images/icon.png', __FILE__) ); } add_action('admin_menu', 'create_banner_menu'); function hr_settings_page() { } </code></pre> <h3 id="创建子菜单">创建子菜单</h3> <blockquote> <p>add_submenu_page(parent_slug, page_title, menu_title, capability, menu_slug, function);</p> </blockquote> <ul> <li>parent_slug 父级别名</li> </ul> <pre><code class="language-php">function create_banner_menu() { add_menu_page( 'banner', 'banner', 'manage_options', 'hr_banner', 'hr_settings_page', plugins_url('/images/icon.png', __FILE__) ); add_submenu_page( 'hr_banner', 'sub_banner', 'sub_banner', 'manage_options', 'hr_sub_banner', 'hr_settings_page_sub' ); } add_action('admin_menu', 'create_banner_menu'); function hr_settings_page() { echo '<h2>banner</h2>'; } function hr_settings_page_sub() { echo '<h2>sub_banner</h2>'; } </code></pre> <h3 id="创建小工具">创建小工具</h3> <p><a href="https://codex.wordpress.org/zh-cn:%E5%B0%8F%E5%B7%A5%E5%85%B7%E6%8E%A5%E5%8F%A3" target="_blank">https://codex.wordpress.org/zh-cn:小工具接口</a></p>