J2EE框架 Spring

J2EE框架 Spring 推荐

J2EE框架 面向方面AOP/IoC Web框架
Apache
Java
跨平台

Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本。该框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-7645-4385-7)一书中的代码,最初由 Rod Johnson 和 Juergen Hoeller等开发。Spring Framework 提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。

Spring 中包含的关键特性:

  • 强大的基于 JavaBeans 的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
  • 一个可用于从 applet 到 Java EE 等不同运行环境的核心 Bean 工厂。
  • 数据库事务的一般化抽象层,允许宣告式(Declarative)事务管理器,简化事务的划分使之与底层无关。
  • 内建的针对 JTA 和 单个 JDBC 数据源的一般化策略,使 Spring 的事务支持不要求 Java EE 环境,这与一般的 JTA 或者 EJB CMT 相反。
  • JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码), 简化了错误处理, 大大减少了程序员的编码量. 再次利用JDBC时,你无需再写出另一个 ‘终止’ (finally) 模块. 并且面向JDBC的异常与Spring 通用数据访问对象 (Data Access Object) 异常等级相一致.
  • 以资源容器,DAO 实现和事务策略等形式与 Hibernate,JDO 和 iBATIS SQL Maps 集成。利用众多的翻转控制方便特性来全面支持, 解决了许多典型的Hibernate集成问题. 所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范.
  • 灵活的基于核心 Spring 功能的 MVC 网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如 JSP,FreeMarker,Velocity,Tiles,iText 以及 POI。值得注意的是,Spring 中间层可以轻易地结合于任何基于 MVC 框架的网页层,例如 Struts,WebWork,或 Tapestry。
  • 提供诸如事务管理等服务的面向方面编程框架。

在设计应用程序Model时,MVC 模式(例如Struts)通常难于给出一个简洁明了的框架结构。Spring却具有能够让这部分工作变得简单的能力。程序开发员们可以使用Spring的 JDBC 抽象层重新设计那些复杂的框架结构。

高性能PHP框架 Phalcon

BSD
PHP,C
跨平台

PhalconPHP 是一个使用 C 扩展开发的 PHP Web 框架,提供高性能和低资源占用。

Phalcon 是一个开源的、全堆栈的 PHP 5 框架,使用 C 扩展编写,专门为高性能优化。无需学习和使用 C 语言,所有函数都以 PHP 类的方式曾现。Phalcon 是一个松耦合的框架。

使用时需在 php.ini 中添加:extension=phalcon.so

参考:https://www.oschina.net/p/phalcon

Eloquent ORM Laravel 5.3 创建 配置与使用

1、简介

Laravel 自带的 Eloquent ORM 提供了一个美观、简单的与数据库打交道的 ActiveRecord 实现,每张数据表都对应一个与该表进行交互的“模型”,模型允许你在表中进行数据查询,以及插入、更新、删除等操作。

在开始之前,确保在config/database.php文件中配置好了数据库连接。更多关于数据库配置的信息,请查看文档。

2、定义模型

作为开始,让我们创建一个 Eloquent 模型,模型通常位于app目录下,你也可以将其放在其他可以被composer.json文件自动加载的地方。所有Eloquent模型都继承自 Illuminate\Database\Eloquent\Model类。

创建模型实例最简单的办法就是使用 Artisan 命令make:model

php artisan make:model User

如果你想要在生成模型时生成数据库迁移,可以使用--migration-m选项:

php artisan make:model User --migration
php artisan make:model User -m

Eloquent 模型约定

现在,让我们来看一个 Flight 模型类例子,我们将用该类获取和存取数据表flights中的信息:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model{
    //
}

表名

注意我们并没有告诉 Eloquent 我们的Flight模型使用哪张表。默认规则是模型类名的复数作为与其对应的表名,除非在模型类中明确指定了其它名称。所以,在本例中,Eloquent 认为Flight模型存储记录在flights表中。你也可以在模型中定义table属性来指定自定义的表名:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model{
    /**
     * 关联到模型的数据表
     *
     * @var string
     */
    protected $table = 'my_flights';
}

主键

Eloquent 默认每张表的主键名为id,你可以在模型类中定义一个$primaryKey属性来覆盖该约定。

此外,Eloquent默认主键字段是自增的整型数据,这意味着主键将会被自动转化为int类型,如果你想要使用非自增或非数字类型主键,必须在对应模型中设置$incrementing属性为false

时间戳

默认情况下,Eloquent 期望created_atupdated_at已经存在于数据表中,如果你不想要这些 Laravel 自动管理的列,在模型类中设置$timestamps属性为false

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model{
    /**
     * 表明模型是否应该被打上时间戳
     *
     * @var bool
     */
    public $timestamps = false;
}

如果你需要自定义时间戳格式,设置模型中的$dateFormat属性。该属性决定日期被如何存储到数据库中,以及模型被序列化为数组或 JSON 时日期的格式:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model{
    /**
     * 模型日期列的存储格式
     *
     * @var string
     */
    protected $dateFormat = 'U';
}

数据库连接
 
默认情况下,所有的 Eloquent 模型使用应用配置中的默认数据库连接,如果你想要为模型指定不同的连接,可以通过$connection 属性来设置:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model{
    /**
     * The connection name for the model.
     *
     * @var string
     */
    protected $connection = 'connection-name';
}

3、获取模型

创建完模型及其关联的数据表后,就要准备从数据库中获取数据。将Eloquent模型看作功能强大的查询构建器,你可以使用它来流畅的查询与其关联的数据表。例如:

<?php

use App\Flight;

$flights = App\Flight::all();

foreach ($flights as $flight) {
    echo $flight->name;
}

添加额外约束

Eloquent 的all方法返回模型表的所有结果,由于每一个Eloquent模型都是一个查询构建器,你还可以添加约束条件到查询,然后使用get方法获取对应结果:

$flights = App\Flight::where('active', 1)
               ->orderBy('name', 'desc')
               ->take(10)
               ->get();

注意:由于 Eloquent 模型本质上就是查询构建器,你可以在Eloquent查询中使用查询构建器的所有方法。

集合

对 Eloquent 中获取多个结果的方法(比如allget)而言,其返回值是Illuminate\Database\Eloquent\Collection的一个实例,Collection类提供了多个有用的函数来处理Eloquent结果集:

$flights = $flights->reject(function ($flight) {
    return $flight->cancelled;
});

当然,你也可以像数组一样循环遍历该集合:

foreach ($flights as $flight) {
    echo $flight->name;
}

组块结果集

如果你需要处理成千上万个 Eloquent 结果,可以使用chunk命令。chunk方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包进行处理。使用chunk方法能够在处理大量数据集合时有效减少内存消耗:

Flight::chunk(200, function ($flights) {
    foreach ($flights as $flight) {
        //
    }
});

