Push-уведомление Apple не работает


Я написал плагин, который запускает push-уведомление Apple на устройствах IOS.

Когда я запускаю его вручную через корневой каталог, он работает отлично. Уловка, когда я перемещаю его в папку плагина и запускаю его как плагин, используя:

add_action( 'publish_post', 'post_published' ,10,2);

Он возвращает ошибку ssl с серверов Apple.

В коде ничего не было изменено (за исключением включения ('wp-config.php ')) который не нужен в качестве плагина.

Это ошибка:

Предупреждение: stream_socket_client() [функция.stream-сокет-клиент]: Сбой операции SSL с кодом 1. Сообщения об ошибках OpenSSL: ошибка:14094410: Процедуры SSL: SSL3_READ_BYTES: sslv3 оповещение об ошибке подтверждения в/nas/wp/www/staging/geektimecoil/wp-content/plugins/wp-mes-push-to-apple/wp-mes-push-to-apple.php в строке 131

Предупреждение: stream_socket_client() [функция.stream-сокет-клиент]: Не удалось включить шифрование в /nas/wp/www/staging/geektimecoil/wp-content/plugins/wp-mes-push-to-apple/wp-mes-push-to-apple.php в строке 131

Предупреждение: stream_socket_client() [функция.поток-сокет-клиент]: не удается подключиться к ssl://gateway.sandbox.push.apple.com: 2195 (Неизвестная ошибка) в/nas/wp/www/staging/geektimecoil/wp-content/plugins/wp-mes-push-to-apple/wp-mes-push-to-apple.php на линии 131 Ошибка: 0

Это код, как он есть в плагине:

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

Как я уже упоминал ранее, без add_action и не в качестве плагина, этот точно такой же код работает.

Author: Pieter Goosen, 2014-08-18

1 answers

OMG, наконец, когда код запускается из плагина, текущий рабочий каталог устанавливается в wp-admin, тогда как при запуске вручную он устанавливается для /wp-контента/плагинов...

Итак, когда вызывается функция push, просто добавьте следующую строку кода:

chdir(ABSPATH . 'wp-content/plugins/*your plugins folder name*/');
 1
Author: Meschiany, 2016-02-05 15:56:38