方法使用详解,在WordPress中实现评论头像的自定

作者: 新金沙平台  发布:2019-07-14

可以在对象类中定义一个__clone()方法来调整对象的克隆行为。此方法的代码将在克隆操作期间执行。除了将所有现有对象成员复制到目标对象之外,还会执行__clone()方法指定的操作。下面修改Corporate_Drone类,增加以下方法:

今天,同事突然告诉我,我写的一个做计划任务的php脚本执行总是不成功。

自定义 WordPress 默认评论头像 对于没有设置Gravatra头像的评论者来说,WordPress会显示一个你在后台设置的默认头像,可以是神秘人、空白、默认的Gravatar 标志等等。但是这些头像有一个共同的不足之处,就是不怎么美观,可看性不强!打个比方,如果你去一个博客阅读文章,但当你放心评论文章的读者头像都是小怪物、复古等一系列WordPress自动生成的“不堪入目”的头像时,你还有很浓的兴趣去阅读这个博客的文章吗?我想答案是肯定的!那么,你有没有想过,自己设计或找一个属于你博客、适合你博客的默认WordPress头像那?好了,周良就不吊大家的胃口了,让我来说一下如何不使用插件实现自定义WordPress默认评论头像的方法。

function __clone() { 
 $this->tiecolor = "blue";
}

  脚本本身很简单,里面只有包含了几个库文件并执行了一个函数,函数应该没有错误,这个函数在别处也调用过,没有问题。我在本地用浏览器访问页面,执行成功,看来没有问题,我有点怀疑是同事的计划任务的问题。我又打开命令行,用php直接执行脚本,这回报错了,是require 包含文件错误,看来是路径不对。

方法很简单,将下面我提供的这段代码放在你正在使用的主题functions.php文件中。

之后,创建一个新的Corporate_Drone对象,增加employeeid成员的值,克隆这个对象,然后输出一些数据,从而显示克隆对象的tiecolor确实是通过__clone()方法设置的。示例代码:

  不明白是什么原因引起的,只是从报错来看是路径不对,我猜测是跟相对路径有关,于是把相对路径的全部改成绝对路径,再执行,问题解决。

<?php
// Make a new default gravatar available on the dashboard
function newgravatar ($avatar_defaults) {
$myavatar = get_bloginfo('template_directory') . '/images/tweaker.jpg';
$avatar_defaults[$myavatar] = "Tweaker";
return $avatar_defaults;
}
add_filter( 'avatar_defaults', 'newgravatar' );
?>
<?php
 // Create new corporatedrone object
  $drone1 = new corporatedrone();

 // Set the $drone1 employeeid member
  $drone1->setEmployeeID("12345");

 // Clone the $drone1 object
  $drone2 = clone $drone1;

 // Set the $drone2 employeeid member
  $drone2->setEmployeeID("67890");

 // Output the $drone1 and $drone2 employeeid members
  echo "drone1 employeeID: ".$drone1->getEmployeeID()."<br />";
  echo "drone2 employeeID: ".$drone2->getEmployeeID()."<br />";
  echo "drone2 tiecolor: ".$drone2->getTiecolor()."<br />";
?>

  在百度上搜索之后,知道是用php执行脚本时,执行脚本的位置是当前执行php命令的路径,所以相对路径就不对了。解决问题的办法有两个:

上面代码中的/images/tweaker.jpg就是自定义默认头像的相对路径,你可以自行修改图片的地址。建议将头像放到你正在使用的主题images文件下面。

程序运行结果

  一、改用绝对路径,这个比较麻烦,所有包含的文件包括直接包含的文件里包含的文件路径,有一个不对就有可能出错,所以只有当执行文件比较简单的时候可用。

延迟加载 WordPress 评论头像
修改 HTML 结构

drone1 employeeID: 12345
drone2 employeeID: 67890
drone2 tiecolor:

  二、使用chdir函数,改变当前执行目录,把目录改为文件所在目录,chdir(dirname(__FILE__));

因为前面说到在新式浏览器中的问题, 我们不能再用一般书写 HTML 图片的方式, 而是要将占位符写到 src 属性, 而将真正的图片地址写在 data-original 属性上. 所以 WordPress 头像代码结构应该是下面这样的.

