Кратък код за текст в две колони

===== Оказа се, че прилагането на филтъра the_content води до неправилно показване на бутоните за харесване/споделяне във Facebook( използвам Facebook Social Plugins ), за това, просто използвам функцията wpautop() вместо филтъра. Най-вероятната причина е, че Plugin-a добавя бутоните, когато се прилага филтъра the_content (поне аз така предполагам ) и се получават няколко бутона и също така се вижда масив( което от друга страна, ако се прескочи проблема с масива, звучи като интересна идея да има по няколко бутона за споделяне/харесване в една публикация )
ПП: няма да правя нова публикация за промяна #10, поради простата причина, че това е малка поправка, която на всичкото отгоре е описана тук =====

Ето го и първия пост в пресния блог(топъл топъл, направо пари ). Тук ще ви представя едно може би за някои полезно приложение на кратките кодове в WordPress ( Shortcode API ). Благодарение на него, следващия текст е автоматично разделен в две колони.

След като си харесах тема за блога, естествено трябваше да я почовъркам от вътре… Първото което направих беше, да се отърва от досадното „Copyright Moon Watch. All rights reseved“ и да го заменя с по-благозвучното „Copyleft Moon Watch. All Wrongs Reserved

Добавих си няколко полезни плъгин-а ( Cyr-To-Lat, FancyBox for WordPress, FD Feedburner Plugin и SyntaxHighlighter Plus, като за начало ) и си създадох началната страница.

След това малко се разочаровах, че темата по принцип не поддържа Менюта, за това си добавих и тях. Все още няма кой знае каква полза, но с времето ще се стигне и до тях.

И се зачудих, какъв да ми бъде първия пост… Ами какъв, какъв – някакво обяснение на български, за нещо което ме е затруднило в началото и ми изглежда полезно

Това е кратък код, който разделя съдържанието си на две колони( според броя параграфи ). Този кратък код, поради естеството си на действие не дава голям или удобен контрол над съдържанието на колоните, но скоро ще постна и другия, който дава по-голям контрол.

Но пък за сметка на това, този е по-мързеливия от двата, тъй като се използва един код за двете колони, докато при другия се използват два различни за всяка колона. Ето го и самия код :

 

Първо добавям следната функция ( източник : dBuggr ), за намиране позицията на N-то повторение на един текст в дург

/*
*
* @Find position of Nth occurance of search string
* @param string $search The search string
* @param string $string The string to search
* @param int $offset The Nth occurance of string
* @return int or false if not found
*
*/
function strposOffset($search, $string, $offset)
{
/*** explode the string ***/
$arr = explode($search, $string);
/*** check the search is not out of bounds ***/
switch( $offset )
{
case $offset == 0:
return false;
break;

case $offset > max(array_keys($arr)):
return false;
break;

default:
return strlen(implode($search, array_slice($arr, 0, $offset)));
}

}

След което регистрирам и самата функция, която ще борави със съдържанието на краткия код :

// Прилагане на филтъра "the_content" върху съдържанието между отварящия и затварящия таг на краткия код, за да се добавят параграфите, новите редове и т.н.
</code>$content = wpautop( $content, 1 );
//Оказа се, че прилагането на филтъра the_content води до неправилно показване на бутоните за харесване/споделяне във Facebook( използвам FB Social Plugins ), за това, просто използвам функцията wpautop() вместо филтъра. Най-вероятната причина е, че Plugin-a добавя бутоните, когато се прилага филтъра the_content (поне аз така предполагам )
//$content = apply_filters('the_content', $content );

// Преброяване на общия брой параграфи в съдържанието
$p_count = substr_count($content, '</p>');

// Ако броя параграфи е нечетно число, увеличаваме $p_count с 1, така че параграфите в лявата колона да са повече от тези в дясната
$p_count = ( $p_count % 2 != 0 ) ? $p_count + 1 / 2 : $p_count / 2 ;

// Изчисляване на позицията на "средния" параграф( или иначе казано, този който ще раздели текста на две )
$middle_p_pos = strposOffset( '</p>', $content, $p_count );

// Ако функцията върне FALSE( тоест има само 1 параграф ), връщаме $content, само с приложения филтър. В противен случай, разделяме текста на две колони
if ( $middle_p_pos != false ) {
$left_col = '<div class="left-column">' . substr_replace( $content, '</p></div>', $middle_p_pos );

// Понеже $middle_p_pos е позицията преди затварящия </p> таг, увеличаваме с 4 за да не бъде част от съдържанието на дясната колона. Добавяме "clear", така че последващото съдържание на страницата няма да се "обтича" ( ??? => добре, де не ми идва друга дума ) отстрани/между двете колони
$right_col = '<div class="right-column">' . substr( $content, $middle_p_pos + 4 ) . '</div><div class="clear">&amp;amp;amp;amp;amp;nbsp;</div>';

// $content присвоява стойностите на лявата и дясната колона
$content = $left_col . $right_col;
}
// Връщаме $content
return $content;

}
// Регистрираме краткия код
add_shortcode('cols', 'two_columns_shortcode');

Ето ги и попълненията в стиловата таблица :

#content .right-column {
float: right;
width: 46%;
}

#content .left-column {
float: left;
width: 46%;
}

.clear {
clear: both;
height: 0px;
text-indent: -4000px;
line-height: 0;
}

Долу-горе това е всичкия код. PHP кода се добавя във functions.php, задължително след отварящ таг( <?php ) и преди затварящия таг (  ?> )

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *