Автоматическое заполнение параметра даты в шорткоде

Вопрос или проблема

На одном из моих сайтов я использую Formidable Forms. Мне нужны ежемесячные данные (простые подсчеты) по отправкам этих форм. Мое текущее решение заключается в использовании этого встроенного шорткода от Formidable:

[frm-stats id=862 type=count created_at_greater_than="2023-12-31" created_at_less_than="2024-2-1" ]

Этот шорткод даст вам количество отправок формы за январь 2024 года

Проблема в том, что мне нужно, чтобы отображались предыдущие двенадцать месяцев, поэтому я повторяю это 12 раз. И затем я делаю это для нескольких форм, так что у меня уже около ста таких шорткодов, и это число медленно растет.

Их нужно обновлять вручную, поэтому каждый год я трачу слишком много времени на обновление всех этих дат в шорткодах. Я хотел бы найти способ автоматического заполнения параметров created_at_greater_than и created_at_less_than.

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

Я не против писать php для этого, просто честно не знаю, с чего начать, так как я взаимодействую с существующим плагином, и я надеюсь, что кто-то из сообщества с большим опытом сможет помочь мне.

Вы можете генерировать шорткоды и запускать их с помощью этой функции:
https://developer.wordpress.org/reference/functions/do_shortcode/

Так что вы можете сделать это в своем плагине:

add_shortcode("MY_PLUGIN__forms_with_dates", function ($atts, $content, $tag) {

    $atts = shortcode_atts([
        "months" => 11,
        "id_form" => NULL,
    ], $atts, $tag);

    if (!isset($atts["id_form"])) {
        return "шорткод $tag : аргумент id_form отсутствует.";
    }

    $shortcodes = "";

    $today = current_datetime()->setTime(12, 0, 0, 0);
    $year_today = wp_date("Y");
    $month_today = wp_date("m");

    foreach (range(0, $atts["months"]) as $months_diff) {

        $first_day = $today->setDate($year_today, $month_today - $months_diff, 1);
        $last_day = $today->setDate($year_today, $month_today - $months_diff + 1, 0);

        $first_day_shortcode = wp_date("Y-m-d", $first_day->getTimestamp());
        $last_day_shortcode = wp_date("Y-m-d", $last_day->getTimestamp());

        $shortcodes .= "[frm-stats";
            $shortcodes .= " id=$atts[id_form]";
            $shortcodes .= " type=count";
            $shortcodes .= " created_at_greater_than=\"$first_day_shortcode\"";
            $shortcodes .= " created_at_less_than=\"$last_day_shortcode\"";
        $shortcodes .= "]";

    }

    return do_shortcode($shortcodes);

});

С этим новым шорткодом вы можете, например, использовать
[MY_PLUGIN__forms_with_dates id_form=862 months=3]
и результат будет эквивалентен этому :

[frm-stats id=862 type=count created_at_greater_than="2024-08-01" created_at_less_than="2024-08-31"]
[frm-stats id=862 type=count created_at_greater_than="2024-07-01" created_at_less_than="2024-07-31"]
[frm-stats id=862 type=count created_at_greater_than="2024-06-01" created_at_less_than="2024-06-30"]
[frm-stats id=862 type=count created_at_greater_than="2024-05-01" created_at_less_than="2024-05-31"]

Я разобрался. В конце концов, я сделал шорткод для заполнения шорткода плагина на основе странной системы смещения финансового года (июль-Йюнь) и строк, которые ожидает шорткод как atts, которые могут быть переданы.

Я не очень хорошо объясняю, но вы можете увидеть мой код ниже.

