[Решено на 80%] Сервис сокращения ссылок

Вот результат (первый топорны) !!

Давно болел идеей поднять свой (закрытый-а позже может и открытый) сервис сокращения ссылок как у goo.gl и других.

1 Покупка отпадает, так как таких сервисов много и их нужно развивать и продвигать, и доход очень сложно сейчас с сервиса поднять, а также иногда не устраивает дизайн или функционал (короче свои бубенцы в голове) и его сложно будет править.
1.2 Заказать плагин не вариант - однажды думал за 100$ купить+ на 50$ доработок заказать - в итоге справился сам 10-20 строчками кода и 10 переделываний по феншую
2 Бесплатные отпадают - часто вирусню можно подхватить или взлом (моя параноя), а также проекты некоторые закрылись, а другие не известно когда закроются, а так же часто движки примитивны до безобразия
3 На базе вордпресс - не так страшно за взлом, частые обновления, легко править и все остальные преимущества движка

требования к сервису
1 Только вордпресс (решено)
2 возможность редактирования полученных ссылок
3 Минимальная (позже максимальная) статистика
4 Возможность выбора редиректа с рекламой или без
5 возможность выбора реклама взрослая или с детским фильтром
6 Возможность массового редактирования
7 Возможность массового просмотра (решено)

как я себе это представлял:
Создам отдельную таблицу БД, впишу туда ссылки и прочее, потом подшаманю и буду прямые записи ссылок и статистики в эту таблицу делать и все заработает. Но не все для меня так просто))

Как я вижу это сейчас - У вордпресса есть форматы постов, на этом думаю и сыграю
1,1 Создам отдельный формат поста к примеру "Shortlink"
1,2 В БД wp_posts - нужно будет добавить парочку столбцов: URL-редиректа, реклама ON or OFF, тип рекламы Править таблицы БД
2,1 Создам отдельную страницу (шаблон) для ввода ссылки для сокращения, со страницы ссылка с настройками будет попадать в таблицу бд "Shortlink" - PHP-wp_insert_post
2,2 добавить при создании ссылки - парсер заголовка целевой страницы
2,3 как решить проблему с аяксом - т.е. вывод нового URL - не знаю
2.4 Решить вопрос с генерацией новых урл = чтоб wordpress перепроверял существующие и при совпадении заново создавал анадромный URL
3 Создам отдельный дизайн под посты "Shortlink" - данный вопрос уже на где-то описывался
4 Создам отдельное меню в админке "Все Shortlink"
5 настройки к страницам можно реализовать как и через произвольные поля так и через таксономии - через таксономии можно будет массово редактировать ссылки
6 - вопрос татистики от части отпадает, так как есть достаточно плагинов ))

Много чего не знаю и не знаю смогу ли реализовать - буду собирать инфу в данной записи по крупицам

Интересуют ваши советы и предложения (если есть подобного рода плагин, то будет вообще отлично)

Делов на 20 минут, а изучения на год!

РЕШЕНИЕ

1.0 Используем Формат постов
1.1 Если не включено, то включаем нужные (для меня нужен link)

    add_theme_support( 'post-formats', array(
		'aside',
		'image',
		'video',
		'quote',
		'link',
		'gallery',
		'status',
		'audio',
		'chat',
	) );

2.0 Шаблон страницы
2.1 Создаем свой шаблон страницы которая будет отвечать за обработку ссылок, так как я не умею правильно пользоваться формами и прочим, сделал как мог.
2.2 Я создал шаблон и поместил (зарегистрировал\создал URL ) его по адресу moi_example.com/sql/ - каждый настраивает под себя
2.3 Заполняем шаблон

<?php
/*
Template Name: Hide URL
*/
?>

<?php get_header(); ?>

