Мы используем плагин Search & Filter Pro на нашем сайте WordPress и должны иметь возможность ограничивать результаты для двух конкретных категорий на предварительные даты. Я пытаюсь сделать это без необходимости вручную редактировать более 1000 постов, чтобы изменить категорию или добавить категорию, или потребовать от нас определенного способа разделить посты на эра. В версии 2 я не вижу способа установить мин и/или максимальную дату в управлении диапазоном дат в форме поиска и даже не могу понять, как это сделать в коде (PHP или JS). Это значительно улучшит пользовательский опыт, если пользователи не могут ввести дату за пределами диапазона, чтобы результаты соответствовали введенным датам. Я могу фильтровать за кулисами, используя приведенный ниже код.
function filter_media_release_current_term( $query_args, $sfid ) {
if($sfid==2530 || $sfid==2488)
{
$currentafter = 2025;
$startyear = '2025';
$aftermonth = '01';
$afterday = '01';
$currentbefore = '2025';
// edit later to use a full date, not just year
// if no date query set the after value
if (!isset($query_args['date_query'])) {
$query_args['date_query'] =
array(
'after' => array (
'day' => $afterday,
'month' => $aftermonth,
'year' => $startyear,
),
'inclusive' => true,
);
} else {
// One or both dates are entered: see if they entered a 'To:' date and grab those values
if (isset($query_args['date_query']['before']) && isset($query_args['date_query']['before']['year'])) {
$currentbefore = $query_args['date_query']['before']['year'];
$beforeday = $query_args['date_query']['before']['day'];
$beforemonth = $query_args['date_query']['before']['month'];
if ($currentbefore < $startyear) {
// can't return any results prior to the start date - resets the date query to default
print_r("
Enter dates starting " . $aftermonth ."/" . $afterday . "/" . $startyear . "
");
$query_args['date_query'] =
array(
'after' => array (
'day' => $afterday,
'month' => $aftermonth,
'year' => $startyear,
),
'inclusive' => true,
);
} else {
// Before date is valid
// Did they enter a 'From:' date?
if (isset($query_args['date_query']['after']) && isset($query_args['date_query']['after']['year'])) {
$currentafter = $query_args['date_query']['after']['year'];
// if before start date - reset it to the start date but keep the before entry
if ($currentafter < $startyear) {
print_r("
Start date out of range!
");
$query_args['date_query'] =
array(
'after' => array (
'day' => $afterday,
'month' => $aftermonth,
'year' => $startyear,
),
'before' => array (
'day' => $beforeday,
'month' => $beforemonth,
'year' => $currentbefore,
),
'inclusive' => true,
);
} // no else here - do nothing if both dates are in the valid range
} else {
// no 'From:' date entered - use default from date and the 'To:' date they entered
$query_args['date_query'] =
array(
'after' => array (
'day' => $afterday,
'month' => $aftermonth,
'year' => $startyear,
),
'before' => array (
'day' => $beforeday,
'month' => $beforemonth,
'year' => $currentbefore,
),
'inclusive' => true,
);
}
}
} else {
// they entered only the 'From:' value but make sure it is set to avoid errors
if (isset($query_args['date_query']['after']) && isset($query_args['date_query']['after']['year'])) {
$currentafter = $query_args['date_query']['after']['year'];
// if before start date - reset it to the start date but keep the before entry
if ($currentafter < $startyear) {
print_r("
Start date out of range!
");
$query_args['date_query'] =
array(
'after' => array (
'day' => $afterday,
'month' => $aftermonth,
'year' => $startyear,
),
'inclusive' => true,
);
} // no else here - do nothing if the date is in the valid range
} else {
// no year set for some reason
$query_args['date_query'] =
array(
'after' => array (
'day' => $afterday,
'month' => $aftermonth,
'year' => $startyear,
),
'inclusive' => true,
);
}
}
}
}
return $query_args;
}
add_filter( 'sf_edit_query_args', 'filter_media_release_current_term', 20, 2 );
Это успешно фильтрует результаты, обеспечивая отсутствие результатов до 1/1/2025, даже если они не фильтруют в диапазоне дат. Тем не менее, мне пришлось отключить результаты AJAX, чтобы перезагрузить страницу на каждом отправке вместо не перезагружая, потому что она не проходила эту функцию с обновлениями AJAX. Кроме того, я не могу выяснить, как обновить форму или URL -адрес с этой функции, поэтому на странице отображается «показание результатов от [date] до [date]», используя исходные даты.>
Мы используем плагин Search & Filter Pro на нашем сайте WordPress и должны иметь возможность ограничивать результаты для двух конкретных категорий на предварительные даты. Я пытаюсь сделать это без необходимости вручную редактировать более 1000 постов, чтобы изменить категорию или добавить категорию, или потребовать от нас определенного способа разделить посты на эра. В версии 2 я не вижу способа установить мин и/или максимальную дату в управлении диапазоном дат в форме поиска и даже не могу понять, как это сделать в коде (PHP или JS). Это значительно улучшит пользовательский опыт, если пользователи не могут ввести дату за пределами диапазона, чтобы результаты соответствовали введенным датам. Я могу фильтровать за кулисами, используя приведенный ниже код.[code]function filter_media_release_current_term( $query_args, $sfid ) {
if($sfid==2530 || $sfid==2488) { $currentafter = 2025; $startyear = '2025'; $aftermonth = '01'; $afterday = '01'; $currentbefore = '2025'; // edit later to use a full date, not just year // if no date query set the after value if (!isset($query_args['date_query'])) { $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'inclusive' => true, ); } else { // One or both dates are entered: see if they entered a 'To:' date and grab those values if (isset($query_args['date_query']['before']) && isset($query_args['date_query']['before']['year'])) { $currentbefore = $query_args['date_query']['before']['year']; $beforeday = $query_args['date_query']['before']['day']; $beforemonth = $query_args['date_query']['before']['month']; if ($currentbefore < $startyear) { // can't return any results prior to the start date - resets the date query to default print_r(" Enter dates starting " . $aftermonth ."/" . $afterday . "/" . $startyear . "
"); $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'inclusive' => true, ); } else { // Before date is valid // Did they enter a 'From:' date? if (isset($query_args['date_query']['after']) && isset($query_args['date_query']['after']['year'])) { $currentafter = $query_args['date_query']['after']['year']; // if before start date - reset it to the start date but keep the before entry if ($currentafter < $startyear) { print_r(" Start date out of range!
"); $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'before' => array ( 'day' => $beforeday, 'month' => $beforemonth, 'year' => $currentbefore, ), 'inclusive' => true, ); } // no else here - do nothing if both dates are in the valid range } else { // no 'From:' date entered - use default from date and the 'To:' date they entered $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'before' => array ( 'day' => $beforeday, 'month' => $beforemonth, 'year' => $currentbefore, ), 'inclusive' => true, ); } } } else { // they entered only the 'From:' value but make sure it is set to avoid errors if (isset($query_args['date_query']['after']) && isset($query_args['date_query']['after']['year'])) { $currentafter = $query_args['date_query']['after']['year']; // if before start date - reset it to the start date but keep the before entry if ($currentafter < $startyear) { print_r(" Start date out of range!
"); $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'inclusive' => true, ); } // no else here - do nothing if the date is in the valid range } else { // no year set for some reason $query_args['date_query'] = array( 'after' => array ( 'day' => $afterday, 'month' => $aftermonth, 'year' => $startyear, ), 'inclusive' => true, ); } } } }
return $query_args; } add_filter( 'sf_edit_query_args', 'filter_media_release_current_term', 20, 2 ); [/code] Это успешно фильтрует результаты, обеспечивая отсутствие результатов до 1/1/2025, даже если они не фильтруют в диапазоне дат. Тем не менее, мне пришлось отключить результаты AJAX, чтобы перезагрузить страницу на каждом отправке вместо не перезагружая, потому что она не проходила эту функцию с обновлениями AJAX. Кроме того, я не могу выяснить, как обновить форму или URL -адрес с этой функции, поэтому на странице отображается «показание результатов от [date] до [date]», используя исходные даты.>