Home >  > 4小时学会WordPress模板制作(一)

4小时学会WordPress模板制作(一)

0

WordPress模板制作其实非常简单,今天蜗牛博客就带你从零开始制作一个Wordpress模板,只需要花半天的时间,你也可以制作一个你心中理想的Wordpress模板。

比如,想做一下下面这样的模板。

一、素材
1.下载模板
我们直接以仿站开始吧,首先找到一个你喜欢的网站,比如:http://demo.codethemes.co/robolist-pro/,

然后用仿站工具,将这个网站的模板下载下来。一般我们只需要首页、列表页、详情页三个页面就可以了。

其中的:
index.html wordrpess首页
archive.html wordpress的列表页
single.html wordpressrr的文章详情页。

下载后保存到电脑是这样的:

2.整理模板
用notepad或者sublime之类的软件打开模板文件看一下它的代码,如果比较整齐则不用这一步。

如果下载的模板排板上有点乱,需要用html格式化工具进行一些整理,比较好用的有:
http://web.chacuo.net/formathtml/(暂时觉得这个最好用)
https://www.sojson.com/jshtml.html

二、后台显示模板

1.建立模板文件夹

在wordpress后台的theme下面建立一个文件夹Stheme,用来存放你的模板,并将你下载的模板放到这个文件夹下面。

2. index.php
将index.html改成php文件index.php。

3.style.css
因为我们在第一步下载别人网站的模板的时候,设定了将所有的css文件放到了css文件夹下面,所以style.css也当然存到了css文件夹下面。不过在wordpress的模板中,style.css必须保存在模板的根目录下面,所以我们这里需要将style.css从css文件夹下面移到模板的根目录Stheme下面,即和index.php同一个目录下面。

修改style.css文件,将以下代码放到style.css文件中

/*
Theme Name: Stheme
Author: 蜗牛博客
Author URI: http://www.snailtoday.com
Description: 图片展示主题
Version: 1.0
*/

4.查看效果
这时登陆后台,可以看到我们的模板已经在后台显示了。不过没有缩略图。

5.缩略图
在根目录Stheme下面放上一张图片,命名为screenshot.png(或者jpg),然后就可以看到效果了。

6、启用模板
在wordpress后台启用我们制作的模板,不过发现CSS是乱的。

三、修改style.css

修改style.css文件中的css、js、images文件的路径,直接用替换功能即可。比如:

/static/js/
#替换成
<?php echo get_template_directory_uri(); ?>/static/js/

关于wordpress的函数,可以看这里:https://developer.wordpress.org/reference/since/5.1.0/

这时再看首页,就发现和目标站一模一样了。

四、首页title

1.在模板根目录新建一个functions.php文件。
2.加入以下代码,用于首页显示站点信息等。

<?php 

add_filter('wp_title', 'lingfeng_wp_title', 10, 2);
function lingfeng_wp_title($title, $sep) {
	global $paged, $page;

	//如果是feed页,返回默认标题内容
	if ( is_feed() ) { 
		return $title;
	}

	// 标题中追加站点标题
	$title .= get_bloginfo( 'name' );

	// 网站首页追加站点副标题
	$site_description = get_bloginfo( 'description', 'display' );
	if ( $site_description && ( is_home() || is_front_page() ) )
		$title = "$title $sep $site_description";

	// 标题中显示第几页
	if ( $paged >= 2 || $page >= 2 )
		$title = "$title $sep " . sprintf( '第%s页', max( $paged, $page ) );

	//去除空格,-的字符实体
	$search = array('&#8211;', ' ');
	$replace = array('-', '');
	$title = str_replace($search, $replace, $title);

	return $title;	
}


?>

3.在title的位置添加以下代码:

<?php wp_title('|',true,'right'); ?>

4.效果预览

五、站点标题、副标题
代码:

<?php bloginfo('name'); ?>          #标题
<?php bloginfo('description'); ?>   #副标题
<?php bloginfo('url'); ?>           #设定站点标题的链接到首页。       

效果预览:

六、search form
在相应位置直接用以下代码:

<?php get_search_form(); ?>

如果模板文件下面没有searchform.php文件,则wordpress调用默认的表单。
如果有,则将searchform.php文件显示在搜索表单的位置。

修改搜索框的样式:
可以自己设计一个函数,持到get_search_form这个函数上面。

function my_search_form( $form ) {
 
    $form = '<form role="search" method="get" id="searchform" action="' . home_url( '/' ) . '" >
    <div><label class="screen-reader-text" for="s">' . __('Search for:') . '</label>
    <input type="text" value="' . get_search_query() . '" name="s" id="s" />
    <input type="submit" id="searchsubmit" value="'. esc_attr__('Search') .'" />
    </div>
    </form>';
 
    return $form;
}
 
