0
216
2018-11-24

WordPress, JoomSport - Исправляем ошибки в плагине

Решение проблем связанных с настройкой плагина JoomSport с примерами кода. Плюс улучшения для использования плагиан на сайте.
Понравилась страница? Поставь свою оценку!
PLUGIN_STAR_RATINGS.SCORE_TEXTPLUGIN_STAR_RATINGS.VOTES_TEXT

Совсем не давно я имел возможность создания сайта для федерации тенниса. Как оказалось "спортивных решений" среди плагинов для WordPress оказалось совсем не много. И JoomSport PRO версии оказался единственным адекватным вариантом. Но и здесь все оказалось далеко не просто.

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

В остальном пришлось очень много деделывать, допиливывать, додумывать. Временами складывалось ощущение что плагин написан не совсем для опытных пользователей системы WordPress.

Допустим, в реализуемом проекте для заказчика важным было реализовать фильтрацию контента по определенным значениям контента. И если Вам необходимо реализовать тоже фильтрацию контента созданного при помощи плагина джомспорт, настоятельно не рекомендую использевать дополнительные поля которые генерируются через плагин. Так все знчения добавляемые через функционал плагина просто "сбиваются" в один массив и не дадут Вам возможности адекватного ображения к ним со стороны фронтенда (допустим при ajax фильтрации).

За то у плагина есть весьма хорошая команда поддержки которая безукаризненно отвечает на каждое сообщение от покупателей в хелп деске.

Основные правки в плагине:

Удаление копирайта в плагине joomsport

Удаляем копирайт плагина.

Файл:

*/wp-content/plugins/joomsport-sports-league-results-management/sportleague/views/default/season.php

Строка 79:

<div id="copy" class="copyright"><a href="http://joomsport.com">powered by JoomSport - sport WordPress plugin</a></div> 

Удаление ошибки пагинации

Данная правка необходима в случае если у Вас возникла данная ошибка:

Warning: Division by zero in */wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/class-jsport-pagination.php on line 72

Файл:

/sdstudio.club/dev3/wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/class-jsport-pagination.php

Найти 70 строка:

$npage = ceil($this->setcurrent / $limit);

Заменить на:

// SDStudio 
if (isset($limit) && $limit > 0){
$npage = ceil($this->setcurrent / $limit);
};

Добавление отсутствующих данных для JoomSport типов записей

Код предоставленный в данном разделе должен находится в файле function.php темы.

Добавляем эскиз записи для записей JoomSport

//Играки
add_post_type_support( 'joomsport_player', 'thumbnail' );

// Сезоны
add_post_type_support( 'joomsport_season', 'thumbnail' );

Функции обработки данных для JoomSport контента

Внимание все функции должны быть прописаны в файле function.php и находиться в нутри данной функции:

// Основное чудо в названии - save_post_joomsport_player (joomsport_player - кастом тайп записи)

function my_custom_save_post( $post_id ) {

    // Обявляем функцию которая обрабатывает ID записи

    function jswpla__meta_save_SDStudio($post_id) {

//---------------------------------
// ВОТ ЗДЕСЬ ФУНКЦИИ
//---------------------------------

    }
    add_action('save_post', 'jswpla__meta_save_SDStudio');
}

add_action( 'save_post_joomsport_player', 'my_custom_save_post' );

В оббщем для ускорения работы с контентом под управлением JoomSport я решил написать функцию которая будует автоматически добавлять изображение записи в галерею. Причем изображение будет всегда добавлено как первое изображение галереи.

Устанавливаем эскиз записи в первое изображение галереи JoomSport

// Захватываем ID изображения записи
$thumbnail_ID = get_post_thumbnail_id( $post_id );

// Помещаем ID в псевдо массив
$values = [$thumbnail_ID];

// Проверка - Если ID изображения в галарее уже установлено
$check_id_thumb = get_post_meta($post_id, 'vdw_gallery_id');

// Обявляем переключатель истина - лож
$My_False = false;

// Погнали проверять установлен ли ID изображения в массиве галереи
foreach ( $check_id_thumb as $metakey ){

    if (strpos($values, $check_id_thumb) !== false) {
        $My_False = true; // если слова найдены то переключаем на ИСТИНУ
    };

};