再来一个小例子:

最后,简单介绍下PHP的cli命令行模式吧

<img class="avatar" src="占位符图片.gif" data-original="头像图片.jpg" />
<?php
class Fruit {
 private $name = "水果";
 private $color = "颜色";

 public function setName($name){
 $this->name = $name;
 }

 public function setColor($color){
 $this->color = $color;
 }

 function showColor(){
 return $this->color.'的'.$this->name."<br />";
 }

 function __destruct(){
 echo "被吃掉了(对象被回收) <br />"; 
 }
}

$apple = new Fruit();
$apple->setName("大苹果");
$apple->setColor("红色");
echo $apple->showColor();

$clone_apple = $apple;
$clone_apple->setName("小苹果");
$clone_apple->setColor("青色");

echo $clone_apple->showColor();
?>

首先,进入PHP的CLI(Command line interface) mode

在 WordPress 中, 本来输出头像如下.

上面只是将一个类赋值给另一个类,所以此时内存中仍是一个对象。

cyguin-> $ ./php --ini(显示配置文件信息)
<?php echo get_avatar($comment); ?>
<?php
class Fruit {
 private $name = "水果";
 private $color = "颜色";

 public function setName($name){
 $this->name = $name;
 }

 public function setColor($color){
 $this->color = $color;
 }

 function showColor(){
 return $this->color.'的'.$this->name."<br />";
 }

 function __destruct(){
 echo "被吃掉了(对象被回收) <br />"; 
 }
 function __clone(){
 $this->name = "克隆水果"; 
 }
}

$apple = new Fruit();
$apple->setName("大苹果");
$apple->setColor("红色");
echo $apple->showColor();

$clone_apple = clone $apple;
$clone_apple->setColor("青色");

echo $clone_apple->showColor();
?>

将显示:

现在需要改为适合 Lazy Load 插件的结构如下.

clone方法克隆出了一个新的类,所以此时内存中有两个对象。

configuration file(php.ini) path: c:/Windows
Loaded configuration file: c:/wamp/bin/php/php5.3.0/php.ini
scan for additional .ini files in: (none)
additional .ini files parsed: (none)
<?php echo '<img class="avatar" src="占位符图片.gif" alt="图片 1" data-original="' . preg_replace(array('/^. (src=)("|')/i', '/("|')sclass=("|'). $/i'), array('', ''), get_avatar($comment)) . '" />'; ?>

php的__clone()方法对一个对象实例进行的浅复制,对象内的基本数值类型进行的是传值复制,而对象内的对象型成员变量,如果不重写__clone方法,显式的clone这个对象成员变量的话,这个成员变量就是传引用复制,而不是生成一个新的对象.如下面一个例子的第28行注释所说

$./php --help (会显示PHP具体信息)
$./php --rf <name> (显示<name>函数的信息)
$./php --fc <name> (显示<name>类的信息)
$./php --re <name> (显示<name>扩展的信息)
$./php --ri <name> (显示<name>扩展的配置)

这里建议使用 loading 图片或者默认头像作为占位符图片.

<?php
  class Account {
    public $balance;

    public function __construct($balance) {
      $this->balance = $balance;
    }
  }

  class Person {
    private $id;
    private $name;
    private $age;
    public $account;

    public function __construct($name, $age, Account $account) {
      $this->name = $name;
      $this->age = $age;
      $this->account = $account;
    }

    public function setId($id) {
      $this->id = $id;
    }

    public function __clone() {  #复制方法,可在里面定义再clone是进行的操作
      $this->id = 0;
      $this->account = clone $this->account;  #不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改
    }
  }

  $person = new Person("peter", 15, new Account(1000));
  $person->setId(1);
  $person2 = clone $person;

  $person2->account->balance = 250;

  var_dump($person, $person2);

 ?>

$./php -l <file> : 检查语法
如:$./php -l c:/wamp/www/1.php 
运行结果: No Syntax errors detected in xxx

添加 Lazy Load 支持

本文由新金沙平台发布于新金沙平台,转载请注明出处:方法使用详解,在WordPress中实现评论头像的自定

关键词: 新金沙平台