function quarterly_frm_graph( $atts ) {
    // Атрибуты
    $atts = shortcode_atts( array(
        'fields' => '',
        'filter_field' => '',
        'filter_field_value' => '',
        'type' => '',
        'data_type' => '',
        'height' => 'auto',
        'width' => '100%',
        'quarter_offset' => 0,
    ), $atts );

    // Установите переменные, которые предоставлены в атрибутах шорткода и не требуют дальнейшей обработки
    $fields = "fields=\"${atts['fields']}\"";
    $type = "type=\"${atts['type']}\"";
    $data_type = "data_type=\"${atts['data_type']}\"";
    $height = "height=\"${atts['height']}\"";
    $width = "width=\"${atts['width']}\"";
    $offset = $atts['quarter_offset'];

    // Установите переменную $filter в пустую строку, если атрибут filter_field пуст, иначе задайте ее в соответствии с предоставленными в атрибутах данными
    if (empty($atts['filter_field'])) {
        $filter="";
    } else {
        // Проверьте, пуст ли filter_field_value
        if (empty($atts['filter_field_value'])) {
            return "Похоже, что `filter_field` имеет значение, но `filter_field_value` отсутствует, пожалуйста, предоставьте значение для фильтрации.";
        } else {
            $filter = "${atts['filter_field']}=\"${atts['filter_field_value']}\"";
        }
    }

    // Логика для расчета стартовых и конечных дат квартала
    // Установка переменных
    $now = strtotime('now');
    $fiscal_year_start_month = 7; //Июль

    // Рассчитываем финансовый год на основе текущего года и месяца
    $current_fiscal_year = date('Y', $now);
    if ((date('m', $now) < $fiscal_year_start_month)) {
        $current_fiscal_year--;
    }

    // Рассчитываем текущий календарный квартал и финансовый квартал на основе текущего месяца
    $current_quarter = floor((date('m', $now) - 1) / 3) + 1;
    if (($current_quarter == 1) || ($current_quarter == 2)) {
        $current_fiscal_quarter = ($current_quarter + 2);
    } else {
        $current_fiscal_quarter = ($current_quarter - 2);
    }

    // Рассчитываем финансовый квартал
    $fiscal_quarter = ($current_fiscal_quarter + $offset - 1) % 4;
    if ($fiscal_quarter < 0) {
        $fiscal_quarter += 4;
    }
    $fiscal_quarter++;

    // Рассчитываем стартовые и конечные месяцы для желаемого квартала
    if ($fiscal_quarter == 1) {
        $start_month = 7;
    } else if ($fiscal_quarter == 2) {
        $start_month = 10;
    } else if ($fiscal_quarter == 3) {
        $start_month = 1;
    } else if ($fiscal_quarter == 4) {
        $start_month = 4;
    } else {echo 'ошибка';}

    // Корректируем финансовый год на основе предоставленного параметра смещения
    $fiscal_year = $current_fiscal_year + floor($offset / 4);
    $year = $fiscal_year;
    if ($fiscal_quarter > 2) {
        $year++;
    }

    $start_date_unix = strtotime("${year}-${start_month}-01 00:00:00");
    $start_date = date('Y-m-d H:i:s', $start_date_unix);
    $end_date = date('Y-m-d H:i:s', strtotime("+3 months -1 day 23:59:59", $start_date_unix));

    $start = "created_at_greater_than=\"${start_date}\"";
    $end = "created_at_less_than=\"${end_date}\"";

    //echo $start.'</br>';
    //echo $end;

    // Собираем и запускаем шорткод с заполненными переменными, если $filter не пуст
    if (empty($filter)) {
        // Используем текущий месяц и год
        $formidable_shortcode = "[frm-graph $fields $type $data_type $height $width $start $end]";
    } else {
        $formidable_shortcode = "[frm-graph $fields $filter $type $data_type $height $width $start $end]";
    }

    $do_formidable_shortcode =  do_shortcode($formidable_shortcode);

    return $do_formidable_shortcode;
}

add_shortcode( 'q-frm-graph', 'quarterly_frm_graph' );

Ответ или решение

Чтобы автоматически заполнять параметры даты в шорткоде для плагина Formidable Forms, можно создать собственный шорткод, который будет генерировать необходимые вызовы шорткодов на основе текущей даты. Данное решение не только упростит вашу работу, но и поможет избежать ручного обновления параметров даты каждый год.

Создание пользовательского шорткода

  1. Создайте функцию для вашего нового шорткода:
function automatic_frm_stats($atts) {
    // Определяем параметры по умолчанию
    $atts = shortcode_atts(array(
        'months' => 11,
        'id_form' => NULL,
    ), $atts);

    // Проверка наличия обязательного параметра id_form
    if (empty($atts['id_form'])) {
        return "Ошибка: пропущен обязательный параметр id_form.";
    }

    $shortcodes = "";

    // Получаем текущую дату
    $today = current_datetime()->setTime(0, 0, 0);
    $year_today = wp_date("Y", $today->getTimestamp());
    $month_today = wp_date("m", $today->getTimestamp());

    // Генерируем шорткоды для указанных месяцев
    foreach (range(0, $atts['months']) as $months_diff) {
        $first_day = $today->setDate($year_today, $month_today - $months_diff, 1);
        $last_day = $today->setDate($year_today, $month_today - $months_diff + 1, 0);

        $first_day_shortcode = wp_date("Y-m-d", $first_day->getTimestamp());
        $last_day_shortcode = wp_date("Y-m-d", $last_day->getTimestamp());

        $shortcodes .= "[frm-stats id={$atts['id_form']} type=count created_at_greater_than=\"$first_day_shortcode\" created_at_less_than=\"$last_day_shortcode\"]";
    }

    // Возвращаем все шорткоды, обработанные WordPress
    return do_shortcode($shortcodes);
}
  1. Регистрация шорткода:
add_shortcode('frm_stats_auto', 'automatic_frm_stats');

Использование шорткода

Теперь вы можете использовать созданный шорткод в вашем контенте. Например, чтобы получить данные за последние 12 месяцев для формы с ID 862, просто введите следующее:

[frm_stats_auto id_form=862 months=11]

Здесь months=11 указывает на то, что необходимо получить данные за последние 12 месяцев (11 – это разница в месяцах от текущего месяца).

Объяснение работы кода

  • Функция принимает атрибуты шорткода, включая идентификатор формы и количество месяцев (по умолчанию 11).
  • Проверяется наличие необходимого параметра id_form.
  • Затем создается цикл, который генерирует даты для каждого из последних 12 месяцев, формируя соответствующий шорткод frm-stats.
  • Наконец, все сгенерированные шорткоды обрабатываются функцией do_shortcode() и возвращаются в виде строки.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...