Как-то давно я ставил плагин для этой цели, но со временем я захотел что бы у записей в группе вконтакте были теги, которые бы соответствовали родительской рубрике записи и оказалось что для этого надо покупать платную версию. Тогда я решил запились свой кросспостинг. Именно им я и поделюсь с вами, если кому-то он подойдет лучше чем существующие плагины.
Сразу хочу отметить, код я писал давно и возможно он не самый оптимальный, но он работает уже несколько лет и никаких проблем с ним нет.
И так, первое что мы сделаем это добавим в админку, рядом с кнопкой "Опубликовать" галочку для кросспостинга, т.е. если вы ее поставите - то запись принудительно добавится в группу, даже если она уже опубликована и была ранее туда добавлена.
add_action('post_submitbox_misc_actions','post_check_box');
function post_check_box() {
if (is_super_admin()) {
echo '<div class="misc-pub-section">';
echo '<p><input type="checkbox" name="post_to_vk" /> Опубликовать на стене ВКонтакте </p>';
echo '</div>';
}
}
Затем мы прицепим функцию кросспостинга к хуку wordpress, что бы запись автоматически отправлялась в группу если она публикуется первый раз или если стоит галочка "опубликовать вконтакте"
//кросспостинг вконтакте
add_action('transition_post_status', 'send_to_cross_post', '100', '3');
function send_to_cross_post($new_status, $old_status, $post){
if (($new_status == 'publish' && $old_status != 'publish') || ( isset( $_POST['post_to_vk'] ) && $_POST['post_to_vk'] && $new_status == 'publish' )) {
cross_post($post);
}
}
Ну и собственно сама функция кросспостинга
function cross_post($post){
if ($post->post_type == 'post') {
$title = $post->post_title;
$title = strip_tags($title);
$title = html_entity_decode($title, ENT_QUOTES, 'UTF-8');
$title = htmlspecialchars_decode($title);
$url = get_permalink($post->ID);
$shorturl = wp_get_shortlink($post->ID);
$category = get_the_category($post->ID);
$parentCatList = get_category_parents($category[0]->cat_ID,false,',');
$parentCatListArray = explode(",",$parentCatList);
$topParentName = $parentCatListArray[0];
$sdacReplace = array(" " => "-", "(" => "", ")" => "");
$topParent = strtolower(strtr($topParentName,$sdacReplace));
$topParent = str_replace("-","_", $topParent);
//Берем картинку поста
$post_images = get_children( array(
'post_parent' => $post->ID,
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'orderby' => 'menu_order id',
'order' => 'ASC',
'numberposts' => '1'
));
//Если есть картинка
if ($post_images) {
$i = 1;
foreach($post_images as $image) {
$images['file'.$i] = new CURLFile(get_attached_file($image->ID));
$i++;
}
}
//Инфо
$token = ""; // Ваш токен
$group_id = ""; //id группы
$group_slug = ""; // slug группы, например для группы https://vk.com/ko_samui это "ko_samui"
//Загружаем картинку в вк
$args = array (
'body' => array ('group_id' => $group_id,'access_token' => $token, 'v' => '5.70'),
'sslverify' => false
);
$data = wp_remote_post('https://api.vk.com/method/photos.getWallUploadServer', $args);
$resp = json_decode($data['body'], true); // декодируем данные
$curl = new Wp_Http_Curl();
$ch = $curl->request( $resp['response']['upload_url'], array(
'body' => $images,
'method' => 'POST'
));
$res2 = json_decode($ch['body'],true);
//Сохраняем загруженные картинки
$params = array(
'access_token' => $token,
'group_id' => abs($group_id),
'server' => $res2['server'],
'photo' => $res2['photo'],
'hash' => $res2['hash'],
'v' => '5.70',
);
$args = array (
'body' => $params,
'sslverify' => false
);
$data = wp_remote_post('https://api.vk.com/method/photos.saveWallPhoto', $args);
//декодируем данные после сохранения картинок, что бы получить их ввиде photo4096966_396804305
$data = json_decode($data['body'],true);
//записываем все картинки (photo4096966_396804305) в массив
foreach($data['response'] as $r) {
$attachments[] = "photo".$r['owner_id']."_".$r['id'];
}
//делаем из массива с картинками строку (photo4096966_396804305,photo4096966_396804305)
$attch = implode(",", $attachments);
//Формируем окончательный запрос на отправку поста в группу
$args = array(
'body' => 'owner_id=-'.$group_id.'&from_group=1&message='.$title.'%0A%0A'.$url.'%0A%0A#'.$topParent.'@'.$group_slug.'&attachments='.$attch.','.$shorturl.'&access_token='.$token.'&v=5.70',
'user-agent' => 'Yoast Coolness'
);
//отправляем пост в группу
$sendpost = wp_remote_post('https://api.vk.com/method/wall.post', $args);
}
}
Все что вам нужно - вставить все 3 части кода в ваш functions.php и заполнить следующие переменные:
//Инфо
$token = ""; // Ваш токен
$group_id = ""; //id группы
$group_slug = ""; // slug группы, например для группы https://vk.com/ko_samui это "ko_samui"
Супер, думаю, многие будут благодарны за это решение
За рецепт - спасибо)))
Как-то смотрел плагин "NextScripts: Social Networks Auto-Poster". Понравился. Может кому пригодится. 🙂
Я не уверен что в нем есть теги. А так, в нем например рандомный кросспост старых записей - только в платной версии, а тут достаточно повесить функцию на крон и это будет бесплатно. Я как нибудь запилю.
Совсем недавно подбирал плагин под это дело. А тут такое интересное решение!
Класс! Недавно рассматривал плагин Easy VKontakte Connect. Но что-то он не понравился. Спасибо!
Вопрос небольшой. Категория статьи "Бизнес", правильно выводит или теги должны всётаки быть после #? https://yadi.sk/i/CHmxStY63PmXNL
Описание смешал с комментарием и задал глупый вопрос. Спасибо ещё раз, установил на два сайта выводит классно.
2 вопроса:
1) как вывести кнопку "Опубликовать на стене ВКонтакте" в форме публикации от плагина WP-Recall;
2) как сделать кросспостинг принудительным для post - без всякой галочки.
1. Создать в форме публикации свое поле чекбокс с мета кей "post_to_vk" или со своим мета кей и добавить его в условие.
2. Там и так все записи которые только опубликованы, а не обновлены, отправляются. Если надо что бы тип post даже при обновлении отправлялись, то заменить на:
function send_to_cross_post($new_status, $old_status, $post){ if ( ($new_status == 'publish' && $old_status != 'publish') || ( isset( $_POST['post_to_vk'] ) && $_POST['post_to_vk'] && $new_status == 'publish' ) || ( $post->post_type == 'post' && $new_status == 'publish' ) ) { cross_post($post); } }3. Хеш тег в формировании окончательного запроса:
'%0A%0A#'.$topParent.'@'.$group_slug.'
Где %0A%0A - перенос строки
#'.$topParent.'@'.$group_slug.' - это хештег вида #category@group_slug
т.е. можете через цикл в свою переменную записывать что угодно и вставлять в окончательный вид поста
и, пожалуй, с вашего позволения, ещё один вопрос:
3) как сделать, чтобы в конце публикаций в группе выводились, скажем, 2 или 3 хеш-тега?
Кастомные типы записей к сожалению не кросспостятся, даже если ставить принудительно галочку.
Потому что в начале функции есть условие if ($post->post_type == 'post')
Подскажите как прописать все интересующие для кросспостинга типы постов, если не трудно..
Пробовал так:
if ($post->post_type == 'post,ait-item')
-------------------------------------------
И так:
if ($post->post_type == 'post')
if ($post->post_type == 'ait-item') {
Прошу громко не смеятся
if ($post->post_type == 'post' || $post->post_type == 'ait-item')
Вот прям ОРОМНЕЙШЕЕ СПАСИБО! А то у меня в районе 7-ми кастомных записей на сайте.
Единственное выводит хештеги, вместо тега: #@домен.ру ну и ладно, спасибо большое и на этом!
Потому что там нестандартная таксономия, под нее надо править код что бы в $topParent было название таксономии вашего типа записи
А можно ли реализовать такую же шикарную систему для Одноклассников? Или там всё очень сложно с API?
Вроде как у них нет такого API. Ну покрайней мере я не находил
В плаине Social Networks Auto-Poster есть кросспостинг в одноклассники. Вот бы выдрать код именно на них, без остальных сетей. А то там и лишнего много, и нагрузка наверное так же, лишняя будет.
Там в опциях выбираешь сети - что не выбрал - не создают нагрузку.
Обновил код функции cross_post(), он переставал работать т.к. вк обновили апи, с новым кодом все работает
При нажатии на " Опубликовать на стене ВКонтакте" и сохранении или обновлении поста, выдаёт HTTP ERROR 500, а в строке выводит адрес /wp-admin/post.php
Смотрите лог ошибок. У меня стоит этот код, проблем никаких нет