传递给该方法的第一个参数是你想要获取的“组块”数目,闭包作为第二个参数被调用用于处理每个从数据库获取的区块数据。

使用游标

cursor
方法允许你使用游标迭代处理数据库记录,一次只执行单个查询,在处理大批量数据时,cursor方法可大幅减少内存消耗:

foreach (Flight::where('foo', 'bar')->cursor() as $flight) {
    //
}

4、获取单个模型/聚合

当然,除了从给定表中获取所有记录之外,还可以使用findfirst获取单个记录。这些方法返回单个模型实例而不是返回模型集合:

// 通过主键获取模型...
$flight = App\Flight::find(1);
// 获取匹配查询条件的第一个模型...
$flight = App\Flight::where('active', 1)->first();

还可以通过传递主键数组来调用find方法,这将会返回匹配记录集合:

$flights = App\Flight::find([1, 2, 3]);

Not Found 异常

有时候你可能想要在模型找不到的时候抛出异常,这在路由或控制器中非常有用,findOrFailfirstOrFail方法会获取查询到的第一个结果。然而,如果没有任何查询结果,Illuminate\Database\Eloquent\ModelNotFoundException异常将会被抛出:

$model = App\Flight::findOrFail(1);
$model = App\Flight::where('legs', '>', 100)->firstOrFail();

如果异常没有被捕获,那么HTTP 404 响应将会被发送给用户,所以在使用这些方法的时候没有必要对返回404响应编写明确的检查:

Route::get('/api/flights/{id}', function ($id) {
    return App\Flight::findOrFail($id);
});

获取聚合

当然,你还可以使用查询构建器聚合方法,例如countsummax,以及其它查询构建器提供的聚合方法。这些方法返回计算后的结果而不是整个模型实例:

$count = App\Flight::where('active', 1)->count();
$max = App\Flight::where('active', 1)->max('price');

5、插入/更新模型

插入

想要在数据库中插入新的记录,只需创建一个新的模型实例,设置模型的属性,然后调用save方法:

<?php

namespace App\Http\Controllers;

use App\Flight;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class FlightController extends Controller{
    /**
     * 创建一个新的航班实例
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        // Validate the request...

        $flight = new Flight;

        $flight->name = $request->name;

        $flight->save();
    }
}

在这个例子中,我们只是简单分配HTTP请求中的name参数值给App\Flight模型实例的那么属性,当我们调用save方法时,一条记录将会被插入数据库。created_atupdated_at时间戳在save方法被调用时会自动被设置,所以没必要手动设置它们。

更新

save方法还可以用于更新数据库中已存在的模型。要更新一个模型,应该先获取它,设置你想要更新的属性,然后调用save方法。同样,updated_at时间戳会被自动更新,所以没必要手动设置其值:

$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();

更新操作还可以同时修改给定查询提供的多个模型实例,在本例中,所有有效且destination=San Diego的航班都被标记为延迟:

App\Flight::where('active', 1)
          ->where('destination', 'San Diego')
          ->update(['delayed' => 1]);

update方法要求以数组形式传递键值对参数,代表着数据表中应该被更新的列。

注:通过Eloquent进行批量更新时,savedupdated模型事件将不会在更新模型时触发。这是因为在进行批量更新时并没有从数据库获取模型。

批量赋值

还可以使用create方法保存一个新的模型。该方法返回被插入的模型实例。但是,在此之前,你需要指定模型的fillableguarded属性,因为所有Eloquent模型都通过批量赋值(Mass Assignment)进行保护。

当用户通过 HTTP 请求传递一个不被期望的参数值时就会出现安全隐患,然后该参数以不被期望的方式修改数据库中的列值。例如,恶意用户通过 HTTP 请求发送一个is_admin参数,然后该参数映射到模型的create方法,从而允许用户将自己变成管理员。

所以,你应该在模型中定义哪些属性是可以进行赋值的,使用模型上的$fillable属性即可实现。例如,我们设置Flight模型上的name属性可以被赋值:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model{
    /**
     * 可以被批量赋值的属性.
     *
     * @var array
     */
    protected $fillable = ['name'];
}

设置完可以被赋值的属性之后,我们就可以使用create方法在数据库中插入一条新的记录。create方法返回保存后的模型实例:

$flight = App\Flight::create(['name' => 'Flight 10']);

黑名单属性

$fillable就像是可以被赋值属性的“白名单”,还可以选择使用$guarded$guarded属性包含你不想被赋值的属性数组。所以不被包含在其中的属性都是可以被赋值的,因此,$guarded功能就像“黑名单”。当然,这两个属性你只能同时使用其中一个——而不能一起使用,因为它们是互斥的:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model{
    /**
     * 不能被批量赋值的属性
     *
     * @var array
     */
    protected $guarded = ['price'];
}

如果你想要让所有属性都是可批量赋值的,可以将$guarded属性设置为空数组:

/**
 * The attributes that aren't mass assignable.
 *
 * @var array
 */
protected $guarded = [];

其它创建方法

还有其它两种可以用来创建模型的方法:firstOrCreatefirstOrNewfirstOrCreate方法先尝试通过给定列/值对在数据库中查找记录,如果没有找到的话则通过给定属性创建一个新的记录。

firstOrNew方法和firstOrCreate方法一样先尝试在数据库中查找匹配的记录,如果没有找到,则返回一个的模型实例。注意通过firstOrNew方法返回的模型实例并没有持久化到数据库中,你还需要调用save方法手动持久化:

// 通过属性获取航班, 如果不存在则创建...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
// 通过属性获取航班, 如果不存在初始化一个新的实例...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);

6、删除模型

要删除一个模型,调用模型实例上的delete方法:

$flight = App\Flight::find(1);
$flight->delete();

通过主键删除模型

在上面的例子中,我们在调用delete方法之前从数据库中获取该模型,然而,如果你知道模型的主键的话,可以调用destroy方法直接删除而不需要获取它:

App\Flight::destroy(1);
App\Flight::destroy([1, 2, 3]);
App\Flight::destroy(1, 2, 3);

通过查询删除模型

当然,你还可以通过查询删除多个模型,在本例中,我们删除所有被标记为无效的航班:

$deletedRows = App\Flight::where('active', 0)->delete();

注:通过Eloquent进行批量删除时,deletingdeleted模型事件在删除模型时不会被触发,这是因为在进行模型删除时不会获取模型。

软删除

除了从数据库删除记录外,Eloquent还可以对模型进行“软删除”。当模型被软删除后,它们并没有真的从数据库删除,而是在模型上设置一个deleted_at属性并插入数据库,如果模型有一个非空deleted_at值,那么该模型已经被软删除了。要启用模型的软删除功能,可以使用模型上的Illuminate\Database\Eloquent\SoftDeletestrait并添加deleted_at列到$dates属性:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Flight extends Model{
    use SoftDeletes;

    /**
     * 应该被调整为日期的属性
     *
     * @var array
     */
    protected $dates = ['deleted_at'];
}

