Когда в одном из прошлых постов мы полностью воссоздали клиент golos.io на своем сервере, под своим доменом, в комментариях появились некоторое разочарование тем, что для такого клиента необходим свой VPS с node js и недели тюнинга если речь идет об интеграции с существующим сайтом вебмастера:
С виртуальным хостом люди в пролёте? Ну вот админю я пару бложиков на вордпресе им многого и не надо виртуальный хостинг за глаза. FTP есть, мускул, ПХП нескольких версий на выбор и всё. SSH нет, права на управление сервером нет. Уже не подключиться?
Вроде как речь идёт о добавлении к рабочему проекту мощностей Голоса, а пример с поднятием нового сайта. Так можно или нельзя в итоге интегрировать голоса в WordPress, PHPBB, Joomla, PrestaShop и тд?
Спешу обрадовать - свой клиент на WP - это вполне реально, а главное - очень быстро!
Более 25% всех сайтов в сети работают на базе Wordpress. Этот движок можно установить практически на любой хостинг, включая бесплатные. Для него вы найдете тысячи тем оформления и плагинов.
Возможность симбиоза блокчейна голоса и wordpress несомненно может стать одним из самых значимых событий для голоса, в т.ч. для стоимости GOLOS на бирже.
Начните создавать свои первые плагины wp + golos уже сейчас! Особенно актуально в свете возможности опубликовать на продажу свои плагины на codecanyon и грядущего на голосе маркетплейса :)
Что будет уметь ваш WP плагин в рамках данного поста:
- Собственный редактор для создания поста на базе tinymce
- Добавление фото в пост из вашей медиабиблиотеки wp
- Плагин поможет задать желаемую ссылку вашему посту на голосе (permlink)
- Возможность добавлять посты любому автору
- Контроль топика и тегов, которые будет использовать автор
- Быть не только wp плагином, но и работать на любой cms, или просто из html
На скрине обсуждаемый плагин
Демо: https://golos.rubtc.info/post/
Что будет добавлено в будущем:
- Страница настроек в плагине
- Формирование желаемой ленты постов на вашем сайте разными способами
- Голосование с вашего сайта
- Безопасная передача постинг ключа
- Авторизация и привязка аккаунтов пользователей к голосу
- Фолловинг
- Комментарии
- Кросспостинг, кнопки апвота под любым контентом и другое!
Идея
В основе идеи - поделиться рабочими методами взаимодействия API голоса и вашим сайтом на любой платформе и хостинге. Дать возможность шаг за шагом создать плагин, который будет работать на базе blockchain голоса и позволит размещать посты, комментарии, голосовать и подписываться находясь на вашем сайте.
Как выгодно применить голос к любой вашей идее
Представим, что у вас есть региональный сайт с рейтингом ресторанов города. Коммерческий успех такого портала напрямую зависит от качества вашей аудитории, ваши пользователи должны писать честные и полезные рецензии. Вы можете поощрять авторов из собственных средств или...
Реализовать это с помощью голоса!
Через форму на вашем сайте контент будет попадать в blockchain голоса, где соберет средства для вознаграждения автора. Вы можете комбинировать параметры размещая посты от собственного имени или позволить авторам иметь собственные аккаунты на голосе, помечать посты тегом и размещать в специальных топиках и многое другое.
Например пометив посты со своего сайта тегом nsfw вы уберете их из общей ленты на голосе, но сможете вывести на своем сайте, дав возможность голосовать на ваших страницах за любой контент.
Плагин WP GOLOS.IO за ~ 5 минут
Создадим папку golos и 2 файла в ней (в папке плагинов WP)
golos.js
wpgolos.php
Содержимое golos.js - это steem.js адаптированный усилиями @ontofractal (https://github.com/ontofractal/golosjs/)
В моей версии добавлен только /
после основной ноды, так как у меня без этого соединение с нодой было односторонним.
Содержимое wpgolos.php мы разберем ниже:
Для легкости восприятия код достаточно примитивен и совмещен в один файл.
http://pastebin.com/raw/8nHNXmaM
Описываем плагин и задаем необходимые параметры
Определяем путь к файлам плагина:
define( 'PLUGIN_ROOT_PATH', plugin_dir_path( __FILE__ ) );
Создаем на будущее два триггера на активацию и деактивацию плагина
register_activation_hook(__FILE__,'golos_activation');
register_deactivation_hook( __FILE__, 'golos_deactivation' );
Задаем страницу, на которой будет отображаться наша форма постинга
add_filter( 'the_content', function( $content ) {
if ( is_page( 'golos-post' ) ) { ob_start();
В коде выше указана страница is_page( 'golos-post' )
это означает, что если плагин активирован и у вас есть созданная страница с адресом golos-post
- форма постинга будет отображаться именно на ней. Вы можете задать вместо golos-post
любой slug своих страниц.
Зададим глобальную переменную с контентом и переменную с адресом нашего wp вплоть до папки с инсталляцией - это поможет нам правильно получать ссылки на медиафайлы.
$content ='';
$wpurl = site_url();
?>
Описываем CSS
<style>#alerts { background: #ff8282; color: white; padding: 10px; border-radius: 3px; }.golos-form{background:#f5f5f5;padding:5px 20px;border-radius:3px}input#post-golos-title{width:100%;margin:10px auto;padding:5px;border-radius:5px;font-size:1.8rem}.golos-form .mce-panel{border-radius:3px;margin:10px auto}.golos-form input[type=submit]{background:#248eff;border:0;display:block;margin:20px auto;padding:10px;width:160px;border-radius:3px;color:#fff;box-shadow:0 0 10px -5px #000}input#permlink{font-size:14px;height:18px;border-radius:10px;margin-right:15px}</style>
Создаем поля нашей формы
<div class="golos-form">
<form id="post-golos-form" enctype="multipart/form-data">
<h2><label for="post-golos-title"><?php _e( 'Заголовок', 'your-text-domain' ); ?></label></h2>
<input type="text" name="post-golos-title" id="post-golos-title" required aria-required="true">
<p><input type="text" id="permlink" name="permlink" required aria-required="true"/>
<label for="permlink">Ссылка на ваш пост в голосе</label></p>
<div id="text-editor"></div>
Вставляем wp редактор с медиазагрузчиком
<?php wp_editor($content, 'wp-content-editor-container', array(
'wpautop' => 1,
'media_buttons' => 1,
'textarea_name' => 'content',
'textarea_rows' => 30,
'tinymce' => 0,
'quicktags' => 0,
'drag_drop_upload' => true
) );
?>
Продолжаем создание формы, оставляем поля для указания юзернейм и постинг ключа автора*
<p><input type="text" id="username" name="username" required aria-required="true"/> <label for="username"> Ваш логин на голосе</label></p>
<p><input type="password" id="postingkey" name="postingkey" required aria-required="true"/> <label for="postingkey"> Постинг ключ автора</label></p>
<input type="submit" value="<?php _e( 'Отправить', 'your-text-domain' ); ?>">
</form>
<div id="alerts"></div>
</div>
Теперь добавим JavaScript внутри <script> </script>
Настроим наш редактор tinymce. Весь список настроек можно найти тут https://github.com/tinymce/tinymce
jQuery(document).ready( function( $ ) {
tinymce.init( {
selector:'#wp-content-editor-container',
mode : "exact",
elements : 'pre-details',
theme: "modern",
skin: "lightgray",
menubar : true,
statusbar : true,
toolbar: [
"bold italic | alignleft aligncenter alignright | bullist numlist outdent indent | undo redo"
],
plugins : "paste",
paste_auto_cleanup_on_paste : true,
paste_postprocess : function( pl, o ) {
o.node.innerHTML = o.node.innerHTML.replace( / +/ig, " " );
}
} );
});
Отправляем пост на голос
jQuery( '#post-golos-form' ).on( 'submit', function(e) {
e.preventDefault();
var t = document.getElementById("post-golos-title").value,
post_body = tinyMCE.activeEditor.getContent(),
k = document.getElementById("postingkey").value,
u = document.getElementById("username").value,
permlink = document.getElementById("permlink").value,
jsonMetadata = '{\"tags\":[\"viktest\"]}',
parentAuthor = '',
parentPermlink = 'golos',
wpurl ="<?php echo $wpurl;?>",
regex = new RegExp('src="..', "g"),
input = post_body,
p = input.replace(regex, 'src="'+wpurl);
steem.broadcast.comment(
k,
parentAuthor,
parentPermlink,
u,
permlink,
t,
p,
jsonMetadata,
function(err, result) {
console.log(err, result);
document.getElementById('alerts').innerHTML = (err);
});
});
На 75 строчке мы можем указать теги. Так как это пример, мы не будем делать отдельное поле для тегов, а жестко зададим в плагине. Таким образом вы можете задать специфический тег для формы, например NSFW и не портить репутацию размещая тестовый или не уместный контент на голосе.
На 77 строчке мы задаем основной топик в который размещаем пост. Например golos
. А вернее ru--golos
82-84 строчки нужны для медиазагрузчика wordpress и tinymce. Дело в том, что загрузив в пост фото, мы получим относительную ссылку на файл вида ../wp-content/photo.jpg
. Нам такое не подойдет, так как пост будет размещаться на голосе и ссылка нам нужна абсолютная, с точным указанием нашего сайта. Мы отфильтруем наш контент, найдем все строки src="..
и заменим их на ссылку нашего сайта из переменной rc="'+wpurl
// Найдем все ссылки на фото и добавим им абсолютный путь
regex = new RegExp('src="..', "g"),
input = post_body,
p = input.replace(regex, 'src="'+wpurl);
Ну и последний кусок кода, в котором мы подключаем ту самую адаптацию golos.js
с папки плагина и tinymce
с папки includes самого движка wp
<?php $content .= ob_get_clean();} return $content;});
add_action( 'wp_enqueue_scripts', function() {
wp_enqueue_script( 'tinymce_js', includes_url( 'js/tinymce/' ) . 'wp-tinymce.php', array( 'jquery' ), false, true );
wp_enqueue_script( 'golosjs', plugin_dir_url( __FILE__ ) . 'golos.js');
});
Все готово! Активируем плагин на странице /wp-admin/plugins.php
Если не работает редактор
Проблема может быть в версии WP. Проблема решается заменой строки
wp_enqueue_script( 'tinymce_js', includes_url( 'js/tinymce/' ) . 'wp-tinymce.php', array( 'jquery' ), false, true );
на
wp_enqueue_script( 'tinymce_js', '//cdn.tinymce.com/4/tinymce.min.js', array( 'jquery' ), false, false );
Демо https://golos.rubtc.info/post/
Учтите, что кнопка добавить медиа показывается только зарегистрированным пользователям вашего сайта.
Безопасность
Основная проблема - это передача постинг ключа. Вам нужно обязательно использовать https (tls) на своих сайтах, но даже тогда, метод передачи ключа в плагине нельзя назвать полностью безопасным. В будущем мы добавим методы, которые помогут сохранить приватность передаваемого ключа.
Развитие
Как писал в начале - планы на развитие плагина очевидные. Функционал, который логично добавить:
- Сохранение избранных постов в базу вашего WP
- Конструктор для отображения постов по заданным критериям
- Возможность голосовать за посты
- Конструктор ролей (кого делать автором постов, от кого и куда будут уходить голоса и т.п.)
- Возможность авторам указывать ключ в аккаунте и хранить его зашифрованным или реализация логина через oAuth голоса.
- Адаптация плагина под другие CMS
Ссылки
Прошлые посты
Создаем собственный сайт на базе blockchain голоса за ~ 30 минут.
Блокнот + JavaScript + голос = Трансляция Апвотинга, Фолловинга, новых пользователей, голосов за делегатов и прайсфида.
@ontofractal - https://github.com/ontofractal/golosjs
Редактор https://github.com/tinymce/tinymce
wpgolos.php - http://pastebin.com/raw/8nHNXmaM
Класс, идея крутая, вот только какой смысл с этого всего?
Я сейчас опишу проблему а Вы поправьте меня.
С того что я понял, можно будет у себя на сайте WP размещать посты которые будут хранится на голосе но отображаться у нас на сайте.
Вот только проблема в том что поисковые системы сразу же наложат фильтр на ваш сайт, за дублирование контента. Ну либо если у вас страницы будут раньше индексироватся то тогда хуже будет голосу. Но второй вариант мало вероятный, так как у сайта голос Траст (доверие, репутация) выше чем у вашего только созданного сайта. Ну все равно кто-то будет в минусе.
Ну это только из того как я понял реализацию того что вы предложили.
Хотелось бы услышать что я все таки ошибаюсь и суть в ином.
Спасибо за проделанную работу, подписался)
Подразумевается, что контент под seo будет на вашем WP свой, а кросспостинг с голосом - это построение сервиса, вокруг которого вы соберете своих пользователей.
Если у вас есть опыт оптимизации сайтов, где основной контент - комментарии или отзывы, вы должны знать, что комментарии работают для удержания, вовлечения, взаимодействия с аудиторией, но редко для поисковика.
Контент для поисковика на таких сайтах это обычно описание карточки товара/продукта/услуги/новости.
Боитесь дублирования - вы можете подгружать контент с блокчейн динамически и асинхронно не храня его в своей базе. Гугл только учится распознавать ajax, до вебсокетов еще не скоро дойдет.
Посмотрите на сайты тур операторов - у них у всех одна база из которой они динамически тянут фид туров. Их seo это какой-то замшелый бложик или устаревшие статьи, которые никто не читает + переспам оптимизаторами по вине алчных владельцев. Но тем не менее индексируются хорошо, те которые предоставляют хороший сервис. Нормальный поисковик не будет игнорировать сайт с не оптимизированным контентом, если он нравится пользователю
Нынешние и грядущие реалии SEO таковы, что если вы будете строить сайт ориентируясь на оптимизацию для поисковика, а не на сервис для пользователя - в топ выдачи надолго вы не попадете или не попадете вовсе. А даже попав - едва-ли будут высокие конверсии.
Предложенное мною лишь инструмент, который каждый волен использовать по своему. Если вы преследуете цель получить дешевый контент на свой сайт, то вне зависимости от способов достижения цели, будь-то парсинг, копипаста, интеграция с голосом и т.п. - получите вы именно дешевый контент, который в будущем может стать причиной пессимизации.
Однако, если цель построить клиентооринтированный для пользователей сервис - вы удивитесь насколько лояльны могут быть поисковики!
Основываясь на личном опыте:
Пример 1. Востребованный сервис с дублированным контентом, огромным количеством исходящих ссылок - уверенно живет на своих позициях благодаря поведенческому фактору. Когда был переезд на новый домен и временный вылет в период переиндексации - трафик естественно на время упал, но конверсии не уменьшались, хороший сайт проживет и без гугла, но гугл такие сайты не "отпустит" :)
Пример 2. Оптимизированный сайт с уникальным контентом, соблюдением всех "рекомендаций для вебмастеров" Медленно падает уступая примеру 1.
Пример 3. Сайт, весь контент на котором - результат работы парсера по соцсетям - откровенно дублированный контент. Но он удобно раскладывается по категориям и единственный сервис - это удобная навигация по содержимому, что нравится пользователям. Сайт работает год, неуверенно вылез в топ по нескольким ВЧ и уверенно поселился по множеству НЧ.
И таких примеров еще много.
Да, сейчас поведенческие факторы многое значат. И сейчас ПС не смотрят только на один фактор ранжирования, их сотни. И да можно обойтись без одно из самых важных, это контент. Но нужно реализовать удобный и продуманный сайт и при этом завлечь толпы народу. Пример с сайтами туров плохой, так как там действительно больше акцент не на сам контент. А вот ваши три примера с сайтами очень хороший пример тому что это все можно реализовать. Но таких как Вы мало и создать такой проект сможет один из ста, а то и с тысячи людей.
Но после ваше поста, я стал еще более лояльно относится к вашей затеи. Желаю вам что бы у вас все вышло. Идея интересная, жду продолжения.
Мне тоже интересен ответ на этот вопрос.
Если все будет так, как описывает @skvirus, то смысла в дублировании материала в Голос действительно нет.
Вот бы готовый плагин...
Мечта!
Данный плагин можно установить и пользоваться.
Но суть урока не в том, что бы предоставить продукт - а в том, что бы научить делать свой собственный :) Вокруг API голоса можно построить очень много разных плагинов.
@vik а где можно с API ознакомиться?
Например тут
https://github.com/steemit/steem-js/tree/dev/doc#broadcast
Благодарю.
@vik Попробовал плагин по вашей инструкции. В принципе работает (о, чудо!). Но есть проблемы, прошу помочь, если возможно.
@vik привет.
Слушай, тоже подключаюсь по js, хочу создать пост. Трабла с json_metadata.
Вот тут например с тэгами всё ок:
А тут массив заэкранирован несколько раз:
Пост создавал так
Может json_metadata массивом надо передавать, а не строкой?
Да, вероятно где-то остался старый черновик.
Пример из https://golos.rubtc.info/r/
Да, на скриншотах кода у тебя строкой всё это. Тоже уже в ходе экспериментов убедился, что объект надо передавать.
"Мама, я в телевизоре!"
Огромная благодарность за сей пост. Уже есть в какую сторону думать.
Очень надеюсь на дальнейшее развитие плагина. Увидеть такой в БД вордпресса, с автоматическим обновлением, настройкой в админке и прочими благами цивилизации..... Эх о таком можно мечтать как раньше мечталось о наступлении дня рождения или новом годе.
@vik, Поздравляю!,
Ваш пост был упомянут в моем хит-параде в следующей категории:
Круто! Хочу отметить, что Вы можете рассмотреть возможность участия в программе #открытый-код оформив проект на Github соответствующим образом.
Можно уточнение? Какой именно js файл нужно подключить к странице? не увидел этого в коде
Подключайте этот https://github.com/ontofractal/golosjs/blob/master/dist/golos.min.js
Возможно будет нужно отредактировать wss://ws.golos.io - просто добавить / в конце.
Благодарю, разобрался. А вот если говорить про методы getDiscussionsBy... не знаете какой там объект в качестве query передается?
Попробуйте [tag,limit]
Вот аналог запроса без библиотеки, на чистом js
{"id":2,"method":"get_discussions_by_votes","params":[{"tag":"golos","limit":"10"}]}
В демо https://golos.rubtc.info/post/ добавить фото может только залогиненный пользователь. Гость по-просту не увидит кнопки добавления медиа. Это можно исправить хуком WP, однако стоит понимать, что давать загружать фото всем гостям вашего сайта может быть чревато спамом, ошибками и т.д.
Может я пропустил скоротечный бег жизни...
А уже есть на голосе набор тэгов, которые автоматом исключаются из общей ленты?
Как минимум nswf
Так же есть у БМ
Ну и наверняка другие
Можно попросить команду исключить ваш тег-id с главной голоса.
Спасибо за сведения :)