add_filter( 'get_search_form', 'my_search_form' );

经测试这种方法还没有过时,可以参考:https://ninghao.net/video/703

七、首页文章
1.删除多余的代码,只留下第一行的第一张图片。
2.主循环
代码:

<?php if( have_posts() ) : while( have_posts() ) : the_post(); ?>
<!-- 在这里调用数据 -->
<?php endwhile; ?>
<?php endif; ?>

效果:

3.显示文章标题、缩略图
缩略图代码在这里

<?php the_title(); ?>                                       #显示文章标题
<?php the_permalink(); ?>                                   #文章的网址
<?php echo get_content_first_image(get_the_content()); ?>   #缩略图地
<?php the_content(); ?>                                     #显示文章内容
<?php the_category('.'); ?>                                 #显示文章分类
<?php the_time('Y年m月d日 H:i:s'); ?>                        #显示发布时间
<?php comments_popup_link('0','1','%');?>                   #显示评论的条目
<?php the_tags('<strong>标签:</strong> ', ' , ' , ''); ?>   #显示文章标签

标签可以参考:http://www.1mayi.com/1224.html

另外,这套模板有个问题,如果某文章的标题太长,则排版会乱掉。所以需要对文章标题进行截取处理,代码如下:

<?php
$title = get_the_title();
$trimmed_title = wp_trim_words( $title, 20, '...' );
echo $trimmed_title;
?>

上面的是按字数来显示,如果是英文是按单词数来显示,如果要按英文字母的长度来显示,就用下面这个:

<?php echo mb_strimwidth(get_the_title(), 0, 20, '...'); ?>

参考:https://stackoverflow.com/questions/24636136/how-do-i-show-when-the-wordpress-title-exceeds-length

woocommerce产品列表中标题长度的修改方法:
在function.php中加入以下代码

add_filter( 'the_title', 'shorten_woo_product_title', 10, 2 );
function shorten_woo_product_title( $title, $id ) {
    if ( ! is_singular( array( 'product' ) ) && get_post_type( $id ) === 'product' ) {
        return substr( $title, 0, 45); // change last number to the number of characters you want
    } else {
        return $title;
    }
}

4.显示文章内容

<?php

echo wp_trim_words( get_the_title(),50);// 截取50字的文章标题

echo wp_trim_words( get_the_excerpt(),100);// 截取100字的文章摘要

echo wp_trim_words( get_the_content(),500);// 截取500字的文章内容

?>

自编代码:

<?php the_content(); ?>                                     #显示文章内容
<?php echo lingfeng_strimwidth(get_the_content(),190); ?>   #截取190个字符。

但是p元素会换行。

截取字符串的长度:

function lingfeng_strimwidth( $str, $len, $start = 0, $suffix = '……' ) {
	$str = str_replace(array(' ', ' ','&nbsp;', '\r\n'), '', strip_tags( $str ));
	if ( $len>mb_strlen( $str ) ) {
		return mb_substr( $str, $start, $len );
	}
	return mb_substr($str, $start, $len) . $suffix;
}

5.文章浏览次数
Updated on 2021:
这个最好用WP-PostViews插件,这样可以轻松实现“浏览次数最多的10篇文章这样的功能。”

/**
* getPostViews()函数
* 功能:获取阅读数量
*/
function getPostViews( $postID ) {
	 $count_key = 'post_views_count';
	 $count = get_post_meta( $postID, $count_key, true );
	 if( $count=='' ) {
		 delete_post_meta( $postID, $count_key );
		 add_post_meta( $postID, $count_key, '0' );
		 return "0";
	 }
	return $count;
 }


/**
* setPostViews()函数  
* 功能:设置或更新阅读数量
*/
 function setPostViews( $postID ) {
	 $count_key = 'post_views_count';
	 $count = get_post_meta( $postID, $count_key, true );
	 if( $count=='' ) {
		 $count = 0;
		 delete_post_meta( $postID, $count_key );
		 add_post_meta( $postID, $count_key, '0' );
	 } else {
		 $count++;
		 update_post_meta( $postID, $count_key, $count );
	 }
 }

显示文章浏览次数。

<?php setPostViews(get_the_ID()); ?> #这行代码也不能少
<?php echo getPostViews(get_the_ID()); ?>

6.显示标签
the_tags的三个参数,前后是前后显示的字符,中间是分隔符号。

<?php if(has_tag()):?>
<?php the_tags('',',','');?>

<?php else;  ?>
  暂无
