Вопрос или проблема
На одном из моих сайтов я использую 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, можно создать собственный шорткод, который будет генерировать необходимые вызовы шорткодов на основе текущей даты. Данное решение не только упростит вашу работу, но и поможет избежать ручного обновления параметров даты каждый год.
Создание пользовательского шорткода
- Создайте функцию для вашего нового шорткода:
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);
}
- Регистрация шорткода:
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()
и возвращаются в виде строки.
Заключение
Это решение значительно упростит вашу работу с отчетами по формам в вашем сайте. Вы сможете динамически генерировать необходимые шорткоды, что избавит вас от необходимости вручную обновлять даты каждый год. Если у вас остались вопросы или нужны дополнительные функции, не стесняйтесь спрашивать!