当然,应该添加deleted_at列到数据表。Laravel Schema构建器包含一个帮助函数来创建该列:

Schema::table('flights', function ($table) {
    $table->softDeletes();
});

现在,当调用模型的delete方法时,deleted_at列将被设置为当前日期和时间,并且,当查询一个使用软删除的模型时,被软删除的模型将会自动从查询结果中排除。

判断给定模型实例是否被软删除,可以使用trashed方法:

if ($flight->trashed()) {
    //
}

查询被软删除的模型

包含软删除模型

正如上面提到的,软删除模型将会自动从查询结果中排除,但是,如果你想要软删除模型出现在查询结果中,可以使用withTrashed方法:

$flights = App\Flight::withTrashed()
                ->where('account_id', 1)
                ->get();

withTrashed方法也可以用于关联查询中:

$flight->history()->withTrashed()->get();

只获取软删除模型

onlyTrashed方法之获取软删除模型:

$flights = App\Flight::onlyTrashed()
                ->where('airline_id', 1)
                ->get();

恢复软删除模型

有时候你希望恢复一个被软删除的模型,可以使用restore方法:

$flight->restore();

你还可以在查询中使用restore方法来快速恢复多个模型:

App\Flight::withTrashed()
        ->where('airline_id', 1)
        ->restore();

withTrashed方法一样,restore方法也可以用于关联查询:

$flight->history()->restore();

永久删除模型

有时候你真的需要从数据库中删除一个模型,可以使用forceDelete方法:

// 强制删除单个模型实例...
$flight->forceDelete();
// 强制删除所有关联模型...
$flight->history()->forceDelete();

7、查询作用域

全局作用域

全局作用域允许我们为给定模型的所有查询添加条件约束。Laravel 自带的软删除功能就使用了全局作用域来从数据库中拉出所有没有被删除的模型。编写自定义的全局作用域可以提供一种方便的、简单的方式来确保给定模型的每个查询都有特定的条件约束。

编写全局作用域

自定义全局作用域很简单,首先定义一个实现 Illuminate\Database\Eloquent\Scope 接口的类,该接口要求你实现一个方法:apply。需要的话可以在 apply 方法中添加 where 条件到查询:

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class AgeScope implements Scope{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        return $builder->where('age', '>', 200);
    }
}

注:Laravel应用默认并没有为作用域预定义文件夹,所以你可以按照自己的喜好在app目录下创建Scopes目录。

应用全局作用域

要将全局作用域分配给模型,需要重写给定模型的 boot 方法并使用 addGlobalScope 方法:

<?php

namespace App;

use App\Scopes\AgeScope;
use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new AgeScope);
    }
}

添加作用域后,如果使用 User::all() 查询则会生成如下SQL语句:

select * from `users` where `age` > 200

匿名的全局作用域

Eloquent还允许我们使用闭包定义全局作用域,这在实现简单作用域的时候特别有用,这样的话,我们就没必要定义一个单独的类了:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('age', function(Builder $builder) {
            $builder->where('age', '>', 200);
        });
    }
}

我们还可以通过以下方式移除全局作用:

User::withoutGlobalScope('age')->get();

移除全局作用域

如果想要在给定查询中移除指定全局作用域,可以使用 withoutGlobalScope

User::withoutGlobalScope(AgeScope::class)->get();

如果你想要移除某几个或全部全局作用域,可以使用 withoutGlobalScopes 方法:

User::withoutGlobalScopes()->get();
User::withoutGlobalScopes([FirstScope::class, SecondScope::class])->get();

本地作用域

本地作用域允许我们定义通用的约束集合以便在应用中复用。例如,你可能经常需要获取最受欢迎的用户,要定义这样的一个作用域,只需简单在对应Eloquent模型方法前加上一个scope前缀。

作用域总是返回查询构建器实例:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 只包含活跃用户的查询作用域
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopePopular($query)
    {
        return $query->where('votes', '>', 100);
    }

    /**
     * 只包含激活用户的查询作用域
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }
}

使用本地作用域

作用域被定义好了之后,就可以在查询模型的时候调用作用域方法,但调用时不需要加上scope前缀,你甚至可以在同时调用多个作用域,例如:

$users = App\User::popular()->active()->orderBy('created_at')->get();

动态作用域

有时候你可能想要定义一个可以接收参数的作用域,你只需要将额外的参数添加到你的作用域即可。作用域参数应该被定义在$query参数之后:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 只包含给用类型用户的查询作用域
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeOfType($query, $type)
    {
        return $query->where('type', $type);
    }
}

现在,你可以在调用作用域时传递参数了:

$users = App\User::ofType('admin')->get();

8、事件

Eloquent模型可以触发事件,允许你在模型生命周期中的多个时间点调用如下这些方法:creatingcreatedupdatingupdatedsavingsaved,deletingdeletedrestoringrestored。事件允许你在一个指定模型类每次保存或更新的时候执行代码。

基本使用

一个新模型被首次保存的时候,creatingcreated事件会被触发。如果一个模型已经在数据库中存在并调用save方法,updating/updated事件会被触发,无论是创建还是更新,saving/saved事件都会被调用。

举个例子,我们在服务提供者中定义一个Eloquent事件监听器,在事件监听器中,我们会调用给定模型的isValid方法,如果模型无效会返回false。如果从Eloquent事件监听器中返回false则取消save/update操作:

<?php

namespace App\Providers;

use App\User;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider{
    /**
     * 启动所有应用服务
     *
     * @return void
     */
    public function boot()
    {
        User::creating(function ($user) {
            return $user->isValid();
        });
    }

    /**
     * 注册服务提供者.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

观察者

如果你在给定模型中监听多个事件,可以使用观察者来对所有监听器进行分组,观察者类拥有反射你想要监听的Eloquent事件对应的方法名,每个方法接收模型作为唯一参数。Laravel并没有为监听器提供默认目录,所以你可以创建任意目录来存放观察者类:

<?php

namespace App\Observers;

use App\User;

class UserObserver
{
    /**
     * Listen to the User created event.
     *
     * @param  User  $user
     * @return void
     */
    public function created(User $user)
    {
        //
    }

    /**
     * Listen to the User deleting event.
     *
     * @param  User  $user
     * @return void
     */
    public function deleting(User $user)
    {
        //
    }
}

要监听观察者,使用你想要观察模型的observe方法,你可以在某个服务提供者的boot方法中注册观察者,在本例中,我们在AppServiceProvider中注册观察者:

<?php

namespace App\Providers;

use App\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        User::observe(UserObserver::class);
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

WordPress通过文章ID获取文章标题内容等信息

