ЧПУ ссылки Wordpress

191
24 января 2019, 04:30

вообщем в чем проблема есть сайт на вп нужна структура ссылок ЧПУ состояющая из таксономий. Сразу говорю что статью подсмотрел на каме, под себя переделал и урлы поменялись в админке на те что нужны мне и ссылки тоже везде поменялись но проблема в том что выдает 404 ошибку при переходе по ссылкам. Я уже и обновлял пермалинки в постоянных ссылках меню и произвольные пермалинки поставил %postname и что только не делал но заставить понимать вп мои ссылки никак не могу. Мой код ниже. Посоветуйте что-то ибо дня 4 уже сижу над этой проблемой.

add_filter('term_link', 'deal_realty_tax_link_fix', 10, 3);
        function deal_realty_tax_link_fix( $link, $term, $taxonomy ){
            if( ! in_array( $taxonomy, array('property-status') ) ) return $link;
            $uri = $_SERVER['REQUEST_URL'];
            if( $taxonomy == 'property-status' ){
                $link = preg_replace('~^(.*?/)(?:'. implode('|', __type_deal_elements()) .')/.*~', '\1', $uri ) . $term->slug;
            }

            return esc_url( user_trailingslashit(home_url($link)));
        }
        if(1){
            //add_action('wp', 'xxxxxxx'); // debug
            function xxxxxxx($wp){
                print_r( get_queried_object() );
                print_r( $wp );
                print_r( $GLOBALS['wp_rewrite'] );
                exit;
            }
            global $wp_rewrite;
            $wp_rewrite->add_permastruct('property', '%property-status%/%property-type%/%property-city%/%postname%/', false);
            // поправим параметры запроса - удалим 'country' и добавим 'post_type=realty', потому что '?p=208' не работает, а '?p=208&post_type=realty' работает
            //$this->query_vars = apply_filters( 'request', $this->query_vars );
            add_action('request', 'remove_unwanted_query_vars' );
            function remove_unwanted_query_vars( $vars ){
                if( !empty($vars['property-city']) ){
                    $_city = explode('/', $vars['property-city']);
                    $vars['property-city'] = end( $_city ); // последний элемент
                }
                if( !empty($vars['property-type']) ){
                    $_property_type = explode('/', $vars['property-type']);
                    $vars['property-type'] = end( $_property_type ); // последний элемент
                }
                // запрос типа записи 'realty' - параметры: country, type_realty, type_deal
                if( isset($vars['p'], $vars['property-type']) && $vars['post_type'] === 'property' ){
                    $deal = __type_deal_elements();
                    if( $vars['property-status'] == end($deal) )
                        unset( $vars['property-status'] );
                }
                return $vars;
            }
            //add_rewrite_rule('^property/.+?/(?:sale|rent)/.+?/([0-9]+)/?', 'index.php?p=$matches[1]&post_type=property', 'top' );
            add_filter('property'.'_rewrite_rules', 'delete_property_rewrite_rules' );
            function delete_property_rewrite_rules( $rules ){
                // должен быть до правил стран
                $rules = array(
                    'property/('. implode('|', __type_deal_elements() ) .')/(.+?)/(.+?)/([0-9]+)/?$' => 'index.php?post_type=property&p=$matches[1]&property-status=$matches[2]&property-type=$matches[3]&property-city=$matches[4]',
                );
                return $rules;
            }
            ## добавим правила перезаписи для 'country', 'type_deal', 'type_realty'
            add_filter('city'.'_rewrite_rules', 'add_more_city_rewrite_rules' );
            function add_more_city_rewrite_rules( $rules ){
                // должен быть после правил типа запии 'realty'
                $_first_part = '/(.+?)/('. implode('|', __type_deal_elements() ).')';
                $_pade_part = 'page/?([0-9]{1,})';
                $more_riles = array(
                    "$_first_part/(.+?)/$_pade_part/?$" => 'property-status=$matches[1]&property-type=$matches[2]&property-city=$matches[3]&paged=$matches[4]',
                    "$_first_part/$_pade_part/?$"       => 'property-status=$matches[1]&property-type=$matches[2]&paged=$matches[3]',
                    "$_first_part/(.+?)/?$"             => 'property-status=$matches[1]&property-type=$matches[2]&property-city=$matches[3]',
                    "$_first_part/?$"                   => 'property-status=$matches[1]&property-type=$matches[2]',
                );
                $rules = array_merge( $more_riles, $rules );
                //die( print_r($rules) );
                return $rules;
            }
            // array( sale, rent, sale-rent )
            function __type_deal_elements(){
                $deal_terms = get_terms(array( 'taxonomy'=>'property-status','hide_empty'=>0, 'fields'=>'id=>slug' ));
                //$deal_terms[] = implode('-', $deal_terms); // sale-rent
                return $deal_terms;
            }
    ## Отфильтруем ЧПУ произвольного типа
            add_filter('post_type_link', 'property_permalink', 1, 2);
            function property_permalink( $permalink, $post ){

                if( false === strpos($permalink, '%property-city%') ) return $permalink;
                //global $wp_rewrite;
                //$perm = $wp_rewrite->get_extra_permastruct('realty');
                // Получаем элементы таксы 'country'
                $city_path = __build_tax_uri( get_the_terms( $post, 'property-city') ); // много уровней - asd/asd
                // type_realty_path
                $property_type_path = __build_tax_uri( get_the_terms( $post, 'property-type') ); // много уровней - asd/asd
                $property_status_path = __build_tax_uri( get_the_terms( $post, 'property-status') ); // один уровень - asd
                return strtr( $permalink, array(
                    '%property-status%'   => $property_status_path,
                    '%property-type%' => $property_type_path,
                    '%property-city%'     => $city_path,
                    '%postname%'     => $post->post_name,
                ) );
            }
                ## Получает цепочку из ярлыков указанного термина - вврехи пока у термина не будет родителей - 'parent/child/child'
            function __build_tax_uri( $terms ){
                if( is_wp_error($terms) || empty($terms) || ! ( is_object(reset($terms)) || is_object($terms) ) )
                    return 'no_terms'; // элемента таксы нет, а должен быть...
                $term = is_object(reset($terms)) ? reset($terms) : $terms;
                $path = array( $term->slug );
                while( $term->parent ){
                    $term = get_term( $term->parent );
                    $path[] = $term->slug;
                }
                return implode('/', array_reverse($path) );
            }
    add_action('template_redirect', 'rudr_post_type_redirect');
READ ALSO
unordered_map с кастомнымными функциями в классе

unordered_map с кастомнымными функциями в классе

Мне надо хранить в классе соответствия между строками и числамиПорядок не важен, поэтому хочу использовать std::unordered_map, причём строки должны...

131
Как из бинарника и dll сделать единый .exe файл?

Как из бинарника и dll сделать единый .exe файл?

Файл helloexe, при запуске требует dll'ки, могу закинуть их в папку, но можно ли сделать hello

148
Как реализовать нормальное меню?

Как реализовать нормальное меню?

Есть класс в котором перегружаются операцииВ main происходит тестирование перегрузок, т

166
Вывести 1000 знаков суммы ряда

Вывести 1000 знаков суммы ряда

есть бесконечный ряд

156