<body>
   <h1>Страница сокращения ссылок:</h1>   
		<form method="post">
			Оригинальный URL: <input type="text" name="original_url" required/><br />            
			<?php
			$my_site_url = $_SERVER['SERVER_NAME'];

			// проверяем валидность URL b его заполненость 
			if ($_POST['original_url'] && filter_var($_POST['original_url'], FILTER_VALIDATE_URL) === FALSE && $_POST['original_url'] !== $my_site_url."/sql/") {                       
				$bad_url = true;
			} else {    
				// вторая проверка - тут можно установить стоп слова и прочие проверки 
				if ($_POST['original_url'] !== NULL && $_POST['original_url'] !== $my_site_url."/sql/" ){       
					// рандомный URL 
					$length = 10;
					$chars = 'abcdefghijklmnopqrstuvwxyz123456789';
					$numChars = strlen($chars);
					$string = '';
						for ($i = 0; $i < $length; $i++) {
							$string .= substr($chars, rand(1, $numChars) - 1, 1);
						}   
					$new_random_url = $string;                      // запись в БД (guid)
					$full_new_url = $my_site_url.'/'.$string.'/';   // ссылка для пользователя
				}
			}
			?>   
			<input type="submit" value="Генерируем адрес" />
		</form>   

	<?php
	// вывод 
	if ( $bad_url == true) {
		// плохой URL 
		echo '<h2 style="color: red;">Плохой URL</h2>';
	} else {    

		if ( !$bad_url && !empty($_POST['original_url']) && $_POST['original_url'] !== NULL && $_POST['original_url'] !== $my_site_url."/sql/" ){
			echo "<b>Оригинал</b> <BR>";
			echo $original_url = $_POST['original_url'];

			echo "<BR>";
			echo "<b>Новый URL</b> <BR>";
			echo $full_new_url;

			echo "<BR>";
			echo "<b>Title сокращённой ссылки:</b><BR>";

			// парсим записываем и выводим title 
			$page = file_get_contents($_POST['original_url']);
			$pattern = "#<title>(.*?)</title>#";
			preg_match($pattern, $page, $matches);
			htmlspecialchars($matches[0]); // результат с тегами
			//ограничиваем символы в title 
			echo $page_shrink_title = mb_strimwidth(wp_strip_all_tags($matches[1]), 0, 65,"");
			// если не удалось получить title 
			if (empty($page_shrink_title)){
				$page_shrink_title = $new_random_url; // "NO TITLE";
			}

			// Создаем массив для базы данных 
			$post_data = array(
				'post_title'    => $page_shrink_title,
			//  'post_content'  => 'Здесь должен быть контент (текст) записи.',
				'post_status'   => 'publish',
				'post_author'   => 1,
				'post_name'     => $new_random_url // - запись рабочего урл     
			);

			// Вставляем данные в БД для перенаправления 
			$post_id = wp_insert_post( wp_slash($post_data) );

			set_post_format( $post_id, "link" ); // вносит изменения в wp_term_relationships - устанавливает тем самым формат   LINK        
			update_post_meta($post_id,'redirect_url',$original_url); // создаем в пост мета таблицы с целевым URL 
		}
	}
	?>   
</body>

<?php get_footer(); ?>

3.0 Админка постов
3.1 Создаем для удобства дополнительную колонку просмотра целевого URL (добавляем в functions.php)

// создаем новую колонку
add_filter('manage_post_posts_columns', 'add_meta_column_original_url', 4);
function add_meta_column_original_url( $columns ){
	$num = 10; // после какой по счету колонки вставлять новые
	$new_columns = array(
		'original_url' => 'Целевой URL',
	);
	return array_slice( $columns, 0, $num ) + $new_columns + array_slice( $columns, $num );
}

// заполняем колонку данными
add_filter('manage_post_posts_custom_column', 'fill_column_original_url', 5, 2); // wp-admin/includes/class-wp-posts-list-table.php
function fill_column_original_url( $colname, $post_id ){
	if( $colname === 'original_url' ){
		echo get_post_meta($post_id, 'redirect_url', 1);   
	}
}
// подправим ширину колонки через css
add_action('admin_head', 'add_column_original_url_css');
function add_column_original_url_css(){
	if( get_current_screen()->base == 'edit')
		echo '<style type="text/css">.column-original_url{width:350px;}</style>';
}

3.2 Добавляем колонку статистики просмотров\переходов через плагин к примеру "WP-PostViews" - или какой вам более подходит