使用Wordpress的朋友可能遇到这样的问题,在非single.php页面中我们有时候想要调用当前文章的标题、内容等信息,而Wordpress在生成文章页的时候在各个页面中唯一不变的只有当前的文章ID,那么如何根据这个ID获取到当前文章的标题、内容等信息呢?可以通过下面的代码实现:

<?php 
$id=//这里是文章的ID 
$title = get_post($id)->post_title;
echo $title;//输出文章的 标题
?>

其他信息可以通过改变get_post($id)->post_title中的post_title来实现:

post_author:(整数)文章作者的编号
post_date:(字符)文章发表的日期和时间(YYYY-MM-DD HH-MM-SS)
post_date_gmt:(字符)文章发表的格林尼治标准时间(GMT) (YYYY-MM-DD HH-MM-SS)
post_content:(字符)文章内容
post_title:(字符)文章标题
post_category:(整数)文章类别的编号。注意:该值在WordPress 2.1之后的版本总为0。定义文章的类别时可使用 get_the_category()函数。
post_excerpt:(字符)文章摘要
post_status:(字符)文章状态(publish|pending|draft|private|static|object|attachment|inherit|future)
comment_status:(字符)评论状态(open|closed|registered_only)
ping_status:(字符)pingback/trackback状态(open|closed)
post_password:(字符)文章密码
post_name:(字符)文章的URL嵌套
to_ping:(字符)要引用的URL链接
pinged:(字符)引用过的链接
post_modified:(字符)文章最后修改时间(YYYY-MM-DD HH-MM-SS)
post_modified_gmt:(字符)文章最后修改GMT时间(YYYY-MM-DD HH-MM-SS)
post_parent:(整数)父级文章编号(供附件等)
guid:(字符)文章的一个链接。注意:不能将GUID作为永久链接(虽然在2.5之前的版本中它的确被当作永久链接),也不能将它作为文章的可用链接。GUID是一种独有的标识符,只是目前恰巧成为文章的一个链接。
post_type:(字符)(日志 | 页面 | 附件)
post_mime_type:(字符)Mime类型(供附件等)
comment_count:(整数)评论总数

dedecms经常出现mysql”连接数据库失败,可能数据库密码不对”解决方案

DEDE 5.5 版本经常出理以下错误

Error page: /dede/xxx

Error infos: DedeCms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器出错

是随机出现并不是一直就这样,这样就可以排除是MYSQL用户名密码设置的问题了。

在网上找了一下基本上可以肯定就是 微软 KB967723 这个补丁所引起来了。

第一种方案

删除 KB967723  补丁 这个不建议大家操作,会引起网络断掉并无法链网的情况。

那我们就用微软件推荐的第二种方案吧

本方法是微软给出的修改注册表修复该Bug的的方法,原因是默认最大的临时 TCP 端口的数是 5000 适用于一节中包含的产品中。 在这些产品中添加一个新参数。 要提高临时端口的上限,请按照下列步骤操作:

1.启动注册表编辑器。
2.在的注册表中找到以下子项,然后单击 参数 :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3.在 编辑 菜单上单击 新建 ,,,然后添加下面的注册表项:
数值名称: MaxUserPort
值类型: DWORD
值数据: 65534
有效范围: 5000-65534 (十进制)
默认值: 0x1388 (5000 十进制)
说明: 此参数将控制程序从系统

微软官方关于这个补丁的说明:  http://support.microsoft.com/kb/q196271

当您试图从大于 5000 的 TCP 端口连接时收到错误 WSAENOBUFS (10055)

建议大家和我们下面导出来的注册表,导进去就可以了

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"MaxUserPort"=dword:0000fffe

把上面的内存COPY起来 复制到记录本中,保存为 .reg 再双击导入就OK了

不过记得重启一下电脑。

WordPress添加文章形式

要让自己的博客支持更多的文章形式,需要在主题的functions.php文件中调用add_theme_surpport()方法。形式如下:

add_theme_support('post-formats', array( 'aside', 'gallery' ));

第一个参数指添加的是文章形式,第二个参数是要添加的文章形式数组。但是只调用这个方法并没有效果,还需要用到WordPress的 add_action()方法,add_action()方法可以将我们自定义的php函数钩入WordPress,相当于激活这个函数。具体代码如下:

add_action('after_setup_theme','custom_post_formats_setup');
    function custom_post_formats_setup(){
    add_theme_support( 'post-formats', array( 'chat', 'image', 'link', 'quote', 'status', 'video', 'audio' ) );
}

add_action()的第一个参数是用到的钩子,第二个参数是自定义方法的名称。

网站第三方社会化插件推荐

 来源: 卢松松博客

从评论系统到分享按钮,从智能推荐插件到社会化登陆,社会化插件已经入侵了网站的方方面面,我就推荐写适合个人网站使用的第三方社会化插件。
搜索引擎认为最有价值的(按先后顺序):

1:内容

2:社会化

3:用户体验

4:链接建设

5:SEO

这是从ZAC博客中分享的一个Bing人员总结的高度浓缩的SEO技术,其实适用于所有搜索引擎。由此可见社会化的重要性。

那么,既然知道了社会化分享的重要性,今天卢松松推荐的插件可以用过一张图来表明。

我们看到,如果网站全权使用第三方社会化插件的话,除了网页基本框架和内容之外,其他功能都可以由插件来完成了。

1:分享插件

现在在各个网站上我们都能见到分享的按钮,目前Jiathis、bshare、百度分享这三款算是很火的分享按钮了。

下面的示意图可以说明分享按钮的作用,例如:通过用户A分享到他的微博下,这样他的粉丝就能看到该网站的内容,从而影响更多的人。

卢松松博客目前用的是Jiathis,因为它出是早,而且可分享的网站也非常多,而且在分享数据分析方面做的也很全面。Bshare还没用过,不过多评论了。

后起之秀,百度分享是很厉害,因为还不清楚百度的分享和它的收录、排名有什么关系,为了保险起见,许多站长都换成百度分享了,而且刷百度分享数的人也不在少数。

2:评论插件

第三方社会化评论系统我在之前的博文中已介绍过,目前评论插件有:评论啦、友言、贝米,和刚刚诞生的“多说”。

它们的功能大多类似,如上图所示,去处装上一段JS代码即可使用,比如社会化登陆、分享按钮、添加图片视频等等,在评论框中一应俱全。而且现在这些社会化评论系统已经支持SEO了,同时评论的数据也支持导入/导出了。

3:智能推荐插件

无觅是一个较早推出智能推荐插件的,我真正使用无觅这个插件还是在去年,因为之前Truman Lam给我推荐了好久。在加上他们的工具确实靠谱,所以我就用上了。智能推荐插件就是可以把同一个网站不同程序下的相关文章聚合到一起,主要是增加相关文 章精准度。同时无觅的“喜欢”功能就类似于分享按钮,可以把“喜欢”的文章推送到绑定的微博中,

