WordPress
主题目录结构
-
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/popper.js@1.16.0/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() ?>
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%20echo%20$logo[0]%20?>" 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');
动作(文章)
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>
原文链接:https://www.cnblogs.com/codehaoran/p/16816004.html