我试图更详细地了解Wordpress的结构。根据我的建议,使用global
关键字不是一个好主意。
这是我要完成的工作:
内置functions.php
$affID = '12334'; //defining a variable
add_shortcode('affiliate_link', function() {
$newLink = 'https://example.com?id=' . $affID;
return $newLink;
}
运行简码时,我只得到其中的https://example.com?id=
部分。
当然,我可以将$affID
作为参数传递,但是我想设置一个很大的变量列表,以供在不同的函数中使用,而我认为传递这样的变量不是一个好主意。大量的论证。
答案 0 :(得分:4)
这里只是一些想法。确实,这是一个“范围”问题,而不是其他任何问题。
使用
仅使用闭包的use
部分:
$affID = '12334'; //defining a variable
add_shortcode('affiliate_link', function() use ($affID){
$newLink = 'https://example.com?id=' . $affID;
return $newLink;
});
当我看到关闭的消息时,我真的很高兴,这可能是最简单的方法。
CLASS
另一种方法是使用类实例维护它的状态(如果您确实想这样做,可以将其静态处理)。如果您需要为该功能或一般会员系统使用任何类的类,这将很有意义。然后,您可以轻松解决此问题:
class foo{
protected $affID = '12334';
public function affiliate_link_callback(){
$newLink = 'https://example.com?id=' . $this->affID;
return $newLink;
}
}
//to use a class as a call back it works like call_user_func, [obj, method]
add_shortcode('affiliate_link', [new foo, 'affiliate_link_callback']);
全球
最不希望的是使用global
,我个人讨厌它,并且从不使用(但我想这是一个选择)。全局变量很糟糕,因为找出(或跟踪)它们的设置(或修改)位置可能是一个真正的挑战,这使得调试它成为一件繁琐的事情。
global $affID;
$affID = '12334'; //defining a variable
add_shortcode('affiliate_link', function(){
global $affID;
$newLink = 'https://example.com?id=' . $affID;
return $newLink;
});
恒定
您可以将其定义为常量,只有在代码的其他部分中大量使用它时,这才有意义,因为它使维护更加容易。在多个地方都需要此ID并非没有可能,并且常量为您提供了一种全局方式来处理它。也可以想象您不会在运行时修改它。最好使用“全局”,因为它无法在运行时进行更改,因此可以避免跟踪代码中更改的位置(因为不能更改),从而消除了问题。因此,它当然有其自身的局限性。无论如何,这很简单:
define('AFF_ID','12334'); //defining a variable
add_shortcode('affiliate_link', function(){
global $affID;
$newLink = 'https://example.com?id=' . AFF_ID;
return $newLink;
});
数据库
最后,取决于$affID
是什么,您可以将其存储在wordpress DB中。我可能会选择用户元,因此它已链接到用户帐户。但是,如果这是该站点的全局值,则可以使用options设置东西代替(尽管我必须对此进行检查,example)。不要在此代码上引用我,因为我确实忘记了get_user_meta
返回的内容,但是我知道您几乎应该总是返回一个值(第三个arg应该为true)
add_shortcode('affiliate_link', function(){
$meta = get_user_meta(get_current_user_id(), 'affiliate_id', true);
$newLink = 'https://example.com?id=' . $meta['affiliate_id'];
return $newLink;
});
当然,在最后一个示例中,您必须保存数据,但是我相信您可以弄清楚。
SHORTCODE ATTR
我认为您在问题中提到了这一点,但是您也可以将其作为简码的一部分发送:
add_shortcode('affiliate_link', function($attr){
extract(shortcode_atts( array(
'id' => false,
), $atts, 'affiliate_link' ));
if(!$affiliate_id) return '';
$newLink = 'https://example.com?id='.$id;
return $newLink;
});
我在上面使用了extract
,这是PHP具有的一个有趣的小功能。我不会推荐所有方法,因为它会污染您的变量,并且存在一些安全问题。
http://php.net/manual/en/function.extract.php
将数组中的变量导入到当前符号表中。
检查每个键是否具有有效的变量名。它还检查与符号表中现有变量的冲突。 警告
请勿在不受信任的数据上使用extract(),例如用户输入(例如$ _GET,$ _ FILES)。
基本上,它使用['id'=>'12345']
并创建一个名为$id
的变量,其值为12345
(在此示例中)。您不必使用它,我通常会避免使用它。但我认为在此示例中使用会很有趣。
其他想法
另一个想法是,我将完整返回链接,而不仅仅是返回href
。所以不要这样做
<a href="[affiliate_link]">Link</a>
您可以这样做:
[affiliate_link]Link[/affiliate_link]
// [affiliate_link id="12345" ]Link[/affiliate_link]
主要原因是在第一种情况下,如果您的短代码失败,则会在页面上留下无用的链接。除非他们密切注意实际的链接目标,否则用户将无法告知。但是,如果您生成整个链接而失败,则页面上不会放置任何内容。这对于没有会员ID的用户也很有效(如果您使用用户元示例,并且已将其链接到该用户)。在这种情况下,如果他们没有会员ID,则链接不会显示任何内容,但是如果链接没有,则链接将不会显示任何内容。正如我提到的,如果您将链接放在帖子中,然后他们没有链接,您仍然会得到一个链接,但目的地是空的(希望如此)。
如果您这样做,那么我还将在链接文本中添加内容。使用上一个示例(上面):
add_shortcode('affiliate_link', function($attr, $content=''){
extract(shortcode_atts( array(
'id' => false,
), $atts, 'affiliate_link' ));
if(!$affiliate_id) return '';
$newLink = '<a href="https://example.com?id='.$id.'">'.$content.'</a>';
return $newLink;
});
//this shortcode
//[affiliate_link id="12345" ]Link[/affiliate_link]
//generates this link
//<a href="https://example.com?id=123345">Link</a>
也就是说,我不知道是否只能在链接,图像等中使用它。因此,为了完整性起见,我只想添加它。
这取决于您的使用方式以及ID的“静态”程度。它是特定于站点的,特定于用户的,是否可以动态更改等...?
很抱歉,时间太长,我最近才写了4个wordpress插件,它们添加了简单的简码...大声笑。所以我最近才在考虑它们。我真的很喜欢简码。
希望有帮助。