- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试修改一个 wordpress 插件以采用自定义类别。因此,当调用 random_post_link 时,我可以使用 random_post_link('Random Link',3) 添加自定义类别。 3 是类别名称。
下面的插件如何创建类 Random_Post_Link 的新对象?我以为您通过执行以下操作创建了新对象:
$a = new random_post_link;
但我没有在插件中看到它。我认为它通过使用钩子(Hook)在 init 函数中创建了新对象:
add_action('init', array(CLASS, 'jump'));
如果是这样的话,如何给跳转函数加参数呢?
我想我知道 add_action 是如何工作的,第二个参数应该是函数名,如何“array(CLASS, 'jump')” 有效吗?
插件的完整代码如下:
function random_post_link($text = 'Random Post',$the_cat = 36) {
printf('<a href="%s">%s</a>', get_random_post_url(), $text);
$the_category = $the_cat;
}
function get_random_post_url() {
return trailingslashit(get_bloginfo('url')) . '?' . Random_Post_Link::query_var;
}
class Random_Post_Link {
const query_var = 'random';
const name = 'wp_random_posts';
public $the_category;
function init() {
add_action('init', array(__CLASS__, 'jump'));
// Fire just after post selection
add_action('wp', array(__CLASS__, 'manage_cookie'));
}
// Jump to a random post
function jump() {
if ( ! isset($_GET[self::query_var]) )
return;
$args = apply_filters('random_post_args', array(
'post__not_in' => self::read_cookie(),
));
$args = array_merge($args, array(
'orderby' => 'rand',
'cat' => $the_category,
'showposts' => 1,
));
$posts = get_posts($args);
if ( empty($posts) ) {
self::update_cookie(array());
unset($args['post__not_in']);
$posts = get_posts($args);
}
if ( empty($posts) )
wp_redirect(get_bloginfo('url'));
$id = $posts[0]->ID;
wp_redirect(get_permalink($id));
die;
}
// Collect post ids that the user has already seen
function manage_cookie() {
if ( ! is_single() )
return;
$ids = self::read_cookie();
$id = $GLOBALS['posts'][0]->ID;
if ( count($ids) > 200 )
$ids = array($id);
elseif ( ! in_array($id, $ids) )
$ids[] = $id;
self::update_cookie($ids);
}
private function read_cookie() {
return explode(' ', @$_COOKIE[self::name]);
}
private function update_cookie($ids) {
setcookie(self::name, trim(implode(' ', $ids)), 0, '/');
}
}
Random_Post_Link::init();
最佳答案
一些 WordPress 作者使用 PHP 中的类结构来基本上减少全局变量。该类是某种“单例”,因此通常不会实例化(代码在底部调用 Random_Post_Link::init();
)。类函数被视为类成员,而不是实例成员,例如,有点像其他语言中的 Math.max()。
__CLASS__
php 关键字只是当前类的标记,因此在传递时,可调用对象变为 Random_Post_Link::method()
或 array( ' Random_Post_Link', '方法')
如果您需要取消 Hook ,请尝试 remove_action( 'init', array( 'Random_Post_Link, 'jump' ) );
(另请注意,以这种方式使用的方法应声明为 static function jump() {...}
)
附言进一步说明:
http://php.net/manual/en/language.types.callable.php
array('class', 'function')
语法是 PHP 的东西,而 WordPress 操作需要一个 callable
,它可以是任何 PHP 可调用的东西。
关于php - array(__CLASS__, 在 wordpress 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3732083/
在 Python 的文档中 __class__被描述为一个属性。在对象中 type (元类),__class__似乎是一种方法。 如果我们这样做: >>> class Foo: pas
我有一系列的类,它们都继承自共享一个基类的几个可能的父类中的一个。每个类都有一个基于基类 parameters 的类作用域 Dict[str, object] parameters from copy
这个问题在这里已经有了答案: Why doesn't 2.__add__(3) work in Python? (2 个答案) 关闭 3 年前。 整数是唯一不支持.__class__操作的类型吗?例
我最近正在单步调试 CPython 源代码,特别是查看 symbol table entry编译期间的一个类。 我遇到了 typedef struct _symtable_entry 的以下条目结构:
我想测试一个对象是否是一个类的实例,并且只有这个类(没有子类)。我可以这样做: obj.__class__ == Foo obj.__class__ is Foo type(obj) == Foo t
有以下服务器代码(我正在定义一个继承自套接字的类,并尝试使用该类调用客户端套接字上的发送方法): import socket class LogSocket(socket.socket): d
python 依赖于 cell 中的 __class__ 变量来进行 super() 调用。它从第一个堆栈帧中的free 变量获取此单元格。 奇怪的是,这个变量不在 locals() 中,而是在您从
我对设置对象的属性和在对象的 __class__ 属性上设置属性之间的区别感到有点困惑。粗略地说,obj.attr 与 obj.__class__.attr。它们有什么区别? 前者是在一个实例上设置一
在 pinax Userdict.py 中: def __getitem__(self, key): if key in self.data: return s
这个问题在这里已经有了答案: How to avoid infinite recursion with super()? (1 个回答) 关闭 5 年前。 我在 WTForms 中处理继承。我有下一
Django 源代码: def new_method_proxy(func): def inner(self, *args): if self._wrapped is empt
使用 __class__ 在类中创建新实例是个好主意吗? 以下代码是执行此操作的示例: from collections import namedtuple _Position = namedtupl
我希望能够做到: >>> class a(str): ... pass ... >>> b = a() >>> b.__class__ = str Traceback (most recent
我有一个关于 python 中的 __class__ 的问题。 文档说 __class__ 是类实例所属的类。于是我进行了一系列的实验: class counter: count = 0
也许这是一个微不足道的问题。在 python 下,为什么 self.__class__.__bases__ 没有回溯到 object?我的只显示了类(class)之上的单亲 parent 的元组。 最
我创建了这样的类来解决签名和 feature_names 的问题: import copy from sklearn.feature_selection import VarianceTreshold
我已阅读 Why is Python 3.x's super() magic?并了解在方法中使用 super 或 __class__ 会自动为该方法创建一个 __class__ 单元格变量: clas
我需要从类中获取类名: class Cls: notation = None def __init__(self): notation = self.__class__
我试图通过从该类派生并覆盖/添加某些方法来扩展用 C 编写的模块类的功能*。 问题是他的模块创建了我试图在不同地方扩展的类的实例。因此,我需要创建一个转换方法,将模块提供的基类转换为我自己的具有附加功
class Foo: pass >>> f = test.Foo() 让我们看看类实例...... >>> dir(f) ['__add__', [__class__] ...] 哦哦!让我们看看
我是一名优秀的程序员,十分优秀!