Не отображаются лайки при использовании ajax
Тем кто понимает проблему и хочет по-быстрому ее решить, советую перейти к части как решить?. Остальным немного лирики.
Практически на всех проектах мы используем стандартный набор социальных кнопок: vk-like, facebook-like, g+, tweet. И код для всего это тоже используется стандартный.
Добавляется в head вот такой код
<!-- G+ --> <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script> <!-- FB --> <script type="text/javascript" src="http://userapi.com/js/api/openapi.js?34"></script> <!-- VK --> <script type="text/javascript"> VK.init({apiId: your_API_ID, onlyWidgets: true}); </script>
А в место? где надо отобразить социальные кнопки, вставляется примерно такой код:
<div class="b_likes"> <div class="like_itm"> <?php $pageURL = get_permalink(); echo '<iframe src="http://www.facebook.com/plugins/like.php?href='.$pageURL. '&send=false&layout=button_count&width=110&show_faces=true&action=like &colorscheme=light&font&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:140px; height:21px;" allowTransparency="true"></iframe>'; ?> </div> <div class="like_itm"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal">Tweet</a> <script type="text/javascript" src="http://platform.twitter.com/widgets.js"> </script> </div> <divclass="like_itm"> <g:plusone size="medium"></g:plusone></div> <divclass="like_itm"> <div id="vk_like-<?php the_ID(); ?>"></div> <script type="text/javascript"> VK.Widgets.Like( "vk_like-<?php the_ID(); ?>" , {type: "button"} , <?php the_ID(); ?> ); </script> </div> </div>
Последние веяния интернет технологий говорят нам, что ajax очень круто и для пользователей крайне необходимо. С этим можно согласить или не согласиться, но необратить на эту штуку внимания нельзя. Поскольку sawtech прогрессивная контора, то и нас не миновала чаша сия. И вот мы сделали ajax-подгрузку постов в одном из проектов. Чтобы конечный продукт хорошо продвигался добавили сразу же для каждой записи социальные кнопки и обнаружили, что по какой-то причине не все лайки, загружаемые с помощью axaj хотят отображаться корректно.
Проблема в том, что инициация кнопок происходит скриптом, который отрабатывает в момент создания документа, а подгружаемые элементы вставляются уже после.
А решается не сложнее начальной инициации. Для всех кнопок существуют методы повтороной инициации. Для этого надо добавить небольшое кусочки кода рядом с кодом самой кнопки.
<!-- Для твиттера --> <script type="text/javascript"> !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0], p=/^http:/.test(d.location)?'http':'https'; if(!d.getElementById(id)){js=d.createElement(s); js.id=id;js.src=p+'://platform.twitter.com/widgets.js'; fjs.parentNode.insertBefore(js,fjs);}} (document, 'script', 'twitter-wjs'); twttr.widgets.load(); </script> <!-- Для G+ --> <script type="text/javascript">gapi.plusone.go();</script> <!-- Для FB, если используете XFBML вариант --> <script type="text/javascript">FB.XFBML.parse();</script>
Я использую iframe загрузку fk-like, поэтому у меня все было нормально с fb изначально, а контакт сам шарит и все обрабатывает без дополнительных тычков.
В итоге, лично я получил вот такой код:
<div class="b_likes"> <?php $like_url = urlencode( get_permalink() ); ?> <div class="like_itm"> <?php $pageURL = get_permalink(); echo '<iframe src="http://www.facebook.com/plugins/like.php?href='.$pageURL. '&send=false&layout=button_count&width=110&show_faces=true&action=like &colorscheme=light&font&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:140px; height:21px;" allowTransparency="true"></iframe>'; ?> </div> <div class="like_itm"> <a href="https://twitter.com/share" class="twitter-share-button" data-url="<?php echo $like_url; ?>" data-text="<?php the_title(); ?> <?php the_permalink(); ?> ">Tweet</a> <script type="text/javascript"> !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0], p=/^http:/.test(d.location)?'http':'https'; if(!d.getElementById(id)){js=d.createElement(s); js.id=id;js.src=p+'://platform.twitter.com/widgets.js'; fjs.parentNode.insertBefore(js,fjs);}} (document, 'script', 'twitter-wjs'); twttr.widgets.load(); </script> </div> <div class="like_itm"> <div class="g-plusone" data-size="medium" data-href="<?php echo $like_url; ?>"></div> <script type="text/javascript">gapi.plusone.go();</script> </div> <div class="like_itm"> <div id="vk_like-<?php the_ID(); ?>"></div> <script type="text/javascript"> VK.Widgets.Like("vk_like-<?php the_ID(); ?>", { type: "button" , pageUrl: '<?php echo $like_url; ?>' }, <?php the_ID(); ?> ); </script> </div> </div>
Теперь все работает корректно. Как я и обещал, ничего сложного.
Подсчет количества лайков средствами php
В дополнении к голосованию через соц. сети хочу поделиться кодом получения количества лайков с помощью php кода, а не javasript.
Кто не желает читать методы поиска, прошу в самый конец поста, там я выложил код целиком и ссылку на файл. По тексту будет мало кода по причине местного парсера, который пожрет половину кавычек.
Ответ прост. На всех сайтах где требуются лайки в принципе, мы добавляем 4 социальных сети: facebook (fb), vkontakte (vk), google+ (g+) и twitter (tw). Вариант на js может получать количество всех лайков кроме G+, нехитрый запрос в гугле (Иногда задумываюсь: чтобы мы без него делали? На книжках бы разорились!) дает ссылку на некий ресурс, откуда мы почерпнем необходимые знания, но к сожалению этот вариант вовсе не для js. Дальнейшее гугление ничего не дает и принимается волевое решение: к черту js! давай на php. (в дальнейшем в этой связи были свои разочарования, которые мы с успехом преодолели).
Честно сказать как работает код получения g+ лайков, я не сильно и разбирался. Скопировал, вставил в файл php, поправил на свои параметры — все работает, значит, пользуемся на здоровье. Я пытался найти официальную документацию по поводу этого кода, но у меня ничего не получилось, наверное, я просто не старался. Ниже код, который я взял с указанного ресурса.
function get_plusones($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'] ); }
Так вот. Дергать весь остальной код оттуда, я посчитал излишним, мы и сами с усами. Получить контент документа функцией file_get_contents() мы давно умеем, а если не умеем, то читаем документацию, а дальше все аналогично js за исключением разбора json, в php это делается явным образом через json_decode(). Первым сюрпризом для меня было, что fb отдает данные не в json (а может надо было указать формат выдачи в запросе???), а в xml. Но это мы быстро победили. Все остальное было просто забрал json, вытащил нужную инфу и вот. Ну в общем все тут понятно. должно быть. Наверное. Ниже есть место для комментов ежели что.
Ну что все круто. Погоняли, потестили на рабочем серваке (для справки, мы используем хостинг timeweb). Потащили код к клиенту. (nic.ru) Залили и началось. Сначала выяснилось что curl у него не включен. Фигня, в настройках хостинга включаем как опцию, ладно хоть бесплатно. А потом вообще лажа какая-то ругается на file_get_contents() разными словами. Я его и так и сяк, но время поджимало и решил сделать вообще все через curl, дешево и сердито. Главное, клиент доволен.
Как было выяснено в дальнейшем вся лажа была в том, что при получении содержимого через file_get_contents() и если в url используется протокол https, то все «тушите свет» и «крокодил до свидания», скорее всего не включен модуль php openssl. Как это лечить на конкретно взятом хостинге я не могу сказать, не искал, технически достаточно использовать незащищенный протокол http. Стремно, а что делать?! В приложении код через curl.
Все соц сети окромя VK работают по url страницы, для VK нужен уникальный id записи или еще чего-то. Ваша фантазия тут будет уместна.
Код подсчета количества лаков fb.
function get_fb_likes($url) { $curl = curl_init(); $url = 'http://api.facebook.com/restserver.php?method=links.getStats &format=json&urls='.$url; curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $curl_results = curl_exec ($curl); curl_close($curl); // разбор в json $res = json_decode($curl_results); return $res[0]->like_count; };
Код подсчета количества лаков vk. (Не забудьте сменить YOUR_ID на контактовский id сайта)
function get_vk_likes($id) { $curl = curl_init(); $url = 'https://api.vkontakte.ru/method/likes.getList?type=sitepage &owner_id=YOUR_ID&format=json&item_id='.$id; curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $curl_results = curl_exec ($curl); curl_close($curl); // разбор в json $res = json_decode($curl_results); return intval($res->response->count); };
Код подсчета количества лаков twitter.
function get_twitt_likes($url) { $curl = curl_init(); $url = 'http://urls.api.twitter.com/1/urls/count.json?url=' . $url; curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $curl_results = curl_exec ($curl); curl_close($curl); // разбор в json $res = json_decode($curl_results); return intval( $res->count ); };
Не забываем создать id для сайта в vk. В приложенных файлах есть код как подключить и вывести сами кнопки лайков.