Добрый день подскажите, каким образом в тексте Поста можно вставить ссылку вида
link
Я пробовал вставить так
array('type'=> 'text','text'=> trim($title).'\n\n<a href="'.$link.'">Подробнее..</a>') - но в посте получается текст:
"Заголовок
<a href="">Подробнее...</a>"
А должно:
Заголовок
Подробнее...
Вариант с array('type'=> 'link','url'=> $link, 'description'=>'') - не подходит, так как по ссылке автоматически подгружается фотография, а смысл как раз в том, чтобы вставить просто ссылку без загрузки фото (фото мы грузим через API т.к. оно не подгружается по ссылке).
Вариант с array('type'=> 'text','text'=> trim($title).'\n\nПодробнее: '.$link) - тоже не подходит потому-что ссылка очень длинная и выглядит это ужасно, например "Подробнее: news-rekordnyy-urozhay-novye-rynki-eksporta-i-grandioznye-plany-novosibirskie-agrarii-gotovy-narashchivat-obyemy-proizvodstva/"
Техподдержка api ok отписалась что существует способ оформления ссылок:
при использовании mediatopic.post есть поле media, в нем есть text и далее сам объект AttachmentMediaText. В объекте AttachmentMediaText есть поле text_tokens, которое является списком MediaTextToken. Страница с данным токеном представлена тут: https://apiok.ru/dev/types/mediatopic.MediaTextToken
В общем от документации и тем более от техподдержки ОК никакого толку, поэтому долго-ли, коротко-ли методом научного тыка, удалось понять как реализовать добавление активной ссылки в пост, ниже рабочий пример для WordPress.
В ОК получается пост:
"Заголовок
Краткий текст.
Подробнее..."
Алгоритм работы такой: для новости, которую нужно отправить в ОК, в свойствах ставится метка ОкПост - после сохранения или обновления происходит отправка в ОК и удаление метки.
Код функции в /public_html/wp-content/themes/mytheme/functions.php
function send_to_ok($post_id) {
// Обрабатываем только опубликованные записи
if (wp_is_post_revision($post_id) || get_post($post_id)->post_status != 'publish' )
return;
// Отправляем только записи у которых стоит метка ОкПост
if(has_tag('ОкПост', $post_id)) {
$descr= str_replace('[…]', '...', get_the_excerpt($post_id));
$post_title = get_the_title($post_id);
$post_url = get_the_guid($post_id);
if(comments_open($post_id)) {
$comment=0;
}
else {
$comment=1;
}
$apiUrl = 'https://api.ok.ru/fb.do?';
//Здесь укажите свои ключи доступа
$application_id="512***814874";
$application_key="CLFCL****IHBABABA";
$application_secret_key="0ED87B******2EEA61AAAEEF";
$session_key="tkn1QhRXWNZbi******************j7RTR73oI6gVTaE37vH004TF1KP4p6";
$session_secret_key="402f4c561284*************dcbb88a40e00";
$group_id="624*******8232";//ID группы в ОК.
function getUrl($url, $type = "GET", $params = array(), $timeout = 30, $image = false, $decode = true)
{
if ($ch = curl_init())
{
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
if ($type == "POST")
{
curl_setopt($ch, CURLOPT_POST, true);
// Картинка
if ($image) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
}
// Обычный запрос
elseif($decode) {
curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($params)));
}
// Текст
else {
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
}
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$data = curl_exec($ch);
curl_close($ch);
// Еще разок, если API завис
if (isset($data['error_code']) && $data['error_code'] == 5000) {
$data = getUrl($url, $type, $params, $timeout, $image, $decode);
}
return $data;
}
else {
return "{}";
}
}
/* Загрузка фото */
$params = [
'application_key' => $application_key,
'session_key'=> $session_key,
'session_secret_key'=> $session_secret_key,
'method' => 'photosV2.getUploadUrl',
'count' => 1, // количество фото для загрузки
'gid' => $group_id,
'format' => 'json'
];
ksort($params);
$paramsS='';
foreach($params as $k=>$v) {
$paramsS .= $k . "=" . $v;
}
$sigg = md5($paramsS.$application_secret_key);
$params['sig'] = strtolower($sigg);
$photo_get_id = json_decode(getUrl("https://api.ok.ru/fb.do", "POST", $params), true);
$photo_send_id=$photo_get_id['photo_ids']['0'];
$upload_url=$photo_get_id['upload_url'];
$photo=get_attached_file(get_post_thumbnail_id($post_id));
$paramsP = array('pic1' => curl_file_create($photo));
$photo_send=json_decode(getUrl($upload_url, "POST", $paramsP, 30, true), true);
$photo_token = $photo_send['photos'][$photo_send_id]['token'];
/* end photos */
$media = array('media' =>
array(
array('type'=> 'text','text'=> '',
'text_tokens'=> array(
array('text'=> html_entity_decode($post_title).PHP_EOL.PHP_EOL.html_entity_decode($descr).' '),
array('text'=> 'Подробнее...', 'link'=>$post_url)
)
),
array('type'=> 'photo', 'list'=> array(array('id' => $photo_token))),
),
'disableComments'=> $comment
);
$paramsArray = [
'application_key'=> $application_key,
'session_key'=> $session_key,
'gid'=> $group_id,
'type'=> 'GROUP_THEME',
'attachment'=> json_encode($media),
'format' => 'json',
'text_link_preview' => '0',
'method' => 'mediatopic.post',
];
ksort($paramsArray);
$paramsStr='';
foreach($paramsArray as $k=>$v) {
$paramsStr .= $k . "=" . $v;
}
$sig = md5($paramsStr.$application_secret_key);
$paramsArray['sig'] = strtolower($sig);
$status = json_decode(getUrl("https://api.ok.ru/fb.do", "POST", $paramsArray, 30, false, false ), true);
if(is_string($status)) {
//Удаляем метку ОкПост чтобы исключить повторную отправку в ОК
wp_remove_object_terms($post_id, 'ОкПост', 'post_tag');
}
else {
wp_remove_object_terms($post_id, 'ОкПост', 'post_tag');
}
}
}