在functions.php中定义变量,并在Wordpress中的函数挂钩中访问它们

时间:2018-09-30 05:01:07

标签: php wordpress

我试图更详细地了解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作为参数传递,但是我想设置一个很大的变量列表,以供在不同的函数中使用,而我认为传递这样的变量不是一个好主意。大量的论证。

1 个答案:

答案 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插件,它们添加了简单的简码...大声笑。所以我最近才在考虑它们。我真的很喜欢简码。

希望有帮助。