if ($My_False) { //если истина то выполняю условие
    // echo 'в тексте есть совпадения';
} else {
    // А вот если нет тогда добавляем ID изображения записи в галерею :)
    add_post_meta($post_id, 'vdw_gallery_id',  $values);

 }

Устанавливаем возраст игрока в матеполе age_field

// ----------------------------
    // get year of birth value
    // https://wordpress.stackexchange.com/questions/243694/create-new-custom-field-that-calculates-age

    // https://support.advancedcustomfields.com/forums/topic/want-to-use-get_post_meta-instead-of-get_field-for-array/

            // $date_of_birth = [_joomsport_player_ef][3];
            $metakey_borthay;

            // Здесь false в конце означает что у нас именно массив данных

            $date_of_birth = get_post_meta($post_id, '_joomsport_player_ef', false);

            foreach ( $date_of_birth as $metakey ){
                        $metakey_borthay =  $metakey[3];
                        // echo $metakey.', ';
                        // Similarly for all the fields you want to print
                    };

            // $year_of_birth = get_field('date_of_birth', $post_id);

            //calculate the value of age
            $age = intval(date('Y', time() - strtotime($metakey_borthay))) - 1970;

            // update the age field
                delete_post_meta($post_id,'age_field');
                add_post_meta($post_id,'age_field', $age);

    // ----------------------------

Сохраняем первую букву фамилии в метаполе First_letter_Last_Name

// Сохраняем первую букву фамилии в кастомное поле First_letter_Last_Name

    // --------------------------------------------------
    // // Берем метадату JoomSport с полями Имя, Фмилия

    $val_last_name = get_post_meta($post_id, '_joomsport_player_personal', false);

    // Объявляем переменную для перебора в Фамилии
    $metakey;

    // Объявляем переменную для Фамилии
    $metakey_Last_Name;

    // Перебором
    // foreach ( $date_of_birth as $metakey ){

        // $val_last_name = get_post_meta($post_id, '_joomsport_player_personal');

        // Путем перебора вставляем в переменную, фамилию
        foreach ( $val_last_name as $metakey ){

                                // Вставили фамилию
                                $metakey_Last_Name =  $metakey['last_name'];

                        };

        // https://stackoverflow.com/questions/21653033/php-how-to-split-a-utf-8-string

        $metakey_Last_Name = preg_split('//u', $metakey_Last_Name, -1, PREG_SPLIT_NO_EMPTY);

        $metakey_Last_Name = $metakey_Last_Name[0];

        // *****************************

        // Проверка - Если ID изображения в галарее уже установлено

        $check_Liter_Last_Name = get_post_meta($post_id, 'First_letter_Last_Name');

        $My_False_Liter_Last_Name = false;

        // Погнали проверять установлена ли буква
        foreach ( $metakey_Last_Name as $check_liter  ){

            if (strpos($check_Liter_Last_Name, $metakey_Last_Name) !== false) {

                                $My_False_Liter_Last_Name = true; // если слова найдены то переключаем на ИСТИНУ

                        };

        };

        if ($My_False_Liter_Last_Name) { //если истина то выполняю условие

            // echo 'в тексте есть совпадения';

        } else {

            // А вот если нет тогда добавляем ID изображения записи в галерею :)

            update_post_meta($post_id,'First_letter_Last_Name', $metakey_Last_Name);

            // add_post_meta($post_id, 'vdw_gallery_id',  $values);

        }

    // --------------------------------------------------

Поиск и замена текста

Хорошая функция для поиска и замены текста в контенте страниц.

// ---- Поиск и замена
// отличная функция замены практически любого контента на странице

function replace_text_wps($text){
    $replace = array(
        // 'WORD TO REPLACE' => 'REPLACE WORD WITH THIS'
        'getimagesizefromstring' => '<a href="#">excerpt</a>',
        'functidrgon' => '<a href="#">function</a>'
    );
    $text = str_replace(array_keys($replace), $replace, $text);
    return $text;

}
add_filter('the_content', 'replace_text_wps');
add_filter('the_excerpt', 'replace_text_wps');

// END

// ----------------------------------------------------------

