分类
WordPress

三个插件完美解决wordpress文章自动保存和版本保存问题

这三个插件分别是:wp cleanerrevision controldisable-revisions-and-autosave

1、wp cleaner清理冗余信息插件

顾名思义,这个插件是一个清理文章和页面垃圾的插件,它能清理wordpress中没用(前台不能查看)的信息,如自动保存的文章、草稿、修订版等。界面如下:

三个插件完美解决wordpress文章自动保存和版本保存问题

2、revision control控制文章版本插件

这一些情况下,你希望wordpress为你保留多个版本,但又不希望太多以致数据冗余。该插件可以控制文章的版本数量,例如我可以设置文章的默认版本数为2,那么默认情况下每篇文章都将保留2个版本。同时,你还可以在每篇文章的下面设置该篇文章保存的版本数量,设置后不再使用默认设置。

三个插件完美解决wordpress文章自动保存和版本保存问题

三个插件完美解决wordpress文章自动保存和版本保存问题

通过revision control插件的控制,可以让你的自动保存功能得到很好的控制。

3、disable revision and autosave取消wordpress自动保存和版本保存插件

这个插件可以直接取消wordpress系统自动保存和文章版本保存,启动后每次发布文章就再也看不到下面草稿保存的提示了,因此安装后就不要在安装revision control了。但是需要注意的是,如果你打算写一篇新文章,但由于某些原因从文章添加页跳出,那么会产生一条自动保存,因此你需要配合wp cleaner将这种由于意外产生的自动保存删除。如果要彻底解决wordpress不自动保存草稿的现象,就不得不修改wordpress系统文件:

编辑wp-admin/includes/post.php文件,在 if ( $create_in_db ) { 语句之前加入一行 $create_in_db = false; 语句,经过实际测试,增加了这一行之后,新建日志,数据库就不会出现一篇自动存档的草稿了。

分类
WordPress

wordpress后台文章编辑器工具丰富插件TinyMCE Advanced

wordpress本身的文章编辑器工具是很简单的,可以满足一般需求,对一些功能需要切换到html模式自己写html代码。TinyMCE Advanced插件能帮助使用者丰富文章编辑器,让编辑器功能强大起来。

下载插件:http://wordpress.org/extend/plugins/tinymce-advanced/?

wordpress后台文章编辑器工具丰富插件TinyMCE Advanced

激活插件后后台设置中多了一项TinyMCE Advanced,进入后拖动下方的工具到上方的工具呈现栏中,保存即可让文章编辑器拥有新的功能按钮。

wordpress后台文章编辑器工具丰富插件TinyMCE Advanced

 

分类
WordPress

WordPress模板文件结构超详解

wordpress网站建设中,主题的制作是最为核心的环节。了解模板文件结构是模板制作的第一步,本文所讲的模板文件结构包括两部分,一是指以文件名为概念的文件结构,二是指文件内容的代码结构。

一、如何使模板文件起作用

wordpress模板文件夹放置于/wp-content/themes/下,开发者只需将自己的模板文件全部置于一个文件夹中,将文件夹置于该目录下,wordpress系统就会自动检测,发现模板文件可用时就会在后台“主题”中列出该模板。

我们创建一个文件夹,命名为mytheme,在mytheme中创建两个文件,分别是style.css,index.php,functions.php,用文本编辑器编辑这两个文件。在style.css首置入如下代码:

/*
Theme Name: utubon.com
Theme URI: http://www.utubon.com/
Description: 乌徒帮wordpress联盟
Author: frustigor
Version: 1.0
License:
License URI:
Tags: 乌徒帮
*/

保存即可。然后将mytheme文件夹放入到wordpress主题目录中,进入后台查看,是否有了一个新的主题。

其实wordpress对主题的检测紧限于style.css,index.php,有了这两个文件和上面的声明,即可在后台检测到新的主题。现在开始你可以在index.php中写网页结构,在style.css中写样式,在functions.php中添加新的函数和功能了。

你会问,其他的主题中,为什么会有这么多文件呢,如sidebar.php,page.php,single.php,category.php等。wordpress使用模板通过函数的调用,让模板之间形成完整的整体,例如在index.php中你会看到get_header()即调用文件名为header.php的模板文件, get_footer()亦然。get_template_part( ‘loop’, ‘index’ );则是调用模板loop-index.php。wordpress并非傻瓜的像include()函数一样包含这些文件,而是对文件的存在与否要进行判断,如果不存在该文件将用对应的相关文件代替,这需要你查看开发文档中该函数的具体解释。

二、一般情况下模板文件列表和对应的函数

我们查看所有的模板都会获悉该主题所拥有的模板文件,一般情况下,模板文件拥有下面的这些文件,他们分别对应了自己的调用函数,一并列出:

文件名 一般作用 对应的函数 备注(使用技巧)
style.css 样式表 <?php bloginfo( ‘stylesheet_url’ ); ?>调用地址
index.php wordpress识别首页 自动识别
functions.php 包含增函数和新功能 自动识别
header.php 头部 get_header()
footer.php 尾部 get_footer()
sidebar.php 边侧栏 get_sidebar(‘foot’)(无参数则调用sidebar.php) 参数foot指文件sidebar-foot.php类推
loop.php

content.php

内容循环 get_template_part( ‘loop’, ‘index’ )和sidebar一样 参数的意思是调用模板loop-index.php类推如果get_template_part( ‘content’,’single’ );
404.php,

search.php,

page.php,

single.php

分别是404页,搜索页,单独页面,文章内容页 自动识别,和index.php一样,使用上述函数,没有该文件的话用index.php
archive.php,

category.php,

tag.php,

author.php

分别是归档页,分类页,标签页,作者页 同上,但如果只有archive.php或category.php没有其他页,其他页用archive.php代替或category.php代替

除了上面这些页面之外,当然还会有主题特殊的文件,如主题自身的图片,js代码screenshot.png是主题预览图片,自动检测并在后台显示。上面没有提到的文件不一定不存在,如loop-tag-cloud.php,你可以用get_template(‘loop’,’tag-cloud’)来调用,这是一类上述衍生文件。其他特殊文件如果没有特定的说明或功能,也可用include()等php函数将其包含。上面的文件除了style.css,index.php都是可选文件,例如乌徒帮模板中没有很多文件。

三、文件代码结构:写一个最简单的模板

正如文章开头提到,最简单的模板就只有style.css和index.php这两个文件,接下来就用这个最简单的模板来讲解模板文件代码结构。如果你懂得html网页设计,并对wordpress函数有一些了解,制作自己的模板并不困难,完全可以仿照别人的模板,慢慢完成自己的模板。

这里强烈建议你采用标准的网页设计方法,放弃table布局,认真学习css,采用div+css布局。

请先自己设计出html代码(一个页面,首页),加入一些测试的文章、图片、特效等,然后按照本文的方法进行修改。然后将所有代码拷贝到index.php中,这时你甚至可以不用理会style.css。在index.php中,我给出的基本框架如下:

<html>
<head>
<title>乌徒帮wordpress联盟</title>
<style type=”text/css” media=”screen”>
html { margin-top: 28px !important; }
* html body { margin-top: 28px !important; }
</style>
</head>
<body>
<div id=”wapper”>
<div id=”header”></div>
<div id=”container”>
<div id=”left”></div>
<div id=”right”></div>
</div>
<div id=”footer”></div>
</div>
</body>
</html>

上面的只是最基本的框架,通过css样式控制页面的宽度、呈现颜色、表现形式等。

我们将头部定义到<div header>的地方,头部中既包含了网页的css、meta声明,也包含了网页顶部的一些元素,如导航条、logo、公告等。在头部中,我们需要修改一些内容:

1、引入style.css:<link rel=”stylesheet” type=”text/css” media=”all” href=”<?php bloginfo( ‘stylesheet_url’ ); ?>” />
2、引入wordpress本身需要添加的代码:
<?php
if ( is_singular() && get_option( ‘thread_comments’ ) )
wp_enqueue_script( ‘comment-reply’ );
wp_head();
?>
3、用下面的代码替换<title>的内容,以显示网页标题
<?php
global $page, $paged;
wp_title( ‘|’, true, ‘right’ );
bloginfo( ‘name’ );
$site_description = get_bloginfo( ‘description’, ‘display’ );
if ( $site_description && ( is_home() || is_front_page() ) )
echo ” | $site_description”;
if ( $paged >= 2 || $page >= 2 )
echo ‘ | ‘ . sprintf( __( ‘Page %s’, ‘twentyten’ ), max( $paged, $page ) );
?>

以上是网站声明部分,这些内容作为wordpress应该拥有的内容,最好不要缺少,当然你也可以根据自己的需要和想法替换为自己想要的内容。例如在wp_title()后面添加echo ‘你想要添加的内容’;从而增加你的网页标题的信息。

4、修改你的<div header>的内容,导航可以使用wordpress后台菜单用wp_nav_menu()函数来实现,要想使用该功能,还需要在functions.php中预先初始化主题,让主题支持后台菜单功能。或用分类列表代替用wp_list_categories()函数来实现,这些函数需要你慢慢学习他们的使用方法。

接下来是内容的部分,我们将文章在首页的呈现列表放在<div left>中,用下面的代码来实现文章列表的呈现。

<?php while(has_posts()) : the_post(); ?>
<div id=”post”>
<div id=”post-title”><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></div>
<div id=”post-content”><?php the_content(); ?></div>
</div>
<?php endwhile; ?>

以上是最最简单的文章循环了,将列出对应条数的最新文章标题和内容。作为开发者,你需要根据自己的想象和需要,结合js效果、css样式,实现自己最终想要的结果。

接下来是sidebar,我们将sidebar放在<div right>中,使用下面这段代码,实现在后台放置widget:

??? <?php if(is_active_sidebar(‘sidebar-widget-area-primary’)): ?>
<div id=”primary”>
<?php dynamic_sidebar( ‘sidebar-widget-area-primary’ ); ?>
</div><!–//end of primary–>
<?php endif; // end primary widget area ?>

不过目前这还是无法实现的,我们需要在functions.php中定义一个widget,这样才能实现后台小工具的使用,并在这里表现出来。

网页footer尾部可以由你自由发挥,等你慢慢熟练了wordpress模板的写作之后,可以实现很多调用和特效,例如在底部放入友情链接等。

四、functions.php的初始化定义

虽然style.css和index.php就可以让主题工作,但这样的主题是没有任何功能的,在前文中你已经发觉这个问题。怎样让主题拥有一些功能呢,如小工具widget的使用,菜单的使用,特色图片的使用等等。你可以在网络上其他文章中发现这些功能如何激活,本文只是做一个最简单的解释,丰富的功能需要你自己慢慢学习。

add_action( ‘after_setup_theme’, ‘twentyten_setup’ );
if (!function_exists( ‘twentyten_setup’)):
function twentyten_setup() {
add_editor_style();
add_theme_support( ‘post-formats’, array( ‘aside’, ‘gallery’ ) );
add_theme_support( ‘post-thumbnails’ );
add_theme_support( ‘automatic-feed-links’ );
load_theme_textdomain( ‘twentyten’, TEMPLATEPATH . ‘/languages’ );
$locale = get_locale();
$locale_file = TEMPLATEPATH . “/languages/$locale.php”;
if ( is_readable( $locale_file ) )
require_once( $locale_file );
register_nav_menus( array(
‘primary’ => __( ‘Primary Navigation’, ‘twentyten’ ),
) );
add_custom_background();
if ( ! defined( ‘HEADER_TEXTCOLOR’ ) )
define( ‘HEADER_TEXTCOLOR’, ” );
if ( ! defined( ‘HEADER_IMAGE’ ) )
define( ‘HEADER_IMAGE’, ‘%s/images/headers/path.jpg’ );
define( ‘HEADER_IMAGE_WIDTH’, apply_filters( ‘twentyten_header_image_width’, 940 ) );
define( ‘HEADER_IMAGE_HEIGHT’, apply_filters( ‘twentyten_header_image_height’, 198 ) );
set_post_thumbnail_size( HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT, true );
if ( ! defined( ‘NO_HEADER_TEXT’ ) )
define( ‘NO_HEADER_TEXT’, true );
}
endif;
if(function_exists(‘register_sidebar’)){
register_sidebar(array(
‘name’=>’上部边栏’,
‘id’ => ‘sidebar-widget-area-primary’,
‘description’ => ”,
‘before_widget’ => ‘<div>’,
‘after_widget’ => ‘</div>’,
‘before_title’ => ‘<h3><span>’,
‘after_title’ => ‘</span></h3>’,
));
register_sidebar(array(
‘name’=>’下部边栏’,
‘id’ => ‘sidebar-widget-area-secondary’,
‘description’ => ”,
‘before_widget’ => ‘<div>’,
‘after_widget’ => ‘</div>’,
‘before_title’ => ‘<h3><span>’,
‘after_title’ => ‘</span></h3>’,
));
register_sidebar(array(
‘name’=>’边栏右边’,
‘id’ => ‘sidebar-widget-area-right’,
‘description’ => ‘一般放分类列表’,
‘before_widget’ => ‘<div>’,
‘after_widget’ => ‘</div>’,
‘before_title’ => ‘<h3><span>’,
‘after_title’ => ‘</span></h3>’,
));
}

这段代码是我从tweentyten主题中抄袭和稍加修改过来的,你可以将这段代码拷贝到你的functions.php中,进入后台看看是否已经激活了不少功能。

接下来的工作就是要添加新的函数了,用新的函数来实现很多新的wordpress系统没有的功能。由于wordpress模板开发是一个巨大的工程,无法用一篇文章讲完,因此,本文只是稍加点讲,无法深入,你可以看乌徒帮其他文章,以获取新的信息。

五、构建完整的模板体系

通过上文的讲解加上你坚持不懈的学习,应该对wordpress模板的初浅知识有了较为深刻的体会。接下来你就将拥有一个庞大复杂但逻辑合理成系统体系的模板了。

我们利用之前制作好的index.php文件将其分割,将我所指的头部全部剪切到一个新的header.php文件中,置于mytheme下,在index.php被剪切的地方用<?php get_header(); ?>代替,将<div container>全部剪切到新的loop.php中用<?php get_template_part(‘loop’,’index’); ?>代替,将尾部全部剪切到footer.php中用<?php get_footer(); ?>代替。这样一来你就发现你的index.php只留下了三条php语句了,在运行你的博客试试,是否跟刚才的效果一模一样呢?再将loop.php中的<div right>剪切到sidebar.php中用<?php get_sidebar(); ?>代替。这下是不是觉得你的主题文件夹内就丰富了好多。

新建一个category.php,将index.php中的内容拷贝过来,修改<?php get_template_part(‘loop’,’index’); ?>为<?php get_template_part(‘loop’,’category’); ?>,新建一个loop-category.php并在里面编写分类页想要呈现的表现形式。

按照这个思路,很快你的模板文件就会有很多,而且随着你对模板文件之间调用关系的理解,很快可以自由编写文件了。

六、总结

编写wordpress模板是一个比较繁杂的过程,对于初学者是很难一下获得成功的,只有慢慢学习和敢于挑战才能获取成功。wordpress模板的关键主要体现在:

1、模板样式:模板的外观决定了模板的成败,一个好的模板首先体现在另读者很舒服的外观上,而作为程序员,往往被设计难倒;要向拥有令人眼前一亮的wordpress模板,学好设计和css是必不可少的网编基础。
2、模板功能:模板的功能是体现模板开发者水平的衡量标准,一个功能丰富的模板,能给用户一种权威的感觉,无论是个人站还是企业站,华丽的网站功能让用户觉得站长是用心做站的人。
3、模板的设计理念:开发者根据自己的目标设计符合自身需要的模板,不盲目追求,不刻意回避,而是以需求为目标,以用户体验为设计动力。

因此,其实开发wordpress到后期问题不是在wordpress模板的代码逻辑和函数编写上,而是在于天才的开发思路和高雅的审美观念上。

分类
WordPress

wordpress函数add_filter:可修改wordpress本身函数效果

add_filter()在wordpress主题制作中是非常常见的函数,它是wordpress的中文本的hooks,可以在文本被写入数据库的时候,或从数据库取出打印到屏幕的时候,对文本进行修饰。wordpress文件原文

使用方法

<?php?add_filter(?$tag,?$function_to_add,?$priority,?$accepted_args?);??>

参数说明

$tag : 过滤器挂钩的关键字,是$function_to_add将起作用的函数(可能是wordpress本身的系统函数关键字),例如“the_title”,可以修改函数the_title的输出效果。官方并没有给出相对好用完整的列表,你可以大致参考一下这里

$function_to_add : 你通过自己编程写了一个函数,这里就是该函数名,如你写了一个seo_title()来实现对wp_title的修改,你就可以用add_filter(‘wp_title’,’seo_title’)来替代原来的wp_title()函数。

$priority : 执行次序数,如果你之前也定义了一个add_filter的话,wordpress执行这些add_filter是有顺序的,你可以更改该参数,让后面的数值更小,从而更先执行。

$accepted_args :该参数的具体作用不是很清晰,可以不用理会,值为数值,据开发文档说,是指接收函数的协议。

返回值

该函数永远返回true,无论参数如何,都将执行,而且执行速度很快。

使用方法举例

add_filter(‘img_caption_shortcode’, ‘my_img_caption_shortcode_filter’,10,3);
/**
* Filter to replace the shortcode text with HTML5 compliant code
*
* @return text HTML content describing embedded figure
**/
function my_img_caption_shortcode_filter($val, $attr, $content = null)
{
extract(shortcode_atts(array(
‘id’ => ”,
‘align’ => ”,
‘width’ => ”,
‘caption’ => ”
), $attr));

if ( 1 > (int) $width || empty($caption) )
return $val;

$capid = ”;
if ( $id ) {
$id = esc_attr($id);
$capid = ‘id=”figcaption_’. $id . ‘” ‘;
$id = ‘id=”‘ . $id . ‘” aria-labelledby=”figcaption_’ . $id . ‘” ‘;
}

return ‘<figure ‘ . $id . ‘class=”wp-caption ‘ . esc_attr($align) . ‘” style=”width: ‘
. (10 + (int) $width) . ‘px”>’ . do_shortcode( $content ) . ‘<figcaption ‘ . $capid
. ‘class=”wp-caption-text”>’ . $caption . ‘</figcaption></figure>’;
}

上面的代码执行完以后,img_caption_shortcode()将被my_img_caption_shortcode_filter()修饰或代替。

你可以用下面的方法来记录修改函数的指针(地址)

<?php?add_filter(‘media_upload_newtab’,?array(&$this,?’media_upload_mycallback’));??>

或者直接在add_filter()中定义新函数

<?php?add_filter(‘the_title’,?function($title)?{?return?'<b>’.?$title.?'</b>’;})??>

其他附带信息

函数的原始码在wp-includes/plugin.php

使用Filter API参看 Plugin_API/Filter_Reference 获取hooks列表

分类
WordPress

将WordPress英文博客切换到GoogleBlogger服务器的方法

英文博客将WordPress切换到GoogleBlogger服务器的方法:前提条件, Permalink必须是/%year%/%monthnum%/%postname%.html;导出的XML文件不大于1M。先在WordPress的Tools-Export中导出博客为XML文件。之后访问http://wordpress2blogger.appspot.com/,将XML转换为Blogger格式的XML。登录Blogger,导入XML即可。

分类
WordPress

无需插件为wordpress文章添加目录索引

今天在阅读水煮鱼的文章时发现了一款插件,可以实现给一篇文章开头添加文章内的索引锚链接,(http://fairyfish.net/project/toc/)让用户在文章开头就对文章结构一目了然,这不正如本站实现的文章页头的情况么。所以乌徒帮也将自己的实现方法贴出来,供大家讨论交流。

概述

乌徒帮实现该功能是通过写新函数,对the_content函数进行修缮,并在文章页模板中加入代码的方法,完全没有使用插件。于水煮鱼不同的是,乌徒帮并非每篇文章都会设置醒目的子标题作为索引,所以乌徒帮将那些没有采用子标题的文章在这里用摘要输出。在写文章时,利用可视化编辑中对段落的规定,将想要设置为锚链接的子标题设置为“三级标题”(即h3)即可。接下来,frustigor就将实现该功能的函数、模板页、css样式部分贴出来供大家把玩。

函数部分

加下面这段代码加入到模板文件functions.php中

/* 在文章开头显示文章索引 */
function get_article_index() {
$matches = array();
$ul_li = ”;
$r = “/<h3>([^<]+)</h3>/im”;
global $post;
$content=$post->post_content;
if(preg_match_all($r, $content, $matches)) {
foreach($matches[1] as $num => $title) {
//$content = str_replace($matches[0][$num], ‘<h3 id=”title-‘.$num.’”>’.$title.'</h3>’, $content);
$ul_li .= ‘<li><a href=”#title-‘.$num.’” title=”‘.$title.’”>’.$title.”</a></li>n”;
}
$name=’文章索引’;
}else{
global $post;$excerpt=$post->post_excerpt;
if($excerpt)$ul_li=$excerpt;
else $ul_li=mb_strimwidth(get_the_excerpt(),0,200,’…’);
$name=’文章摘要 <a href=”javascript:initialize()”>读READ</a>’;
}
$content =’
<div id=”article-index-ad”>
<span><strong>’.$name.'</strong>’.$ul_li.'</span>
<span>’.get_single_ad().'</span>
</div>
‘;
return $content;
}
function article_index($content) {
$matches = array();
$ul_li = ”;
$r = “/<h3>([^<]+)</h3>/im”;
if(preg_match_all($r, $content, $matches)) {
foreach($matches[1] as $num => $title) {
$content = str_replace($matches[0][$num], ‘<h3 id=”title-‘.$num.’”>’.$title.'</h3>’, $content);
}
}
return $content;
}
add_filter( “the_content”, “article_index” );

第一个函数将在文章模板中用到,目的是实现在文章页的文章内容上方输出带索引的列表。其中get_single_ad()函数是本站在文章旁边的广告函数,你可以更换成你自己的广告代码,或者删除。第二个函数和add_filter()句就是对文章内容进行调整。将文章中所有<h3>标签修改为带有锚的形式,这样你在点击文首的锚链接时就链到该标题。

模板修改

在文章页模板single.php或loop-single.php或其他名称的文章页模板内作如下修改

<?php if(function_exists(‘get_article_index’))echo get_article_index(); ?>
<?php the_content(); ?>

即在the_content()函数上方添加刚才的新增函数,不过你需要对布局进行适当调整,如可以用漂浮的方法等。

css样式

因为每个人的布局不同,想要呈现的方式不一样,本文不做统一规定,不过要提醒的是:1、你最好学乌徒帮,对文章中的h3做另类的规定;2、如果你的谋篇文章设置了比较多的子标题,就会产生很多锚索引,撑破你的div框,你可以用下面的方法来实现固定高度:

overflow:scroll;
overflow-x:hidden;

使用这种方法可以让你的div在溢出时横向不能滚动,纵向可以滚动,如此可以让你的空间够用又不太影响美观。

PS:其实百度更新很快的,本文发布时间20:53,结果21:00左右就收录,下图是我在23:00site百度得到的结果

无需插件为wordpress文章添加目录索引

分类
WordPress

wordpress.com用户获取Akismet密匙

Akismet插件是最好的wordpress垃圾评论屏蔽插件,不是简单的自我程序判断,具有云处理的特点,即使有新的wordpress垃圾评论模式出现,也会很快被Akismet收录,成为垃圾评论。乌徒帮使用Akismet插件每天都能屏蔽掉很多垃圾评论,这些垃圾几乎不存在误判。虽然该插件很好用,但需要激活密匙和可连接服务器(有的主机空间竟然不能正常连接到Akismet的服务器)两项条件,今天来谈谈wordpress.com的注册用户如何获取Akismet密匙。

如果你有兴趣阅读英文原文,请进入http://en.wordpress.com/api-keys/。文章中讲到了如果你是wordpress.com用户,可以根据提示获取API Keys,如果不是注册用户,也可以到Akismet官网注册获取。

1、注册并登陆wordpress.com,当然,如果你并不想成为wordpress.com的用户,可以选择直接注册Akismet(http://akismet.com/get/),如果想体验一下wordpress官方开发的各种强大功能,可以注册wordpress.com尝试体验。

2、登陆后点击顶部导航进入到控制面板,根据下图操作获取api keys。

wordpress.com用户获取Akismet密匙

分类
WordPress

多站点中blog和site的区别

之前我也对这个问题非常不理解,在我们开通多站点Multisite功能之后,我们的数据库中就多了很多表,而其中关于blog和site的区别到底是什么呢?

blog就是指子站点(包括主站点在内);
site指的是这个这套系统,指WordPress系统。

home_url与site_url的区别一文中我指出了site_url是安装路径,那么在本文的问题中,site就是指被安装的系统。我们无法用中文表达出system和blog的区别,系统属于底层基础,而站点是在这个基础上实现的应用。

我之所以顿悟blog和site的区别,是今天在使用global $current_blogglobal $current_site时的发现,$current_blog会随着切换到不同的子站点进行变化,而$current_site不会变,所指向的永远是ID为1的站点。(需要解释的是,这仍然不能反映出site是指安装的系统的定论,因为这里它仍然要和子站点对应。)

基于上述的理解,如果你要在开发中获得关于主站点的信息,那么你应该使用global $current_site,例如你要获得关于主站点博客的ID,可以使用:

global $current_site; $root_blog_id = $current_site['blog_id'];(待检验)

site_id和blog_id又是怎么回事儿?

我查阅了很多资料,都没有一个对这个问题的确切的说法,在数据库中,同时存在_site和_blogs两张表,通过上文的解释,我们已经明确知道了site和blog存在着本质的区别。我们对site_id和blog_id的疑问,实际上是对wp-config.php中的define(‘SITE_ID_CURRENT_SITE’, 1);define(‘BLOG_ID_CURRENT_SITE’, 1);更感兴趣。我们实际上更想知道它们之间的对应关系,site_id和blog_id在wp-config.php中的对应关系一旦变化,会有哪些变化。

SITE_ID_CURRENT_SITE一旦变化,global $current_site中的id就随之变化,global $current_blog中的site_id也会随之变化,而如果改变BLOG_ID_CURRENT_SITE,只有global $current_site中的blog_id会变化。

在官方社区中的这个帖子里有人这样总结:

It’s so simple, make it a rule of thumb and you’ll never forget. (remember you only have two thumbs!)

site_id = the network
blog_id = the sites (formerly known as blogs)

That’s it!

site_id=1 and blog_id=1 <– that’s your main domain. The one you installed WordPress on. By enabling multisite, it becomes the network and the site. This only happens once.

site_id=1 and blog_id=2 <– that’s your second site.
site_id=1 and blog_id=3 <– that’s your third site.

(其实这个人把blog理解为site了,没有理解成我文章最开始说的那种关系。他们都认为在WP3.0之后,只有site,没有blog。)

而我个人认为,这里需要引入“项目”的概念,site相当于一个项目,而blog相当于这个项目中的阶段性成果。如果我们用同样的框架,好比这里的WordPress,开展两个项目,好比这里的site_id,就会对应出不同的阶段性成果,好比这里的blog_id。

而我通过修改SITE_ID_CURRENT_SITEBLOG_ID_CURRENT_SITE也没有发现特别大的区别,唯一找到的变化是:

如果你刚刚开通Multisite功能,你会发现你的主博客固定链接前面会有一个/blog/前缀,而如果你通过修改wp-config.php中的BLOG_ID_CURRENT_SITE值,就能去掉这个/blog/前缀。

这是唯一的发现,也是本文对site_id和blog_id的唯一区别。

分类
WordPress

新增函数:wordpress获取文章第一张图片

在很多模板制作中,朋友们希望获取文章的第一张图作为文章列表中文章标题前的图片展示,今天写一个函数,用来实现这一效果。通过本函数,你可以在今后的模板设计中,不再考虑什么情况下使用图片,应该如何调用文章图片等问题,只需在恰当的位置调用本函数即可。

代码

你只需将下面的函数加入到functions.php中,然后在文章循环内调用该函数即可:

function get_post_first_pic($post_id,$default=0,$link=0,$style=”){
$post=get_post($post_id);
$thumb=get_the_post_thumbnail($post_id,array(‘alt’=>trim(strip_tags($post->post_title)),’title’=>trim(strip_tags($post->post_title))));
if(!$thumb){
preg_match(‘/<img.+src=[‘”]([^’”]+)[‘”].* />/i’,$post->post_content, $index_piclink);
if($index_piclink[1]){
$thumb='<img src=”‘.$index_piclink[1].’” title=”‘.$post->post_title.’” alt=”‘.$post->post_title.’” ‘.$style.’ />’;
}else{
if($default!=0)$thumb='<img src=”‘.get_bloginfo(‘template_url’).’/images/default.jpg” title=”‘.$post->post_title.’” alt=”‘.$post->post_title.’” ‘.$style.’ />’;
}
}
if($thumb&&$link!=0&&$link!=”)$output='<a href=”‘.get_permalink().’” title=”‘.$post->post_title.’”>’.$thumb.'</a>’;
else $output=$thumb;
return $output;
}
function post_first_pic($post_id,$default=0,$link=0,$style=”){
echo get_post_first_pic($post_id,$default,$link,$style);
}

详解

第一个函数是获取函数,第二个函数则将第一个函数中获取的结果显示出来。

get_post_first_pic($post_id,$default=0,$link=0,$style=”)有四个参数,其中$post_id指要获取的文章ID,如果再LOOP循环中,可以直接用$post->ID代替,显示该文章的第一张图片;$default用于在该文章没有图片的情况下,是否显示模板目录下的/images/default.jpg作为替代图片,非0则使用;$link则表示是否将该图片链接指向文章,如果为0,则不带链接;$style就是对图片添加新的属性,如你可以将$style=’style=”border:none;”‘;从而添加特定的附属属性。

当文章中没有图片,$default=0时,则不显示任何内容。

例子

下面是一个调用的例子:

<?php if(function_exists(‘post_first_pic’))post_first_pic($post->ID,1,1,’style=”width:150px;height:150px;”‘);?>
<?php the_excerpt(); ?>

上面这段代码放在while循环中,将以摘要的形式输出文章内容,并在摘要前面加入一张图片。

分类
WordPress

home_url与site_url的区别

WordPress中不同URL地址函数详解一文中我写到了home_url和site_url,在之前的文章中似乎也讨论过这个问题,但始终没有辨析清楚,今天用一个小短文将这个话题说清楚。

在独立站点中home_urlsite_url相同,他们被存放在_options数据表中,一般当我们更换域名之后,需要进入数据库修改site_url对应的option_value才能正常进入,进入后台之后再修改home_url的值,顾名思议,site_url就是指WordPress系统安装路径,通过这个路径访问的是wordpress系统的index.php文件,当然,一般情况下就是访问首页了。

home_url真正等价的值是get_bloginfo(‘url’),主要用在前台中打印地址。例如我们在主题中要获得utubon.com/site/这个路径,那么使用echo home(‘/site/’);即可,只有当我们要调用某个放在插件目录下的文件的时候,我们才使用site_url(),但实际上plugin_url()就可以帮上忙,不需要site_url插手。

在特殊情况下home_url和site_url不同。

  1. 使用了多语言插件,规定不同的域名对应不同的路径;
  2. 使用域名绑定插件;
  3. 开启Multisite多站点功能;
  4. 其他add_filter(‘home_url’,”)的情况下。

当我们使用一些多语言插件的时候,home_url对应的值会动态变化,例如我们让www指向中文站点,让en.子域名指向英文站点,fr.指向法语站点,那么在你的主题中,虽然都使用了home_url来获得首页地址,但在英文站点中这个首页地址是以en.开头的子域名地址,法语站点中也是同样的道理,这个时候你可以使用site_url来获得中文站点的地址。

在开启了多站点的时候,情况又有所变化,home_url是当前子站点的首页地址,而site_url是整个站点的访问地址。在下一篇文章中,我会提到在多站点中blog和site的区别。