<?php endif; ?>

7.文章分页
分页函数,注意:如果显示的间隔太短,可以直接用空格来填充。

/**
* 数字分页函数
* 因为wordpress默认仅仅提供简单分页
* 所以要实现数字分页,需要自定义函数
* @Param int $range			数字分页的宽度
* @Return string|empty		输出分页的HTML代码		
*/
function lingfeng_pagenavi( $range = 4 ) {
	global $paged,$wp_query;
	if ( !$max_page ) {
		$max_page = $wp_query->max_num_pages;
	}
	if( $max_page >1 ) {
		echo "<div class='fenye'>"; 
		if( !$paged ){
			$paged = 1;
		}
		if( $paged != 1 ) {
			echo "<a href='".get_pagenum_link(1) ."' class='extend' title='跳转到首页'>首页 </a>";
		}
		previous_posts_link('上一页 ');
		if ( $max_page >$range ) {
			if( $paged <$range ) {
				for( $i = 1; $i <= ($range +1); $i++ ) {
					echo "<a href='".get_pagenum_link($i) ."'";
				if($i==$paged) echo " class='current'";echo ">$i </a>";
				}
			}elseif($paged >= ($max_page -ceil(($range/2)))){
				for($i = $max_page -$range;$i <= $max_page;$i++){
					echo "<a href='".get_pagenum_link($i) ."'";
					if($i==$paged)echo " class='current'";echo ">$i</a>";
					}
				}elseif($paged >= $range &&$paged <($max_page -ceil(($range/2)))){
					for($i = ($paged -ceil($range/2));$i <= ($paged +ceil(($range/2)));$i++){
						echo "<a href='".get_pagenum_link($i) ."'";if($i==$paged) echo " class='current'";echo ">$i</a>";
					}
				}
			}else{
				for($i = 1;$i <= $max_page;$i++){
					echo "<a href='".get_pagenum_link($i) ."'";
					if($i==$paged)echo " class='current'";echo ">$i</a>";
				}
			}
		next_posts_link('下一页 ');
		if($paged != $max_page){
			echo "<a href='".get_pagenum_link($max_page) ."' class='extend' title='跳转到最后一页'>尾页</a>";
		}
		echo '<span>共['.$max_page.']页</span>';
		echo "</div>\n";  
	}
}

在engif之前调用。

	<?php endwhile; ?>
	<?php lingfeng_pagenavi(); ?>
	<?php endif; ?>

备注:
如果加入代码没有显示,可能你的文章数量太少了,需要在WordPress后台【常规】→【阅读】选项中,将“博客页面至多显示XX篇文章”设置为1,然后即可看到分页。

样式

/*------------------
    分页部分的CSS
------------------*/
.fenye{    
    height: 25px;
    line-height: 25px;
    _background: #F9F9F9;
    padding: 2px 5px;
    margin: 20px 4px;
    _border: solid 1px #ccc;
    _text-align: center;
}
 
.fenye a{
    padding:4px 6px 4px 6px;
    margin:0 2px 0 2px;
    border:1px solid #aaa;
    text-decoration:none;
    color:#333;
}
 
.fenye a.current{    
    background:#ff6f3d;    
    color:#fff;
}
 
.fenye a:hover{
    background:#ff6f3d;
    color:#fff;
}

另外,还可以使用分页插件

bootstrap分页

function snail_paging() {
	$p = 3;
	if ( is_singular() ) return;
	global $wp_query, $paged;
	$max_page = $wp_query->max_num_pages;
	if ( $max_page == 1 ) return; 
	echo '<ul class="pagination">';
	if ( empty( $paged ) ) $paged = 1;
	// echo '<span class="pages">Page: ' . $paged . ' of ' . $max_page . ' </span> '; 
	if ( $paged > 1 ) p_link( 1, '首页' );
	echo '<li class="prev-page">'; previous_posts_link('上一页'); echo '</li>';
	//if ( $paged > $p + 1 ) p_link( 1 );
	//if ( $paged > $p + 2 ) echo "<li><span>···</span></li>";
	for( $i = $paged - $p; $i <= $paged + $p; $i++ ) { 
	if ( $i > 0 && $i <= $max_page ) $i == $paged ? print "<li class=\"active\"><span>{$i}</span></li>" : p_link( $i );
	}
	//if ( $paged < $max_page - $p - 1 ) echo "<li><span> ... </span></li>";
	//if ( $paged < $max_page - $p ) p_link( $max_page);
	echo '<li class="next-page">'; next_posts_link('下一页'); echo '</li>';
	p_link( $max_page, '尾页' );
	//echo '<li><span>共 '.$max_page.' 页</span></li>';
	echo '</ul>';
	}
	