Шаблоны и вывод страниц созданных JoomSport

Шаблон по умолчанию для страниц "Игрок"

Для добавления шаблона вывода по умолчания для контента (в данном случае кастом типа joomsport_player) необходимо в корне темы создать файл

single-joomsport_player.php

Здесь важно понять что данный шаблон будет применяться по умолчанию для кастомного типа записей в связи с тем что в имени файла мы указали

single-{слаг кастомного типа записей}.php

По такому примеру можно создавать шаблоны по умолчанию и для других типов записей joomSport. Содержимым данного файла является тот код который указан в файле вашей темы дл вывода страниц. У каждой темы он свой. К примеру в теме Cactus для проекта содержимое файла single-joomsport_player.php ывляется таким:

<?php
/*
Template Name: Post joomsport_player
Template Post joomsport_player
*/

 get_header();
 $page_sidebar_layout = apply_filters('cactus_page_sidebar_layout',cactus_option('page_sidebar_layout'));
 switch($page_sidebar_layout){
   case 'left':
     $aside_class = 'left-aside';
   break;
   case 'right':
     $aside_class = 'right-aside';
   break;
   default:
     $aside_class = 'no-aside';
   break;

   };

?>

<?php echo apply_filters('cactus_page_title_bar','','page');?>
<div class="page-wrap">
<?php do_action('cactus_before_page_wrap');?>
  <div class="container">
    <div class="page-inner row <?php echo $aside_class; ?>">
      <div class="col-main">
        <section class="post-main" role="main" id="content">
          <article class="post-entry text-left">
            <?php do_action('cactus_before_page_content');?>
            <?php
       /* Start the Loop */
       while ( have_posts() ) : the_post();

         get_template_part( 'template-parts/page/content' );

         the_posts_pagination( array(
         'prev_text' => '<i class="fa fa-arrow-left"></i><span class="screen-reader-text">' . __( 'Previous page', 'cactus' ) . '</span>',
         'next_text' => '<span class="screen-reader-text">' . __( 'Next page', 'cactus' ) . '</span><i class="fa fa-arrow-right"></i>' ,
         'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Page', 'cactus' ) . ' </span>',
       ) );

       endwhile; // End of the loop.
     ?>
           <?php do_action('cactus_after_page_content');?>
          </article>
          <?php
     global $post;
     if ( comments_open($post->ID) ) :?>
          <div class="post-attributes">
         <!--Comments Area-->
            <div class="comments-area text-left">
              <?php
           comments_template();
       ?>
            </div>
          </div>
          <?php endif;?>
        </section>
      </div>
      <?php cactus_get_sidebar($page_sidebar_layout,'page');?>
    </div>
  </div>
</div>

<?php get_footer();

Шаблон по умолчанию для страниц "Сезоны"

В общем делаем аналогично игракам (смотрим пункт выше).

single-joomsport_season.php

Скрытие дополнительных полей JoomSport для всех кроме администраторов сайта

К моему огромному сожалению разработчики плагина не предусмотрели возможность скрытия дополнительных полей данных с учетом определенной логики. В моем случае отображение определённых дополнительных полей таких как пол игрока, почтовый индекс, адрес проживания, возраст в котором начал заниматься видом спорта, контактный номер телефона и контактный телефон тренера. То есть При необходимости скрыть личные данные которые были добавлены в дополнительные поля реализовать скрытие при помощи функционала плагина у вас не получится.

Поэтому придётся править плагин, точнее определенную его составляющих.

Для реализации открытия определенный дополнительных полей Вам необходимо открыть данный файл:

plugins\joomsport-sports-league-results-management\sportleague\helpers\js-helper.php

И под данными строками:

class jsHelper
{
    public static function getADF($ef, $suff = '')
    {

Вставить даннй код:

// SDStudio
// --------------------------
// Обработка вывода кастомных полей
// Удаляем элементы из массива для  всех кроме администраторов сайта
if (!current_user_can('administrator')){
  unset(
    $ef['Пол игрока'],
    $ef['Почтовый индекс'],
    $ef['Адрес проживания (улица, дом, квартира)'],
    $ef['Контактный телефон тренера']
  );
}
// --------------------------