Публикация в группе: Кастомизация WP-Recall и Wordpress

Как-то давно я ставил плагин для этой цели, но со временем я захотел что бы у записей в группе вконтакте были теги, которые бы соответствовали родительской рубрике записи и оказалось что для этого надо покупать платную версию. Тогда я решил запились свой кросспостинг. Именно им я и поделюсь с вами, если кому-то он подойдет лучше чем существующие плагины.

Сразу хочу отметить, код я писал давно и возможно он не самый оптимальный, но он работает уже несколько лет и никаких проблем с ним нет.

И так, первое что мы сделаем это добавим в админку, рядом с кнопкой "Опубликовать" галочку для кросспостинга, т.е. если вы ее поставите - то запись принудительно добавится в группу, даже если она уже опубликована и была ранее туда добавлена.

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"

7

Автор публикации

не в сети 14 часов

Preci

1 493
Telegram: https://t.me/preci_123
Комментарии: 495Публикации: 83Регистрация: 11-11-2014Продаж/Покупок: 0/0