需要自定义功能才能在整个WordPress中访问

时间:2018-07-30 04:08:51

标签: wordpress function notifications call

我具有此通知功能,需要在代码的不同位置调用它。我需要将其放置在子主题以及plugins目录中的任何文件都可以访问的位置。

function send_notification($tokens, $message)
{
    $url = 'https://fcm.googleapis.com/fcm/send';
    $fields = array(
         'registration_ids' => $tokens,
         'data' => $message
        );
    $headers = array(
        'Authorization:key = My_Token',
        'Content-Type: application/json'
        );

   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_POST, true);
   curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);  
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
   $result = curl_exec($ch);           
   if ($result === FALSE) {
       die('Curl failed: ' . curl_error($ch));
   }
   curl_close($ch);

   return $result;
}
  • 第一个问题,它放在哪里,当前在functions.php中?
  • 第二个问题,如何在不同的地方称呼它?

任何解决方案和参考将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:4)

由于您拥有一个功能广泛的函数,请考虑为其提供一个更唯一的名称以防止命名冲突,例如naser_send_notitification()而不是send_notification,或者如果可以的话-考虑使用namespaceclass

现在要回答您的问题,实际上functions.php通常是可以在任何地方访问的“广泛范围”功能的安全选择。如果您查看Action Reference,就会发现after_setup_theme是在相对较早的时间触发的,因此您可以从该挂钩或更晚的时间访问您的函数-因为此刻该函数将可用。但是,它确实在plugins_loaded之后,因此如果您在此之前需要它,则需要将其变成带有File Header或“ MU插件”的插件。

如果您需要尽快有效地访问它,请考虑将其放在/wp-content/mu-plugins/中的文件中,并为其命名,甚至使用custom-functions.php之类的名称。这些文件称为Must-Use Plugins。此目录中的文件始终会被加载,并且始终在其他任何文件之前运行,因此在其中声明的函数可以尽早访问。通常,这是我需要确保代码独立于主题,始终打开且无法停用的代码的地方。

如此有效:

1)将函数重命名为更独特的名称,例如naser_send_notitification()

2)将此代码放入/wp-content/mu-plugins/custom-funtions.php

3)现在,您应该可以在muplugins_loaded钩子(几乎在任何地方)之后的任何函数或钩子中调用naser_send_notification( $tokens, $message )

答案 1 :(得分:2)

我相信wordpress shortcodes将是处理此问题的最佳方法。因为搞乱wordpress核心文件不是一个好习惯,并且会导致一些问题,例如升级时删除代码等。

简码有很多好处,对于您的特定问题,这将是有益的,因为:

  • 可以置于父/子主题tmux kill kill-server
  • 可以在functions.php代码文件和仪表板编辑器中访问

完整代码:(仅放在php内)

functions.php

在主题或插件中的任意位置调用它:(像这样)

  1. wordpress编辑器:

    function send_notification( $atts )
    {
    
      extract(shortcode_atts(array(
        "tokens" => '',
        "message" => ''
      ), $atts));
    
      $url = 'https://fcm.googleapis.com/fcm/send';
      $fields = array(
        'registration_ids' => $tokens,
        'data' => $message
      );
      $headers = array(
        'Authorization:key = My_Token',
        'Content-Type: application/json'
      );
    
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
      $result = curl_exec($ch);
      if ($result === FALSE) {
        die('Curl failed: ' . curl_error($ch));
      }
      curl_close($ch);
    
      return $result;
    
    }
    
    add_shortcode('send-notification', 'send_notification');
    
  2. 主题/插件文件:

    [send-notification token=XXXX message="hello"]
    

有用的资源:

  1. WordPress Shortcode with Parameters
  2. 有关Wordpress简码的tutorial
  3. Creating Shortcode具有不同类型的参数

答案 2 :(得分:1)

这是解决方案: 每行的每一件事都被评论

function do_something( $a = "", $b = "" ) { // create your function
    echo '<code>';
        print_r( $a ); // `print_r` the array data inside the 1st argument
    echo '</code>';

    echo '<br />'.$b; // echo linebreak and value of 2nd argument
}

add_action( 'danish', 'do_something', 10, 2 ); 
// create your own action with params('action name', 'callback funtion', priority, num_of params)

然后钩住您需要的任何地方

    $a = array(
    'eye patch'  => 'yes',
    'parrot'     => true,
    'wooden leg' => 1
);
$b = __( 'And Hook said: "I ate ice cream with Peter Pan."', 'textdomain' ); 

// Executes the action hook named 'danish'

do_action('danish', $a, $b);

就是这样。

答案 3 :(得分:0)

根据this question
步骤1:将您的函数写入插件中的类
步骤2:在您的主题中创建该类的对象
步骤3:通过该对象访问您的函数。

// inside your plugin 
class foo {
      public function send_notification() {
            return "whatever you want";
   }
}

// inside your themes functions.php
$foo_object = new foo();

// use the object to access your function:
$foo_object->send_notification();