• Здравствуйте уважаемы разработчики!

    Поставил WP 5.0.3
    Использую плагины ACF и WPML.
    Сайт двуязычный

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

    В итоге написал вот такой код и добавил его в файл functions.php темы

    add_filter('acf/validate_value/name=slug', 'slug_validate_value', 10, 4);
    add_filter( 'wp_insert_post_data', 'create_directories_by_slug', 10, 2 );
    
    function check_existing_slug($slug){
        global $wpdb;
    
        $post_id = get_the_ID();
    
        $sql = "
            SELECT 1 FROM $wpdb->postmeta pm
            LEFT JOIN $wpdb->posts p ON pm.post_id = p.id
            WHERE pm.meta_key = 'slug' AND pm.meta_value = '{$slug}' AND p.post_parent != $post_id GROUP BY p.post_parent
        ";
    
        $posts_terms = $wpdb->get_results($sql, ARRAY_A);
        $count = $wpdb->num_rows;
    
        return $count;
    
    }
    
    function slug_validate_value( $valid, $value, $field, $input ){
        if( !$valid ) {
            return $valid;
        }
        $check_slug = check_existing_slug($value);
    
        if ($check_slug) {
            $valid = '123';
        }
        return $valid;
    }
    
    function slug_replace($slug) {
        $pattern = '#[^0-9\\p{L}]+#ui';
        $replacement = '-';
        $slug =  preg_replace($pattern, $replacement, trim($slug));
        $slug = strtolower($slug);
        return $slug;
    }
    
    function create_directory_by_slug($slug) {
        $uploads_dir = ABSPATH . '/uploads/';
        $dir_name = $uploads_dir . $slug;
    
        $languages = wpm_get_languages();
    
        $folders = [
            'description',
            'presentation',
            'best_practices',
            'faces_stories',
            'videos',
            'photos',
            'reports',
            'additional_materials'
        ];
    
        if(!is_dir($dir_name)) {
            mkdir($dir_name);
            foreach ($languages as $code => $language) {
                !is_dir($dir_name . '/' . $code) && mkdir($dir_name . '/' . $code);
    
                foreach ($folders as $folder) {
                    !is_dir($dir_name . '/' . $code . '/' . $folder) && mkdir($dir_name . '/' . $code . '/' . $folder);
                }
            }
            return true;
        }
    }

    Что я хотел получить в итоге?

    Я хотел что если пользователь заполнит поле slug которое уже существует в базе, то мне бы выдалось сообщение об ошибке что оно должно быть у никальным и в итоге, скрипт не создал бы мне нужных папок.

    Подскажите правильно ли я думаю, и если нет то в какую сторону копать.

    Прошу учтите еще то что, это мой первый сайт на WP.

    Спасибо всем заранее!

    • Тема изменена 5 лет, 5 месяцев назад пользователем sashagar.
    • Тема изменена 5 лет, 5 месяцев назад пользователем sashagar.
Просмотр 8 ответов — с 1 по 8 (всего 8)
  • Печально что никто помочь мне не может!

    Либо у Вас у всех не хватает квалификации, либо Вы с такими задачами не сталкивались

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

    Всем спасибо!

    • Ответ изменён 5 лет, 5 месяцев назад пользователем sashagar.

    Спасибо Кэп!

    Значит задача релаьно простая! И не стоит никакого внимания!

    Спасибо Кэп!

    обращяйтесь

    Использую плагины ACF и WPML.

    И я добавлю к вышеизложенному — п9.

    либо Вы с такими задачами не сталкивались

    Конечно не каждый из волонтёров будет покупать плагины (Тем более при наличии бесплатных альтернатив. Тем более чтобы помочь очередному недовольному.)
    Или Вы на полном серъёзе полагаете, что все прям так и должны использовать эти плагины, да ещё и в связке? При этом обязаны проявить интерес к Вашей малопонятной проблеме (слаги и так уникальны в ВП если что.)?
    (Я знаю только одного человека, который оба этих плага неплохо знает. Но его, к сож, нет на нашем форуме)

    Читайте документацию к плагинам, обращайтесь к их поддержке.

    slug жэто кастомное поле. которое уникально для каждой записи. я мог бы его назвать unique_text_field ничего бы не поменялось. код мой с валидацией все ранво бы не работал.

    Да даже если бы я не использовал эти плагины в связке все равно код не работал бы.

    Я описал задачу, для чего я пишу такой код.

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

    Ладно всем добра и позитива.

    Я сначала нагуглил как это можно решить

    Если что — я лично сомневаюсь, что sql-запрос в коде будет правильным решением. У ACF довольно большое кол-во стандартных функций. Но я сам им не пользуюсь (можно сказать что и не люблю его).

    sql -запрос проверяет есть ли уже запись в базе.

    через acf не нашел как это можно узнать.

Просмотр 8 ответов — с 1 по 8 (всего 8)
  • Тема «Помогите разобраться с ACF» закрыта для новых ответов.