友荐:和无觅一样的功能,不过部分还在内测中,它最大的特色就是JS代码只有一行。

需要注意的是友荐、友言已被Jiathis(加网)收购,从“分享按钮”到“智能推荐”再到“评论框”,Jiathis已经形成了一套完整的社会化插件体系。

同时Jiathis推出的趣一网的个性化阅读也与新版无觅网的个性化阅读形成了正面竞争。需要注意的是,只有你的博客安装了其中任何一方插件的用户才可能进入他们自家的热门排行榜,带来流量,二选一,你选吧。

写在最后:

分享按钮,可以让用户帮你推广网站;社会化评论框,可以提交评论、载入速度,方便管理评论;智能推荐插件,可以提高网站PV,增强用户黏性。

它们有很直接有优点,也有最大的缺点:你会发现网页中有一大堆第三方JS,牵一发则动全身。

作者:卢松松 本文地址:http://lusongsong.com/reed/436.html

WordPress子目录Rewrite的404问题

这些天有个问题一直困扰着我,由于我的WordPress是放在网站的根目录下,因此我建立的一些子目录跑一些其他的应用,我发现这些应用被WordPress的.htaccess文件的RewriteRule所干扰,我费了好大劲修改.htaccess文件,使得子目录的文件的RewriteRule可以工作正常,却发现调用子目录的应用总是返回404状态,但是内容却是正常的。

其实,如果建立一个子目录放Discuz论坛,则论坛的RewriteRule也会被干扰,这个问题实在令人困惑,特别是返回404状态后,所有文件将不会被搜索引擎所收录。

经过一番调试和修改,我发现了一个很怪异的方法可以解决这个问题,就是在子目录的PHP文件中加入下面这一行代码:

header(“Status: 200 OK”);

之后我使用一些HTTP Status测试工具测试,该目录和文件就不再返回404状态了,而是返回200状态,之后我会观察一下该子目录在搜索引擎的收录情况,估计应该也会恢复正常了。WordPress的某些特性实在是令人奇怪,搞不懂为什么会是这样。

WordPress 真的飞不起來

来源: Willin Kan的博客

wordpress

或许有人会告诉你:WordPress 是最好的博客程序!是的,不过那已是以前的事了。

您是否觉得 WordPress 越来越臃肿? 再加上几个插件会更形笨拙。就像一部大客车, 起步相当耗油, 而且换档加速相当慢。 当客人一多, 上下车的时间更是拖慢了整个行程。其中最大的好处, 就是您可以在车上轻松睡一觉, 醒来刚好到站。

所有空间商最头痛的还是 WordPress, 严重消耗了大量内存和 CPU, 以下先引用某空间商的一段话:

WordPress is often using too much CPU Usage, which causes the server to slow down.

You‘ll need to get rid of your WordPress installation or look for an alternative, we want all users to note this issue.

大意是说:WordPress 太耗CPU了,您应该换成其它程序。是的,大家都应该换掉,千万别让WordPress 搞垮您的空间。直到最近,反对的声浪越来越烈,WordPress团队是该彻底检讨了。

以前我还说过 WordPress 将是下一个 IE,但没想到竟来的这么快。近四年来我都在挖掘 WordPress,也写了不少代码简化程序。探究越深, 越觉得无趣,因为它用了很多不需要的动作。 绕了一大圈才进城。尤其是后台用了很多外链链接到官网, 有些是rss, 有些是检查更新, 其实这些都没有必要。

以前还曾发现后台的几则新闻的rss竟高达2M,一般用户对这些资料连看都不看,这样rss有何作用?深窥 WordPress的心态,是借机取得PR,用户链接越多PR越高。终究还是个商业手段,为了赚钱?

有个口号:能用代码解决的,绝不用插件,因为插件太耗资源了。WordPress已具备丰富的函式库, 写插件的门槛非常低,连生手也很容易写出个插件。然而,这个插件耗费多少资源,却没人会去过问。记得 All in one 的插件吗? 因为太耗资源,用过的人都后悔了。现在google一下,还是有人在推荐All in one,为什么?

网络资讯应该要即时更新, 那些旧资料就删了吧! 别再误导别人落入陷阱。

顺便提一下 SBO (看不懂的把 B 改成 E),搜索结果都是十几年前的旧资料。 满城尽说 SBO, 殊不知都是狗屁。现在只要文章中提到SBO, 或是链接到SBO的网站,您的网站保証会被降权,因为会被当成作弊。这也难怪我在这边用 SBO 替代字。

时代一直在进步, 旧资料就别再拿出来害人了, 我这边不再提供以前的代码, 为的是各位的服务器, 请各位谅解。不是那些代码不好,而是WordPress 程序核心太大了,不使用任何插件的情况下都有点吃力,何况再加上插件。

就听我的建议,换个博客程序吧!至于改用哪个,可要自己挑了,我不敢推荐。

文章来源:Willin Kan 的博客

WordPress文章ID不连续的解决方法

2012-03-28 16:47  来源: congblog.cn

最近看到有许多朋友提到“WordPress文章ID不连续”怎么办?,其实笔者刚刚接触WordPress的时候就发现了这个问题,所以也是一开始就把WordPress的自动保存以及文章修订版本功能隐蔽。但是固定连接如果不用postid命名的话也许发现不了,但是大葱一直使用的就是这种固定链接。如果你网速不佳的时候,这会影响到文章的编辑以及发表页面的载入速度;另外每一次自动保存的文章草稿它都会自动写入我们的数据库,这样的话无形之中也就大大了数据库的储存,冗余数据太多的话也会影响到数据库的工作效率,另外也就是我们之前提到的文章ID不连续。

WordPress仪表盘并没有直接的提供关闭这个功能的选项,那么今天就给大家讲讲如何把这个功能完完全全的隐蔽掉。

方法1:

WordPress默认是每60秒就会对文章进行自动保存,我个人是觉得太频繁了,那么我们可以打开博客根目录下的wp-config.php文件,搜索“require_once(ABSPATH . ‘wp-settings.php’);”在其前面/上面添加如下代码:

//自动保存10小时一次

define(‘AUTOSAVE_INTERVAL’, 36000);

//取消自动修订版

define(‘WP_POST_REVISIONS’,false);

方法2:

代码来源于国外网站,使用环境:WordPress 3.3.1,原理上 3.0 以上都支持,WP3.0.x 大葱没有进行测试。在我们当前使用主题的 functions.php 文件加入如下代码即可:

/* 取消自动保存和修订版本 */

remove_action(‘pre_post_update’, ‘wp_save_post_revision’);

add_action(‘wp_print_scripts’, ‘disable_autosave’);

function disable_autosave() {

wp_deregister_script(‘autosave’);

}

