Skip to content

Instantly share code, notes, and snippets.

@sxidsvit
Last active February 25, 2022 14:48
Show Gist options
  • Save sxidsvit/3299ce0c29feab3ae915b5c516bde09d to your computer and use it in GitHub Desktop.
Save sxidsvit/3299ce0c29feab3ae915b5c516bde09d to your computer and use it in GitHub Desktop.
ACF плагин: создаем дополнительные параметры в списках условий отображения мета-полей
<?php
/**
* ACF создаем своё условие отображения форм на примере рубрик ( дополнительный параметр категории )
* Скрипт написано по мотивам статьи https://wp-kama.ru/plugin/acf/dobavlenie-polej-k-opredelennoj-rubrike
* и видео https://www.youtube.com/watch?v=mHJHnyPLf0M&t=39s
*/
// Создаем новое правило
add_action( 'admin_init', 'asp_acf_new_condition');
function asp_acf_new_condition () {
add_filter('acf/location/rule_types', 'asp_location_rules_types');
function asp_location_rules_types($choices)
{
$key = __('Forms', 'acf');
if ( ! isset( $choices[$key] ) ) {
$choices[$key] = [];
};
$choices[$key][ 'category_id' ] = __('Category');
// error_log(print_r($choices, 1));
return $choices;
}
// Формируем список значений которые может принимать правило
add_filter( 'acf/location/rule_values/category_id', 'asp_location_rules_values_category_id');
function asp_location_rules_values_category_id($choices)
{
$terms = get_terms( [
'taxonomy' => 'category',
'hide_empty' => false,
]);
if ($terms) {
foreach ($terms as $term) {
$choices[$term->term_id] = $term->name;
}
}
// error_log(print_r($terms, 1));
return $choices;
}
// Отображение ACF поля в нужном экране админки
add_filter( 'acf/location/rule_match/category_id', 'asp_location_rules_match_category_id', 10, 3);
function asp_location_rules_match_category_id($match, $rule, $options) {
//error_log(print_r($rule, 1));
$screen = get_current_screen();
//error_log(print_r($screen, 1));
if ( $screen->base !== 'term' || $screen->id !== 'edit-category') {
return $match;
}
$term_id = $_GET[ 'tag_ID' ];
$select_term = $rule[ 'value' ];
if ( $rule[ 'operator' ] === '==') {
$match = ( $term_id == $select_term );
}
elseif ($rule[ 'operator' ] === '!=') {
$match = ( $term_id != $select_term );
}
return $match;
}
}
@relaxdd
Copy link

relaxdd commented Feb 25, 2022

Это в принципе похоже на то что мне нужно, только я не через фильтры делаю а через расширение класса ACF_Location, не знаю разумнее это или нет, правда проблема в том что в методе match я не получал параметром screen->tag_ID его попросту не было на странице редактирования категории товара, вот пример кода:

`<?php

if (!defined('ABSPATH')) exit;

class My_ACF_Location_Taxonomy_Category extends ACF_Location {
public function initialize() {
$this->name = 'taxonomy_category';
$this->label = __("Категория товара", 'acf');
$this->category = 'Товары';
$this->object_type = 'product';
}

public function get_values($rule) {
    $choices = array();
    $categories = get_categories([
        'taxonomy'     => 'product_cat',
        'type'         => 'product',
        'child_of'     => 0,
        'parent'       => 0,
        'orderby'      => 'date',
        'order'        => 'ASC',
        'hide_empty'   => 1,
        'hierarchical' => 1,
        'number'       => 0,
        'pad_counts'   => false,
    ]);

    if ($categories) {
        foreach ($categories as $category) {
            $choices[$category->term_id] = $category->cat_name;
        }
    }

    return $choices;
}

public function match($rule, $screen, $field_group) {
    ?>
    <script>
        console.log(`<?php var_dump($screen); ?>`);
    </script>
    <?php
    if (isset($screen['tag_ID'])) {
        $tag_ID = $screen['tag_ID'];
    } else {
        return false;
    }
    

    // Load the post object for this edit screen.
    $category = get_term($tag_ID, 'product_cat');
    if (!$category) return false;

    // Compare the Post's author attribute to rule value.
    $result = ($category->term_id == $rule['value']);

    // Return result taking into account the operator type.
    if ($rule['operator'] == '!=') return !$result;

    return $result;
}

}`

@relaxdd
Copy link

relaxdd commented Feb 25, 2022

Но я вижу что ты получаешь term_ID через $GET, в принципе попробую сделать так же

@relaxdd
Copy link

relaxdd commented Feb 25, 2022

Да и вправду, теперь match работает, нужно проверить что на каждой категории будет свое поле, как проверю закину сюда полный код если кому то в будущем понадобится

@relaxdd
Copy link

relaxdd commented Feb 25, 2022

код и в правду работает, однако не совсем так как мне нужно, я рассчитывал что значение поля в указанных категориях будет привязываться не к конкретной категории а к группе категорий которые я перечисляю в условиях отображения, видимо придется еще подумать или забить и просто скачать acf pro и вынести в option но как то не хочется

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment