J'ai écrit un plug-in qui déclenche une notification Apple Push sur les appareils IOS.
Lorsque je le déclenche manuellement via le répertoire racine, cela fonctionne parfaitement. La capture, quand je le déplace dans le dossier du plugin et l'exécute comme un plugin en utilisant:
add_action( 'publish_post', 'post_published' ,10,2);
il renvoie une erreur ssl des serveurs Apple.
Rien n'a été changé dans le code (à l'exception de include ('wp-config.php')) qui n'est pas nécessaire en tant que plugin.
C'est l'erreur:
Avertissement: stream_socket_client () [function.stream-socket-client]: l'opération SSL a échoué avec le code 1. Messages d'erreur OpenSSL: erreur: 14094410: routines SSL: SSL3_READ_BYTES: échec de la poignée de main d'alerte dans/nas/wp/www/staging/geektim /wp-content/plugins/wp-mes-Push-to-Apple/wp-mes-Push-to-Apple.php à la ligne 131
Avertissement: stream_socket_client () [function.stream-socket-client]: Échec d'activation de la cryptographie dans/nas/wp/www/staging/geektimecoil/wp-content/plugins/wp-mes-Push-to-Apple/wp-mes -Push-to-Apple.php à la ligne 131
Avertissement: stream_socket_client () [function.stream-socket-client]: impossible de se connecter à ssl: //gateway.sandbox.Push.Apple.com: 2195 (erreur inconnue) dans/nas/wp/www/staging/geektimecoil/wp-content/plugins/wp-mes-Push-to-Apple/wp-mes-Push-to-Apple.php en ligne 131 Erreur: 0
C'est le code tel qu'il est dans le plugin:
function post_published($ID, $post ) {
// $url = "http://geektimecoil.staging.wpengine.com/googlePush.php"; global $wpdb;
// $post = get_post(211051);
$categories = get_the_category($post->ID );
if($categories){
$cond = array();
$cats = array();
foreach($categories as $category) {
$cats[] = $category->slug;
switch ($category->slug) {
case "startup":
$cond[] = "startup";
break;
case "development":
$cond[] = "dev";
break;
case "gadgets":
$cond[] = "mobile";
break;
case "internet":
$cond[] = "internet";
break;
case "hi-tech":
$cond[] = "hightech";
break;
case "%d7%a1%d7%a7%d7%99%d7%a8%d7%95%d7%aa": // hebrew skirot
$cond[] = "reviews";
break;
case "science":
$cond[] = "science";
break;
}
}
print_r($cond);
$condition = "( (".$cond[0]."=1)";
for ($i=1; $i<=(count($cond)-1) ; $i++) {
$condition .= "or(".$cond[$i]."=1)";
}
$condition .= " )";
}
$sql="SELECT token FROM wp_mobile where device=1 AND ".$condition;
$users = $wpdb->get_results($sql);
print_r($sql);
print_r($users);
$passphrase = '***';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
stream_context_set_option($ctx, 'ssl', 'local_cert','/Push/geek_dev.pem');
// stream_context_set_option($ctx, 'ssl', 'local_cert','/Push/geek_prod.pem');
stream_context_set_option($ctx, 'ssl', 'cafile', '/Push/ios_entrust.pem');
# Open a connection to the APNS server
$fp = stream_socket_client(//'ssl://gateway.Push.Apple.com:2195', $err,
'ssl://gateway.sandbox.Push.Apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp){
echo "Error: ".$err;
exit;
}
$post_url = str_replace('www','m',get_permalink( $post->ID));
$body["aps"] = array(
"alert" => "message", //title
"sound" => "default",
"badge" => "0",
"url" => $post_url,
);
$payload = json_encode($body);
$msg = chr(1) // command (1 byte)
. pack('N', 'notification') // identifier (4 bytes)
. pack('N', time() + 86400) // expire after 1 day (4 bytes)
. pack('n', 32) // token length (2 bytes)
. pack('H*', 'db8***b414004ccb9a***2a54d9de06')
. pack('n', strlen($payload)) // payload length (2 bytes)
. $payload; // the JSON payload
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
//echo "\n$result";
//set blocking
stream_set_blocking($fp,0);
//Wait to response
sleep(1);
fclose($fp);
return $print;
}
add_action( 'publish_post', 'post_published' ,10,2); ?>
Comme je l'ai mentionné précédemment, sans le add_action
et pas en tant que plugin, ce même code fonctionne.
OMG, enfin, lorsque le code provient du plug-in, le répertoire de travail actuel est défini sur wp-admin alors que lorsque je l'exécute manuellement, il est défini pour/wp-content/plugins ...
Ainsi, lorsque la fonction Push est appelée, ajoutez simplement la ligne de code suivante:
chdir(ABSPATH . 'wp-content/plugins/*your plugins folder name*/');