4.0 Свой шаблон для постов формата LINK
4.1 В директории темы создаем файл post_sql.php либо сразу в файл single.php вписываем код
либо почитать про format-link.php
4.2 Я сразу вписал код в single.php позже буду создавать несколько шаблонов, так как некоторые шаблоны будут без рекламы и быстрым редиректом, другие с рекламой только для взрослых, остальные шаблоны для просмотра всем без ограничений
В single.php перед get_header(); вставляем код, в нем таймер на редирект на 10 секунд

    if ( has_post_format( 'link' )) {
		get_header(); 
		//  header('Refresh: 5; url=http://rambler.ru/');
		echo 'Это страница ссылка ))';  
		echo "<br> Едем сюда через 10 секунд <br>   ";  
		echo $value = get_post_meta( $post->ID, 'redirect_url', true ); //> значение 1

	?>
	<script type="text/javascript"> 
		setTimeout('location.replace("<?php echo $value ?>")',10000); 
	</script> 
	<meta http-equiv="refresh" content="10; url=<?php echo $value ?>">   
	<?php 

	get_sidebar();
	get_footer(); 

	} else {

вот на выходе 2 страницы , одна ввода , другая промежуточная

в результате все работает, но нужно тестировать и подгонять CSS и прочие плюшки, тем более что я не знаю как передавать переменные из формы в формате POST в php файлы (я так на всех примерах видел), а также не дошел до использования AJAX

Пока что в раздумиях - куда писать параметры для ссылок (с рекламой или без)
1 - можно добавить дополнительную колонку в wp_posts - но тем самым частично нарушу структуру WP
2 - можно в post_meta, это будут лишние запросы и лишние затраты, но думаю они минимальны для 20000 переходов в сутки

Уже отловил пару БАГОВ!

Заметки к вопросу:
Kama 6.6 лет назад

Неужели оно того стоит? Вижу по коду много недоработок. Например почему юзаешь $_SERVER['SERVER_NAME'], а не home_url(), почему в хэше не фигурирует сам URL, так ведь он теоретически может быть не уникальный...

Хотя я не понимаю логику, зачем все это нужно, зачем в типы записей это все писать, зачем такая сложная структура, только для того чтобы дать статье короткий URL. Тут сложно что-то комментировать, по моему больше похоже на попытку что-то сделать, а получается просто упражнения в коддинге. Поэтому держи в курсе, что там будет получаться, возможно сам поймешь потом что все делал не так или наоборот smile

kolshix 6.6 лет назад

только для того чтобы дать статье короткий URL - не путайте! цель не сократить а замаскировать и показать свою рекламу! к сайту на котором все делается не имеет никакого отношения (плагины сокращения ссылок которые в базе ВП предназначены только для формирования URL текущего сайта ), этот же код ориентирован на сторонние домены

по поводу home_url() - сам не знаю что лучше - даже статьи по этому поводу находил, задумываться много времени не было, поставил что понравилось.

Хитрость в том что название не несет смысловой нагрузки - а Эта идея нужна для TGP-сайтов - и рекламных ссылок, тема давно рабочая , ранее по 100$ в месяц на автомате получал (сейчас 10$), но зачем кормить других !!

--

немного продвигаюсь, кнопки и таймеры на JS уже прикручиваю - некий Франкенштейн получится, но бесплатно и просто, а главное что в WP уже все есть и придумано до меня, не нужен даже велосипед.

Все замороченные вопросы которые я задаю на этом сайте, я подсмотрел на больших сайтах с большим заработком , типо СОЦСЕТЕЙ, ГАЛЕРЕЙ и ПОРНО-САЙТОВ - и желаю эти идеи воплотить на ВП малой кровью.

Идею выше вынашивал 2 года , но она была не приоритетной, а вчера за 6-10 часов реализовал, и ничего придумывать не пришлось, обидно что плагин не нашел

Kama 6.6 лет назад

Я все равно сути так и не уловил, как это работать должно непонятно, что скрывать зачем скрывать smile

kolshix 6.6 лет назад

Я знаю 4 назначения данных сайтов:
1 - Статистика - этим занимается goo.gl от гугл
2 - Временные сайты + рекламные блоки - человек создает ссылку на товар алиэкспресс [сократил её] , размещает эту сокращённую ссылку на форумах, со временем товар-магазин закрывают, но мертвая ссылка на многих форумах останется, вам достаточно будет на сайте (что я предложил) поменять конечную ссылку на новый товар, тем самым на форумах не нужно все менять, а действий вы затратите только пару кликов и оживите ссылку!
3 - Реклама, размещаете сокращённую ссылку на форуме, человек перед тем как попасть на нужный ресурс просмотрит 5 секунд рекламы , а вы заработаете
4 - Ссылочный спам, когда ресурс забанен, а трафик вам нужен, вы можете потянуть трафик через такой сервис

Kama 6.6 лет назад

Вот, теперь прояснилось 90%!