Получение общего количества шеров в соцсетях (Facebook, Twitter, Google+, Pinterest)
Я получаю количество шеров для каждой социальной сети отдельно, используя следующий код в файле function.php своей темы:
$facebook_like_share_count = function ( $url ) {
$api = file_get_contents( 'http://graph.facebook.com/?id=' . $url );
$count = json_decode( $api );
return $count->shares;
};
$twitter_tweet_count = function ( $url ) {
$api = file_get_contents( 'https://cdn.api.twitter.com/1/urls/count.json?url=' . $url );
$count = json_decode( $api );
return $count->count;
};
$pinterest_pins = function ( $url ) {
$api = file_get_contents( 'http://api.pinterest.com/v1/urls/count.json?callback%20&url=' . $url );
$body = preg_replace( '/^receiveCount\((.*)\)$/', '\\1', $api );
$count = json_decode( $body );
return $count->count;
};
$google_plusones = function ( $url ) {
$curl = curl_init();
curl_setopt( $curl, CURLOPT_URL, "https://clients6.google.com/rpc" );
curl_setopt( $curl, CURLOPT_POST, 1 );
curl_setopt( $curl, CURLOPT_POSTFIELDS, '[{"method":"pos.plusones.get","id":"p","params":{"nolog":true,"id":"' . $url . '","source":"widget","userId":"@viewer","groupId":"@self"},"jsonrpc":"2.0","key":"p","apiVersion":"v1"}]' );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Content-type: application/json' ) );
$curl_results = curl_exec( $curl );
curl_close( $curl );
$json = json_decode( $curl_results, true );
return intval( $json[0]['result']['metadata']['globalCounts']['count'] );
};
Я вывожу их в single.php с помощью следующего кода:
<?php $url = get_permalink( $post_id ); echo $facebook_like_share_count ("$url");?>
<?php $url = get_permalink( $post_id ); echo $twitter_tweet_count ("$url");?>
<?php $url = get_permalink( $post_id ); echo $pinterest_pins ("$url");?>
<?php $url = get_permalink( $post_id ); echo $google_plusones ("$url");?>
Это работает нормально.
Теперь я пытаюсь найти фрагмент кода, который будет суммировать количество шеров этих 4 сервисов и показывать общее количество - вероятно, что-то похожее на этот пример.
РЕДАКТИРОВАТЬ: У меня важный вопрос.
Возможно ли, что приведенный выше код замедляет работу моего блога?
Я уже связывался со своим хостинг-провайдером, и они сказали, что это может быть связано с плагинами или php-файлами. Я не обновлял плагины в последнее время, а P3 Profilier показывает только обычных "виновников". Но я заметил, что сразу после вызова этой функции в single.php мой сервер иногда грузится очень медленно - даже получает таймауты на сайтах проверки скорости. Есть идеи?
РЕДАКТИРОВАТЬ 2: После множества тестов действительно кажется, что именно этот код (при выводе) замедляет страницу. пожимает плечами Наверное, придется перестать его использовать?
Мне пока не удалось заставить это работать. Надеюсь, вы сможете мне помочь. Большое спасибо!