清理数据库中以前的文章历史修订版本

自动保存和修订版本我们都解决了,接下来我们进行删除数据库中的冗余文章和修订版本,数据库操作之前大葱建议大家先进行备份。我们登录phpmyadmin 中进行数据库管理,SQL语句命令行中写入以下运行代码执行(如果更改了数据库表名的前缀,需要将数据表名称中wp改成你的前缀):

delete from wp_posts where post_type=’revision’;

本文固定链接:http://www.congblog.cn/878.html | 大葱博客

WordPress支持用户以Twitter帐号登录评论

据国外媒体报道,博客网站WordPress.com今日宣布,用户今后可通过登录Twitter或Facebook账户在WordPress网站上发表评论。

分析称尽管表面看来这仅是非常小的新功能,但它同时也为WordPress博客网站提供更多的发表评论的机会。第三方评论系统如Disqus以及Echo等网站目前均允许用户通过Twitter或Facebook账户发表评论,但这一功能对于博客平台网站来说是一个巨大的进步。

WordPress高层斯科特·波尔克(Scott Berkun)在官方博客中表示,新的登录系统可以使用户在同一时间登录不同的服务网站。这对于一些想通过Twitter或Facebook账户发表评论的用户来说非常方便。

据悉,用户通过Twitter或Facebook账户发表的评论将不会在社交网站上显示。该登陆方式仅是WordPress验证用户身份的方式。WordPress将来有可能会允许用户在Facebook或Twitter上分享及发布评论。

WordPress博客用户通过Facebook及Twitter发表的评论将会通过由Automattic开发的JetPack插件进行验证。

修改WordPress语言包的方法和工具

修改或者制作主题的时候,要做到个性十足、称心如意,就需要对Wordpress的语言包进行调整修改。在主题的目录下面语言包文件夹中我们会找到两个文件:zh_CN.po和zh_CN.mo,其中前者是需要编译的中文语言包,在经过编译后生成的文件就是后者,其中.mo文件才是Wordpress可以直接调用的中文语言包。但是.mo文件不能用记事本类的工具直接修改编辑,这时就要用到po-edit了。
这在我们制作中文主题时必备的工具:

1、找到目录的语言包,位置在(这里以inove主题风格为例):

zh_CN.po的位置: \wp-content\themes\inove\languages
zh_CN.mo的位置:\wp-content\themes\inove

2、下载并安装po-edit软件:

软件官方网站:http://www.poedit.net/
安装以后首先是设定软件界面语言,选择chinese(simplified)即可。

3、从软件中选择打开zh_CN.po文件,然后就可以看到各个条目的信息了,找到你想编辑的修改即可。

4、修改后,点击“另存为”找到合适的地方存储即可(po-edit会自动创建生成zh_CN.mo文件)。

5、将这两个文件分别上传到对应的目录(步骤1中所示)覆盖原文件,然后刷新主页看一下吧。

信阳光山大美女,信阳网络电视台美女记者

信阳光山大美女,信阳网络电视台美女记者
中共信阳市第四次代表大会第三次全体代表大会召开_信阳网络电视台…
2011年9月2日…信阳网络电视台9月2日讯 (记者 程芳) 9月2日上午,中国共产党信阳市第四次代表大会第三次全体会议在百花之声会议中心召开。 大会执行主席王铁、郭…
www.xytv.cn/NEWS/shizhengyaowen/2011/0902 … 2011-9-2 – 百度快照
台湾金门高粱酒落户信阳_信阳网络电视台 信阳电视网 视频 新闻 信…
2011年7月12日…开业盛况 信阳电视网(记者 程芳)讯 7 月 9 日上午,金门高粱 两岸飘香台湾金门高粱酒信阳旗舰店开业典礼在行政路经典花园隆重举行,并正面向县区诚征…
www.xytv.cn/NEWS/shizhengxinwen/2011/0709 … 2011-7-12 – 百度快照
中共信阳市第四次代表大会主席团第六次会议召开_信阳网络电视台 …
2011年9月2日…信阳网络电视台9月2日讯 (记者 程芳) 9月2日上午,中国共产党信阳市第四次代表大会主席团第六次会议在百花之声召开。 主席团成员应到 70 名,因…
www.xytv.cn/NEWS/shizhengyaowen/2011/0902 … 2011-9-2 – 百度快照
更多资料请点击信阳网络电视台
芳芳

wordpress模板各文件函数解析