function p_link( $i, $title = '' ) {
	if ( $title == '' ) $title = "{$i}";
	echo "<li><a href='", esc_html( get_pagenum_link( $i ) ), "'>{$title}</a></li>";
	}

function p_curr_link( $i) {
	echo '<li><span class="active">'.$i.'</span></li>';
	}

八、文章分类页
分类页的模板名为archive.php,因为一般分类页也是文章列表,参照首页做就可以了。
就用:

<?php if( have_posts() ) : while( have_posts() ) : the_post(); ?>
<!-- 在这里调用数据 -->
<?php endwhile; ?>
<?php endif; ?>

页面显示分类的名称:


<?php $thiscat = get_category($cat); echo $thiscat ->name;?>

代码二


<?php
foreach((get_the_category()) as $category)
{
echo $category->cat_name;
}
?>

参考:https://www.admin122.com/blog/3432.html

九、实现相关文章的方法
代码测试可用

<ul id="cat_related">
<?php
global $post;
$cats = wp_get_post_categories($post->ID);
if ($cats) {
$args = array(
'category__in' => array( $cats[0] ),
'post__not_in' => array( $post->ID ),
'showposts' => 6,
'caller_get_posts' => 1
);
query_posts($args);
 
if (have_posts()) :
while (have_posts()) : the_post(); update_post_caches($posts); ?>
<li>* <a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; else : ?>
<li>* 暂无相关文章</li>
<?php endif; wp_reset_query(); } ?>
</ul>

2.根据标签查找相关文章,并显示文章摘要

<ul id="tags_related">
<?php
global $post;
$post_tags = wp_get_post_tags($post->ID);
if ($post_tags) {
 
foreach ($post_tags as $tag)
{
// 获取标签列表
$tag_list[] .= $tag->term_id;
}
 
// 随机获取标签列表中的一个标签
$post_tag = $tag_list[ mt_rand(0, count($tag_list) - 1) ];
 
// 该方法使用 query_posts() 函数来调用相关文章,以下是参数列表
$args = array(
'tag__in' => array($post_tag),
'category__not_in' => array(NULL),      // 不包括的分类ID
'post__not_in' => array($post->ID),
'showposts' => 20,               // 显示相关文章数量
'caller_get_posts' => 1
);
query_posts($args);
 
if (have_posts()) :
while (have_posts()) : the_post(); update_post_caches($posts); ?>
	<li>* <a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
	<p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">
		<?php echo wp_trim_words( get_the_content(),160);?>       
	</p> 
<?php endwhile; else : ?>
<li>* 暂无相关文章</li>
<?php endif; wp_reset_query(); } ?>
</ul>

参考:https://blog.csdn.net/weixin_33834910/article/details/91869215

十、首页显示最新的文件及缩略图
最简单的代码

<?php get_archives("postbypost", 10); ?>

代码二:

<?php query_posts("showposts=3&cat=1")?>
<?php while (have_posts()) : the_post(); ?>
	<?php if ( get_post_meta($post->ID, ‘pre_image’, true) ) : ?>
		<?php $image = get_post_meta($post->ID, ‘pre_image’, true); ?>   
		<a href=”<?php the_permalink() ?>”><img alt=”<?php the_title(); ?>” src=”<?php echo $image; ?>”></a>
	<?php else: ?>
		<a href=”<?php the_permalink() ?>”><img alt=”<?php the_title(); ?>” src=”<?php bloginfo(‘template_url’); ?>/files/wp30a.png”></a>
	<?php endif; ?>
		<h3><a title=”#” href=”<?php the_permalink() ?>”><?php the_title(); ?></a></h3>
		<p><?php the_excerpt(); ?>…</p>
<?php endwhile; ?>

简化版本:
不过这个有时和文章详情页的代码有冲突,会导致文章详情页显示多篇文章的内容。


<?php query_posts("showposts=3&cat=1")?>
<?php while (have_posts()): the_post(); ?>
	<h3><a title="#"" href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3>
<?php endwhile; ?>  	

进一步阅读:
4小时学会WordPress模板制作(二)
4小时学会WordPress模板制作(三)
4小时学会WordPress模板制作(四)常用代码

参考:
https://blog.csdn.net/cloudday/article/details/7276330

另外,发现没有设定文章的摘要,使用the_excerpt()也可以取到值,查了一下,原来:

如果在文章中没有编辑内容摘要字段,则默认截取文章的前55个字的内容

参考:http://www.xuxiaoke.com/wpfunc/131.html

暧昧帖

本文暂无标签

发表评论

*

*