• Пользовательская структура постоянных ссылок /%custom-taxonomy%/%post-name%/ (без CPT slug)?

    maksym1991
    @maksym1991 Автор вопроса
    WordPress adept
    Удалось найти решение:
    $args   = array(
        		'labels'             => $labels,
        		'public'             => true,
        		'publicly_queryable' => true,
        		'show_ui'            => true,
        		'show_in_menu'       => true,
        		'query_var'          => true,
        		'rewrite'            => array ( 'slug' => 'products/%catalogs%', 'with_front' => false),
        		'capability_type'    => 'post',
        		'has_archive'        => 'products',
        		'hierarchical'       => false,
        		'menu_position'      => 4,
        		'menu_icon'          => 'dashicons-cart',
        		'supports'           => array( 'title', 'thumbnail' ),
        		'taxonomies'         => array( 'catalogs' ),
        	);
        register_post_type( 'products', $args );
        
        register_taxonomy( 'catalogs', 'products', array(
        		'hierarchical'      => true,
        		'labels'            => $labels,
        		'show_ui'           => true,
        		'query_var'         => true,
        		'show_admin_column' => true,
        		'show_tagcloud'     => false,
        		'rewrite'           => array( 'slug' => 'products', 'with_front' => false ),
        	) );
        
        /** 
    Remove taxony slug, remove CPT slug and add new rewrite rule 
    */
    function remove_tax_slug_link( $link, $term, $taxonomy ) {
        if ( $taxonomy !== 'catalogs' )
            return $link;
     
        return str_replace( 'products/', '', $link );
    }
    add_filter( 'term_link', 'remove_tax_slug_link', 10, 3 );
     
    function custom_tax_rewrite_rule() {
    	$cats = get_terms(
    			'catalogs', array(
    			'hide_empty' => false,
    		)
    	);
    	if( sizeof( $cats ) )
    		foreach($cats as $cat)
    			add_rewrite_rule( $cat->slug.'/?$', 'index.php?catalogs='.$cat->slug, 'top' );
    }
    add_action('init', 'custom_tax_rewrite_rule');
    
    function change_permalinks( $post_link, $post ) {
        if ( is_object( $post ) && $post->post_type == 'products' ){
        	$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
            $terms = wp_get_object_terms( $post->ID, 'catalogs' );
            if( $terms ) {
                return str_replace( '%catalogs%' , $terms[0]->slug , $post_link );
            }
        }
        return $post_link;
    }
    add_filter( 'post_type_link', 'change_permalinks', 10, 2 );
    
    function entry_rewrite_rules() {
        $custom_structure = '/%catalogs%/%products%';
        add_rewrite_tag( '%products%', '([^/]+)', 'products=' );
        add_permastruct( 'products', $custom_structure, array( 'walk_dirs' => false ) );
    
    }
    add_action( 'init', 'entry_rewrite_rules' );
    Ответ написан
    Комментировать
  • Оформление первой записи в цикле wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Зачем вам custom_query, изменения в основной запрос делайте через хук pre_get_posts
    2. Проверяйте первый пост по индексу current_post объекта $wp_query
    // В functions.php, модифицируем основной запрос:
    function modify_my_query( $query ) {
        if ( $query->is_main_query() && ! $query->is_admin() ) {
            $query->set( 'posts_per_page', 24 );
        }
    }
    add_action( 'pre_get_posts', 'modify_my_query' );
    
    // В самом шаблоне, для изоляции первого поста в стандартном цикле:
    if ( have_posts() ) :
    
        while ( have_posts() ) : the_post();
    
            if ( $wp_query->current_post == 0 ) : // Это первый пост в цикле
    
                // вот тут произвольный код для вывода/оформления первого поста
    
            else : // Это все остальные посты
    
                // а тут - для всех остальных
    
            endif;
    
        endwhile;
    
    endif;

    И пагинация будет работать, и граблей никаких нет.
    Ответ написан
    2 комментария
  • Как изменить заголовок "Related products" в WooCommerce?

    @Sir-ss
    У меня так заработало

    // Change WooCommerce "Related products" text
    
    add_filter('gettext', 'change_rp_text', 10, 3);
    add_filter('ngettext', 'change_rp_text', 10, 3);
    
    function change_rp_text($translated, $text, $domain)
    {
         if ($text === 'Related products' && $domain === 'woocommerce') {
             $translated = esc_html__('Check out our other products', $domain);
         }
         return $translated;
    }
    Ответ написан
    1 комментарий