修改主题时发现好多WordPress主题函数都不了解,网上摘抄了一份放在自己博客上,便于以后好找。
在WordPress中如何按你的意愿显示页面,关键看你是否了解WordPress主题模板页面。这里所说的主题文件是指显示页面的主题文件,而非实现评论、侧边栏等功能的主题文件。大多数用户不使用WordPress安装时自带的默认主题,他们会在互联网上下载免费主题。这是一种设计博客版式的好方法,但不是所有主题开发者都用相同的方式编写主题。主题的表现很大程度上取决于开发者用在主题上的开发时间和对WordPress的了解。
下面我会为大家介绍设计主题页面的所有相关知识,通过这些下面的信息你甚至可以开始为自己设计一个主题。除非你是专家级的主题开发者,否则都可以从这里学到些新的东西。
WordPress如何工作
首先需要了解的是WordPress的模板层级,或者说是“WordPress调用页面的顺序”。 “index.php”是唯一一个所有WordPress主题的PHP文件中都必须具备的文件。“index.php”可以执行WordPress的所有单独功能。
每当有WordPress页面被调用时,WordPress的“引擎”会判断(通过排除法)页面的类型。 这类似于询问“我在哪儿?”。 WordPress回答“我在…类型的页面上”,然后以特定顺序调用页面。 WordPress找不到需要的PHP文件时,会使用“index.php”文件来代替所需文件。 WordPress首先会寻找以下九种基本页面:
首页
如果WordPress判断是在首页上,会先调用“home.php”文件然后再调用“index.php”。
日志页
如果是(单篇)日志页,首先调用“single.php”然后默认调用“index.php”。
“页面”页
如果是静态页面或“页面型”页面(应用了模板的页面),WordPress首先调用“pagetemplate.php”然后默认调用“index.php”。
“分类”页
如果WordPress判断是分类页,则首先调用该类别编号的页面,例如“category-7.php”。找不到相应文件时可以查找“category.php”(category.php可以用于所有类别页)。如果没有“category.php”则继续查找“archive.php”,最后默认调用“index.php”。
标签页
如果WordPress判断是标签页,会首先加载“tag-slug.php”文件,以具体的slug(别名)为标签名。如果标签是“wordpress hacks”,那么标签别名页就是“tag-wordpress-hacks.php”。如果加载不成,WP会继续查找“tag.php”文件,该文件可用于所有标签页,然后调用“archive.php”,最后默认调用 “index.php”。
作者页
博客拥有多个作者时,WP会首先寻找“author.php”文件以显示作者详情。如果没有“author.php”则继续查找“archive.php”,最后默认调用“index.php”。
存档页
WP为之前的日志加载信息页面时,同时也加载了存档页。 WP首先加载“date.php”,其次“archive.php”,最后默认加载“index.php”。
搜索页或404页
若WP判断是在搜索结果页或404(页面未找到)页,会尝试加载search.php或404.php文件。如果无法加载search.php或404.php,WP仍然默认加载“index.php”。
附件页
附件页是所有WordPress主题模板页面中使用次数最少的一种页面类型。 WordPress通常用这些特殊的附件页来加载若干信息,这些信息解释首先查找“image.php”, “audio.php”, “video.php”, 以及“application.php”的原因。然后WP查找“attachment.php”或“single.php”,如果这两个文件不可用,默认查找“index.php”。
WP主题模板内部运行情况
可以用单独的index.php文件来调用以上九种类型的页面,这在上面也提到过。也可以在一些条件标签中编写代码,我在这篇文章的结尾部分会告诉大家如何操作。一个页面中可能含有很多代码,有时甚至有些混乱,这样我们要修改代码来进行设计就不太方便了。
不过凑巧的是,就像WordPress查找九种基本页面一样,每个主题模板页面也包含九种基本的WordPress元素:
调用页眉
开启the loop(主循环)
调用永久链接与(若干)meta
用以通知WordPress应获取的信息的调用
用以获取获取文章内容或摘要的调用
(可能有)更多的meta
关闭the loop(主循环)
调用侧边栏
调用页脚
这是WordPress元素,能让这些元素运行的PHP代码分布在不同的地方,让你的主题版面和平面设计保持正常工作。下面我要详细介绍一下这些元素,以便大家进一步了解如何设计主题模板页面。
调用页眉,侧边栏以及页脚
这三种元素基本类似。 当你在模板中看到以下代码:
<?php get_header(); ?>
表明WordPress打开了“header.php”文件。 get_sidebar() (sidebar.php) 和 get_footer() (footer.php)也是同样的道理。你可能会有很多页眉、页脚和侧边栏,这时可以点击上面的“条件标签”查看相关内容。
开启the loop(主循环)
“Wordpress Loop”会在数据库中持续调用文件,直到WordPress终止调用。 “the loop”的结构随显示页面类型而变,WordPress尝试加载的每个基本类型页面都有一个“loop”。
下面是开启the loop的代码:
<?php if ( have_posts() ) : <?php if ( have_posts() ) : the_post(); ?>
我们可以看到,代码被拆分开来,have_posts用以定义条件标签,while和the_post则各成一部分,但这仍然是the loop,在所有页面中基本都是这样。 多行loop时的一个用法是:用query_posts在“if have_posts”和代码的剩余部分之间放置一个参数,用来显示单篇文章、某一时段的文章、最近一篇文章或者某一类别中的文章,也可以改变the loop中迭代文章的顺序。
调用永久链接与(若干)meta
通过the loop的每次迭代,开放The loop的最后部分(the_post)能够激活元素数据。这里的个体数据通常是指“post meta”,尤其是永久链接(URL)、标题、时间这样的meta。大多数主题会在单篇文章内容前显示一些信息,然后在文章内容后也显示一些信息——比如文章类别和标签。
下面是一些你可以在post meta中调用的内容: the_permalink, the_ID, the_title, the_time, the_author, the_author_email, the_author_posts_link, the_category, single_cat_title, the_tags, single_tag_titls, edit_post_link, comments_popup_link, comments_rss_link
下面是Post meta的代码示例:
<div class=”post” id=”post-<?php the_ID(); ?>”>
<h2><a href=”<?php the_permalink() ?>” rel=”bookmark”><?php the_title(); ?></a></h2>
</div>
用以通知WordPress应获取的信息的调用
之后WordPress会决定所显示的单篇文章内容的详细程度。文章详细程度取决于你的主题使用的是“the_content”(显示全文)或“the_excerpt”(显示摘要)。
(可能有)更多的meta
上面提到过,文章下方都有指定的类别或标签,有时你还可能看到“edit”链接。 一些主题甚至在文章内容后添加了date published meta。
关闭the loop(主循环)
代码如下:
<?php else : ?>
<?php endif; ?>
这是一个多行代码,你可以在其中添加其它信息,例如“Sorry, we didn’t find anything”。你可以在侧边栏之后、调用侧边栏和页脚之前找到“next”“previous”导航链接。
Loops
大多数loops与我在上面所举的例子都差不多,但这并不表示你不能随意修改这些loops。 推荐大家阅读WP Codex上的文章The Loop in Action,文章中列举了存档、类别以及单篇文章以及静态首页中的the loop。
WP Codex上the loop中也有一些在同一页面上放置多个loop的示例。 Perishable Press上有一篇关于多loop,多栏内容的精彩教程。 Perishable Press上还有一些很好的loop模板,以及一篇关于两栏水平序列文章的教程。
(一)WordPress基本模板文件,一套完整的WordPress模板包括如下文件,但是只有index.php和style.css是不能缺少的:
style.css : CSS(样式表)文件,不可缺少版权部分,真正CSS样式表可以放在其他文件;
index.php : 主页模板,不可缺少;
archive.php : Archive/Category模板,如果缺少,默认为index.php的显示;
404.php : Not Found 错误页模板,如果缺少,默认为index.php的显示;
comments.php : 留言/回复模板,不可缺少;
footer.php : Footer模板,可合并到index.php;
header.php : Header模板,可合并到index.php;
sidebar.php : 侧栏模板,可合并到index.php;
page.php : 内容页(Page)模板,如果缺少,默认为index.php的显示;
single.php : 内容页(Post)模板,如果缺少,默认为index.php的显示;
searchform.php : 搜索表单模板,可合并到index.php;
search.php : 搜索结果模板,如果缺少,默认为index.php的显示;
(二)基本条件判断Tag
is_home() : 是否为主页
is_single() : 是否为内容页(Post)
is_page() : 是否为内容页(Page)
is_category() : 是否为Category/Archive页
is_tag() : 是否为Tag存档页
is_date() : 是否为指定日期存档页
is_year() : 是否为指定年份存档页
is_month() : 是否为指定月份存档页
is_day() : 是否为指定日存档页
is_time() : 是否为指定时间存档页
is_archive() : 是否为存档页
is_search() : 是否为搜索结果页
is_404() : 是否为 “HTTP 404: Not Found” 错误页
is_paged() : 主页/Category/Archive页是否以多页显示
(三)Header部分常用到的PHP函数
<?php bloginfo(’name’); ?> : 博客名称(Title)
<?php bloginfo(’stylesheet_url’); ?> : CSS文件路径
<?php bloginfo(’pingback_url’); ?> : PingBack Url
<?php bloginfo(’template_url’); ?> : 模板文件路径
<?php bloginfo(’version’); ?> : WordPress版本
<?php bloginfo(’atom_url’); ?> : Atom Url
<?php bloginfo(’rss2_url’); ?> : RSS 2.o Url
<?php bloginfo(’url’); ?> : 博客 Url
<?php bloginfo(’html_type’); ?> : 博客网页Html类型
<?php bloginfo(’charset’); ?> : 博客网页编码
<?php bloginfo(’description’); ?> : 博客描述
<?php wp_title(); ?> : 特定内容页(Post/Page)的标题
(四)模板常用的PHP函数及命令
<?php get_header(); ?> : 调用Header模板
<?php get_sidebar(); ?> : 调用Sidebar模板
<?php get_footer(); ?> : 调用Footer模板
<?php the_content(); ?> : 显示内容(Post/Page)
<?php if(have_posts()) : ?> : 检查是否存在Post/Page
<?php while(have_posts()) : the_post(); ?> : 如果存在Post/Page则予以显示
<?php endwhile; ?> : While 结束
<?php endif; ?> : If 结束
<?php the_time(’字符串’) ?> : 显示时间,时间格式由“字符串”参数决定,具体参考PHP手册
<?php comments_popup_link(); ?> : 正文中的留言链接。如果使用 comments_popup_script() ,则留言会在新窗口中打开,反之,则在当前窗口打开
<?php the_title(); ?> : 内容页(Post/Page)标题
<?php the_permalink() ?> : 内容页(Post/Page) Url
<?php the_category(’,’) ?> : 特定内容页(Post/Page)所属Category
<?php the_author(); ?> : 作者
<?php the_ID(); ?> : 特定内容页(Post/Page) ID
<?php edit_post_link(); ?> : 如果用户已登录并具有权限,显示编辑链接
<?php get_links_list(); ?> : 显示Blogroll中的链接
<?php comments_template(); ?> : 调用留言/回复模板
<?php wp_list_pages(); ?> : 显示Page列表
<?php wp_list_categories(); ?> : 显示Categories列表
<?php next_post_link(’%link’); ?> : 下一篇文章链接
<?php previous_post_link(’%link’); ?> : 上一篇文章链接
<?php get_calendar(); ?> : 日历
<?php wp_get_archives() ?> : 显示内容存档
<?php posts_nav_link(); ?> : 导航,显示上一篇/下一篇文章链接
<?php include(TEMPLATEPATH . ‘/文件名’); ?> : 嵌入其他文件,可为定制的模板或其他类型文件
(五)与模板相关的其他函数
<?php the_search_query(); ?> 搜索表单的值
<?php _e(’Message’); ?> : 输出相应信息
<?php wp_register(); ?> : 显示注册链接
<?php wp_loginout(); ?> : 显示登录/注销链接
<?php wp_meta(); ?> 显示管理员的相关控制信息(为插件API HOOK用)
<!–next page–> : 将当前内容分页
<!–more–> : 将当前内容截断,以不在主页/目录页显示全部内容
<?php timer_stop(1); ?> : 网页加载时间(秒)
<?php echo get_num_queries(); ?> : 网页加载查询量
显示最新文章
<?php query_posts(’showposts=5′); ?>
<ul>
<?php while (have_posts()) : the_post(); ?>
<li><a href=”<?php the_permalink() ?>”><?php the_title(); ?></a></li>
<?php endwhile;?>
</ul>
显示最新评论
<?php global $wpdb; $sql = “SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url, SUBSTRING(comment_content,1,30) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = ‘1′ AND comment_type = ” AND post_password = ” ORDER BY comment_date_gmt DESC LIMIT 10″; $comments = $wpdb->get_results($sql); $output = $pre_HTML; $output .= “\n<ul>”; foreach ($comments as $comment) { $output .= “\n<li>”.strip_tags($comment->comment_author) .”:” . “<a href=\”” . get_permalink($comment->ID) . “#comment-” . $comment->comment_ID . “\” title=\”on ” . $comment->post_title . “\”>” . strip_tags($comment->com_excerpt) .”</a></li>”; } $output .= “\n</ul>”; $output .= $post_HTML; echo $output;?>
显示热评文章
<?php $result = $wpdb->get_results(”SELECT comment_count,ID,post_title FROM $wpdb->posts ORDER BY comment_count DESC LIMIT 0 , 10″); foreach ($result as $topten) { $postid = $topten->ID; $title = $topten->post_title; $commentcount = $topten->comment_count; if ($commentcount != 0) { ?>
<li><a href=”<?php echo get_permalink($postid); ?>” title=”<?php echo $title ?>”><?php echo $title ?></a></li>
<?php } } ?>
显示文章分类
<h2>Categories</h2>
<ul><?php wp_list_cats(’sort_column=name’); ?></ul>
显示归档
<h2>Archives</h2>
<ul><?php wp_get_archives(’type=monthly’); ?></ul>
在侧栏显示页面列表
<h2>Pages</h2>
<ul><?php wp_list_pages(’title_li=’); ?></ul>
调用Gravatar(只适应2.5以上)
<?php if(function_exists(’get_avatar’)){ echo get_avatar($comment, ‘50?);} ?>
显示友情链接
<ul><?php get_links_list(); ?></ul>
显示管理员链接
<ul><?php wp_register(); ?>
<li><?php wp_loginout(); ?></li>
<li><a href=”http://www.wordpress.org/”>WordPress</a></li>
<?php wp_meta(); ?>
<li><a href=”http://validator.w3.org/check?uri=referer”>XHTML</a></li>
</ul>
在侧栏显示页面的子页面
<?php$children = wp_list_pages(’title_li=&child_of=’.$post->ID.’&echo=0′);if ($children) { ?>
<ul><?php echo $children; ?></ul>
<?php } ?>
显示Wordpress标签
<?php the_tags(); ?>
显示Wordpress标签云
<?php wp_tag_cloud(’smallest=8&largest=36&’); ?>
模板标题
<?php ?>
动态标题标签
<title><?phpif (is_home()) { echo bloginfo(’name’); } elseif (is_404()) { echo ‘404 Not Found’; } elseif (is_category()) { echo ‘Category:’; wp_title(”); } elseif (is_search()) { echo ‘Search Results’; } elseif ( is_day() || is_month() || is_year() ) { echo ‘Archives:’; wp_title(”); } else { echo wp_title(”); } ?></title>
在独立页面中运行PHP
<?php if ( is_home() ) { include (’file.php’); } ?>
结论
只要掌握了一点这方面的知识,你就可以随意修改任何WordPress主题模板页面了。现在你已经充分了解了WordPress的页面和the loop的运行,就可以征服任何难题了。现在就开始你的博客主题设计之旅吧!