Necesita una función personalizada para ser accesible en todo WordPress

5 minutos de lectura

Tengo esta función de notificación y necesito llamarla en diferentes lugares del código. Necesito ponerlo en algún lugar al que pueda acceder cualquier archivo dentro de mi tema secundario, así como en el directorio de complementos.

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;
}
  • Primera pregunta, ¿Dónde ponerlo, actualmente está en functions.php?
  • Segunda pregunta, ¿cómo llamarlo en diferentes lugares?

Cualquier solución y referencia sería apreciada. Gracias.

avatar de usuario
Xhynk

Dado que tiene una función con un alcance amplio, considere darle un nombre más exclusivo para evitar conflictos de nombres, como naser_send_notitification() en lugar de solo send_notificationo si puede, considere usar un espacio de nombres o clase.

Ahora para responder a tu pregunta, functions.php en realidad, suele ser una apuesta segura para las funciones de “amplio alcance” que deben ser accesibles en casi cualquier lugar. Si miras el Referencia de acción verás eso after_setup_theme se activa relativamente temprano, lo que permite que su función sea accesible desde ese gancho o más tarde, ya que estará disponible durante este momento. Sin embargo, viene después plugins_loadedpor lo que si lo necesita antes, deberá convertirlo en un complemento con un Encabezado de archivo o un “Complemento MU”.

Si necesita que esté accesible lo antes posible, considere ponerlo en un archivo en /wp-content/mu-plugins/ y darle un nombre, incluso algo como custom-functions.php. Estos archivos se llaman Complementos imprescindibles. Los archivos en este directorio siempre se cargan y siempre se ejecutan antes que cualquier otra cosa, por lo que las funciones declaradas en ellos son accesibles increíblemente pronto. Por lo general, aquí es donde coloco el código que necesito para asegurarme de que sea independiente del tema, esté siempre activado y no se pueda desactivar.

Tan efectivamente:

1) Cambie el nombre de su función a algo un poco más único, como naser_send_notitification()

2) Pon este código en /wp-content/mu-plugins/custom-funtions.php

3) Ahora debería poder llamar naser_send_notification( $tokens, $message ) en cualquier función o gancho que viene después de la muplugins_loaded gancho (que está casi en cualquier lugar)

avatar de usuario
Khalil danés

Aquí está la solución: todo se comenta en cada línea

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)

después Gancho donde sea que necesites

    $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);

eso es todo.

avatar de usuario
atlas_gondal

Yo creo códigos cortos de wordpress sería el mejor enfoque para manejar esto. Porque jugar con los archivos principales de wordpress no es una buena práctica y genera varios problemas, como la eliminación del código en la actualización, etc.

Hay varios beneficios de los códigos cortos y para su problema específico sería beneficioso porque:

  • se puede colocar en temas padre/hijo functions.php
  • puede ser accesible en php archivos de código y también en el editor del tablero

Código completo: (simplemente coloque dentro functions.php)

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

Llámalo en cualquier parte del tema o complemento: (como esto)

  1. redactor de wordpress:

    [send-notification token=XXXX message="hello"]
    
  2. archivos de tema/complemento:

    <?php echo do_shortcode('[send-notification token=XXXX message="hello"]'); ?>
    

Recursos útiles:

  1. WordPress Código corto con parámetros
  2. A tutorial sobre códigos cortos de WordPress
  3. Creación de código corto con diferentes tipos de parámetros

Según esta pregunta:
paso 1: escriba su función en una clase dentro de su complemento
paso 2: crea un objeto de esa clase en tu tema
paso 3: acceda a su función por ese objeto.

// 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();

¿Ha sido útil esta solución?