wordpress functions.php 在哪,在functions.php中定义变量并在WordPress中的函数钩子中访问它们...

我想更详细地了解Wordpress结构.正如我所知,使用全局关键字并不是一个好主意.

这是我想要完成的:

Inside 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作为参数,但我想设置一个很大的变量列表,我将在不同的函数中使用,我认为通过这么大的列表并不是一个好主意.参数.

解决方法:

这里只是一些想法.真的,这是一个“范围”问题比什么都重要.

使用

只需使用封闭的使用部分:

$affID = '12334'; //defining a variable

add_shortcode('affiliate_link', function() use ($affID){

$newLink = 'https://example.com?id=' . $affID;

return $newLink;

});

当我看到关闭时,我感到非常高兴,这可能是最简单的方法.

另一种方法是使用类实例维护它的状态(如果你真的想要,你可以做静态).如果您需要以任何方式使用此功能的类或一般联盟系统,这是有道理的.然后你就可以解决这个问题了,没什么大不了的:

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']);

全球

最不可取的是使用全局,我个人厌恶并且从不使用它们(但我认为这是一个选项). Globals很糟糕,因为找出(或跟踪)它们被设置(或修改)的位置可能是一个真正的挑战,这使得调试它成为一项真正的苦差事.

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中.我可能会去用户meta,因此它链接到用户帐户.但是,如果它是网站的全球价值,你可以使用选项设置的东西(我不得不看一下,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;

});

我使用了上面的提取,这是一个有趣的PHP函数.我不会推荐它,因为它可以污染你的变量,并且存在一些安全问题.

Import variables from an array into the current symbol table.

Checks each key to see whether it has a valid variable name. It also checks for collisions with existing variables in the symbol table.

Warning

Do not use extract() on untrusted data, like user input (e.g. $_GET, $_FILES).

基本上它需要[‘id’=>’12345’]并创建一个名为$id的变量,其值为12345(在此示例中).你不必使用它,我通常会避免使用它.但我认为在这个例子中使用它会很有趣.

其他想法

另外一个想法是,我将返回整个链接而不仅仅是href.所以不要这样做

Link

你会这样做:

[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 = ''.$content.'';

return $newLink;

});

//this shortcode

//[affiliate_link id="12345" ]Link[/affiliate_link]

//generates this link

//Link

也就是说,我不知道这是否只能用于链接,图像等等.所以我只是想为了完整性而添加它.

真的,这取决于你如何使用它,ID是如何“静态”的.它是特定于站点,特定于用户,是否可以动态更改……?

对不起,这太久了,我刚刚写了4个wordpress插件,添加了简单的短代码…大声笑.所以我最近才考虑他们.我真的很喜欢短代码.

希望有所帮助.

标签:wordpress,php

来源: https://codeday.me/bug/20190622/1261788.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值