Хорошо. @ialocin оставил заметку о Транзиентах. По какой-то странной причине я еще не сталкивался с этим. Раньше я использовал следующие способы отображения счетчиков:
- jQuery (загрузка на стороне клиента)
- Кэширование страниц (при локальном хранении счетчиков)
- Обновление значений счетчиков через Cron
- И совсем недавно хранил все счетчики в метаданных записи и обновлял метаданные каждые 100 загрузок страницы... довольно дико.
Но нет, есть нечто лучшее. Намного лучше. Транзиенты. Транзиенты. Транзиенты... повторяйте это часами... После медитации и возвращения изучите следующий код, который я адаптировал для вас:
// Проверяем наличие транзиента. Если его нет, выполняем код
if ( false === ( $data = get_transient( 'trans_' . $post_id ) ) ) {
/* действие */
$facebook_like_share_count = function ( $url ) {
$api = file_get_contents( 'http://graph.facebook.com/?id=' . $url );
$count = json_decode( $api );
return $count->shares;
};
$twitter_tweet_count = function ( $url ) {
$api = file_get_contents( 'https://cdn.api.twitter.com/1/urls/count.json?url=' . $url );
$count = json_decode( $api );
return $count->count;
};
$pinterest_pins = function ( $url ) {
$api = file_get_contents( 'http://api.pinterest.com/v1/urls/count.json?callback%20&url=' . $url );
$body = preg_replace( '/^receiveCount\((.*)\)$/', '\\1', $api );
$count = json_decode( $body );
return $count->count;
};
$google_plusones = function ( $url ) {
$curl = curl_init();
curl_setopt( $curl, CURLOPT_URL, "https://clients6.google.com/rpc" );
curl_setopt( $curl, CURLOPT_POST, 1 );
curl_setopt( $curl, CURLOPT_POSTFIELDS, '[{"method":"pos.plusones.get","id":"p","params":{"nolog":true,"id":"' . $url . '","source":"widget","userId":"@viewer","groupId":"@self"},"jsonrpc":"2.0","key":"p","apiVersion":"v1"}]' );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Content-type: application/json' ) );
$curl_results = curl_exec( $curl );
curl_close( $curl );
$json = json_decode( $curl_results, true );
return intval( $json[0]['result']['metadata']['globalCounts']['count'] );
};
// сохраняем данные в массив
$data = array (
$facebook_like_share_count,
$twitter_tweet_count,
$pinterest_pins,
$google_plusones
);
// Сохраняем результаты в транзиент. Срок действия — 6 часов
set_transient( 'trans_' . $post_id, $data, 6 * HOUR_IN_SECONDS );
}
if (is_array($data)) {
$facebook_like_share_count = $data[0];
$twitter_tweet_count = $data[1];
$pinterest_pins = $data[2];
$google_plusones = $data[3];
}
Во-первых, убедитесь, что переменная $post_id
уже определена до добавления этого кода, так как она используется для создания уникального идентификатора транзиента.
Мы временно сохраняем кэшированные данные в базе данных, присваивая им уникальное имя и указывая срок, после которого они будут удалены.
Таким образом, каждые 6 часов массив обновляется. Это очень просто. Смотрите комментарии для уточнения.
РЕДАКТИРОВАНИЕ:
Согласно обсуждениям в комментариях, я изменил код. Во-первых, убедитесь, что у вас есть функции для подсчета шаринга в файле functions.php
(я полагаю, что в вашей текущей настройке они уже есть), затем в файле single.php
добавьте следующий код там, где вам нужно получить
значения счетчиков.
// получаем ID записи
$post_id = get_the_ID();
// получаем постоянную ссылку для функций подсчета шаринга
$url = get_permalink( $post_id );
// Проверяем наличие транзиента. Если его нет, выполняем код
if ( false === ( $data = get_transient( 'trans_' . $post_id ) ) ) {
/* действие */
$facebook_like_share_count ("$url");
$twitter_tweet_count ("$url");
$pinterest_pins ("$url");
$google_plusones ("$url");
// сохраняем данные в массив
$data = array (
$facebook_like_share_count,
$twitter_tweet_count,
$pinterest_pins,
$google_plusones
);
// Сохраняем результаты в транзиент. Срок действия — 6 часов
set_transient( 'trans_' . $post_id, $data, 6 * HOUR_IN_SECONDS );
}
if (is_array($data)) {
// эти переменные содержат количество шарингов
$facebook_like_share_count = $data[0];
$twitter_tweet_count = $data[1];
$pinterest_pins = $data[2];
$google_plusones = $data[3];
}
Пожалуйста, ознакомьтесь с комментариями в коде для уточнения.

Ты только что заставил меня улыбнуться от того, насколько сильно тебя радуют транзиенты :)

Привет. Большое спасибо за твою тяжёлую работу. Я попытался добавить твой код в function.php моей темы, но если я это делаю, моя страница перестаёт загружаться. Полагаю, там синтаксическая ошибка? :(

Что? Нет, этот код должен находиться там, откуда он был изначально взят. Полагаю, это single.php

@ChristineCooper У меня был код, который я изначально опубликовал в своем вопросе, в файле function.php, а затем вывел его в single.php. Я думал, что должен сделать то же самое с вашим фрагментом кода?! ^^;

Пожалуйста, обновите свой вопрос, добавив полный код, который вы используете в файле functions.php, и полный код, которым вы вызываете свои функции в файле single.php или loop-single.php. Таким образом, я смогу увидеть, что происходит, и адаптировать код для вас.

@ChristineCooper Спасибо. Я отредактировал свой вопрос. Дайте знать, если вам также нужно увидеть мой полный файл function.php — я загружу его на pastebin.

file_get_contents()
не будет работать с URL на всех серверах. Вместо этого используйте HTTP API.

@japanworm Примерно так: $count = json_decode( wp_remote_retrieve_body( wp_safe_remote_get( 'http://graph.facebook.com/?id=' . $url ) ) );

@ChristineCooper Я попробовал снова. Кажется, вы не изменили фрагмент кода, который я должен вставить в свой function.php. Должна быть где-то синтаксическая ошибка. Так как я ужасно разбираюсь в коде, я не могу разобраться сам. Может быть, фрагмент кода в function.php не может начинаться с "if"?? Я не знаю.. :(

Я не меняла код в вашем файле functions.php, это должен быть точно такой же код, который вы использовали ранее и который работал, по вашим словам? Так что в вашем файле functions.php не должно быть ошибки, если вы используете тот же самый рабочий код.

@ChristineCooper Если я использую код из моего вопроса, я не получаю эту ошибку. Если я использую код из вашего ответа, то получаю.

Вы размещаете мой код в вашем single.php файле? Также, пожалуйста, вставьте полное сообщение об ошибке в комментарии здесь и укажите часть кода, на которую ссылается сообщение об ошибке.

@ChristineCooper Нет сообщения об ошибке. Мой блог перестает загружаться, как только я вставляю код в function.php, что обычно указывает на синтаксическую ошибку.
