/% Postname% / permastruct ile Wordpress 3.3 özel yazı tipi?


9

Benzer bir başlığa sahip daha önceki bir yazı var, ancak WordPress 3.3'e bakmıyor ve 3.3'ün ilginç bir şekilde reklamını yaptığı için önemli: "Posta cezası kalıcı bağlantı yapısını performans cezası olmadan kullan"

Wordpress 3.2 ve öncesi ile ilgili sorun, önce sayfa adlarına sonra 404'e bakmasıydı. Önce rastgele yazı türlerini kontrol etmedi. Öte yandan 3.3 olmalıdır (bu özelliği tanıtır gibi) son olarak 404 yazılan tipleri, ardından sayfaları, ve bak. Bu, bir yerde sabit kodlamadıysa, bilgi içermeyen özel yazı türlerinin basit olması gerektiğini gösterir post_type=post.

Yine de 3.3'e özel bir çözüm bulamıyorum.

Soru : Herhangi bir özel yazı tipi "xyz" için "/% postname% /" kalıcı bağlantı yapısını nasıl tanımlayabilirim?

Teşekkürler.


Bir soru görmüyorum - aslında ne soruyorsun?
Travis Northcutt

Anlaşılır olması için, /% postname% /? 'Nın kalıcı bağlantı yapısını kullanan yeni bir özel yazı türü tanımlamak istiyorsunuz. Görevlerin de aynı yapıları kullanmasını mı planlıyorsunuz, yoksa bir önekleri mi olacak?
prettyboymp

Bunu cevaplayan biri olup olmadığını görmek için. Yukarıdaki yaklaşımları da sadece yeniden yazma slug '/' da sayfa permalinks kırar ayarı ile birlikte denedim. Le nefes ...

Yanıtlar:


2

Yeniden yazma kurallarını doğru noktada kandırma ve wp_rewrite'ın ön kurallarda ayrıntılı kuralların kullanıldığını düşünmesini sağlamadığınız sürece bu WP 3.3'te kolayca yapılmaz. Aşağıdaki sınıf çalışır.

class Test_Post_Type {
    const POST_TYPE = 'test';

    public static function init() {
        global $wp_rewrite;

        $post_type_obj = register_post_type( self::POST_TYPE, array(
            'labels' => array(
                'name' => __( 'Tests' ),
                'singular_name' => __( 'Test' ),
                'add_new' => __( 'Add New' ),
                'add_new_item' => __( 'Add New Test' ),
                'edit_item' => __( 'Edit Test' ),
                'new_item' => __( 'New Test' ),
                'all_items' => __( 'All Tests' ),
                'view_item' => __( 'View Test' ),
                'search_items' => __( 'Search Tests' ),
                'not_found' => __( 'No Tests found' ),
                'not_found_in_trash' => __( 'No Tests found in Trash' ),
                'menu_name' => __( 'Tests' )
            ),
            'publicly_queryable' => true,
            'exclude_from_search' => true,
            'hierarchical' => false,
            'public' => true,
            'rewrite' => false,
            'has_archive' => true,
            'supports' => array( 'title', 'editor', 'thumbnail', 'test_source' ),
            'taxonomies' => array( 'category', 'post_tag' ),
        ) );

        $post_type_obj = get_post_type_object(self::POST_TYPE);

        //register the rewrite tag for permalink building
        $wp_rewrite->add_rewrite_tag( '%' . $post_type_obj->query_var . '%', '([^/]+)', $post_type_obj->query_var . '=' );

        //we have to add the permastruct here in order to build the permalink, otherwise we'll need to filter the post_type link
        add_permastruct(self::POST_TYPE, '%' . $post_type_obj->query_var . '%/', false );

        //add a filter to remove the permastructs generated above
        add_filter(self::POST_TYPE . '_rewrite_rules', array(__CLASS__, '_remove_default_rules')); 

        //now we add a filter to put the generated rewrite rules in the correct spot
        add_action('generate_rewrite_rules', array(__CLASS__, '_filter_rewrite_rules'));

        if(!is_admin()) {
            //we need verbose_page_rules to be on on the front end in order for pages to be process properly
            $wp_rewrite->use_verbose_page_rules = true;
        }
    }

    /**
     * Filter to remove the rules for this post type when they're automatically generated due to the permastruct registration
     * @param type $rules
     * @return type 
     */
    public static function _remove_default_rules($rules) {
        return array();
    }

    /**
     * Filters the rules at the end to add back the ones for this post type at the bottom
     * @param WP_Rewrite $wp_rewrite 
     */
    public static function _filter_rewrite_rules($wp_rewrite) {
        $post_type_obj = get_post_type_object(self::POST_TYPE);
        $my_rules = $wp_rewrite->generate_rewrite_rules('%' . $post_type_obj->query_var . '%', EP_NONE);
        $wp_rewrite->rules += $my_rules;
    }

}

add_action( 'init', array( 'Test_Post_Type', 'init' ) );

Kopya bu temayı bana yapıştırdı, yeniden yazma kurallarını temizledi. Yeni bir gönderi eklendi, gönderiyi görüntüledi (url doğru), 404 aldı ... WP 3.3.1'de. Bunun benim için neden işe yaramayacağına dair bir fikrin var mı? (Btw kodu için teşekkürler!)
Rob Vermeer

Yorum sayfalarının çalışmasını sağlamak için EP_NONE -> EP_PERMALINK ve sonra /% postname% / ile çalışan birden fazla yayın türü elde etmek için parse_query filtresini de kullanmalısınız. Yukarıdaki cevabımı gör.
Ciantic

Rob, yeni bir gönderi mi ekledin, yoksa yeni bir 'test' yayını mı ekledin? Bu ilk soruda, yayınların /% post_name% / için yeniden yapılandırmaya sahip olup olmayacağı konusunda net değildi. Eğer durum buysa, neden yeni bir yazı türü oluşturmalıyım? Ayrıca, birden fazla gönderi türü aynı yapıya sahipse ad çakışmalarıyla ilgili olası sorunlarınız olacaktır.
prettyboymp

1

Kutsal araba anahtarları!

Bence bu işe yarıyor . Neredeyse işe yarıyor, süper basit, sadece bir satır:

global $wp_rewrite;
$args = array(
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'rewrite' => array('slug' => 'anything'),
    'capability_type' => 'post',
    'has_archive' => true,
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail')
);
register_post_type('my_custom_post_type', $args);

$wp_rewrite->add_permastruct('my_custom_post_type', "%my_custom_post_type%");

PS Bunu evde denerseniz, bu bir satırı ekledikten sonra "Ayarlar" -> "Kalıcı Bağlantılar" ve Değişiklikleri Kaydet'e gidin, kalıcı bağlantıları yeniler.

WP register_post_type()kaynak kodunu okuyordum ve bir satır buldum:

$wp_rewrite->add_permastruct($post_type, "{$args->rewrite['slug']}/%$post_type%", $args->rewrite['with_front'], $args->permalink_epmask);

Söylemeye gerek yok ama sümüklü böcek olmadan çalışması gerektiği sonucuna vardım ve işe yaradı . Editördeki başlığın altındaki kalıcı bağlantı bile doğru çalışıyor!

Güncelleme: Bu sayfa permalarını kırıyor, çizim tahtasına geri dönüyor ...


Bunu da benzer sonuçlarla denedim. Bu işe yarayacaksa çok iyi olurdu. Belki bir fikri olan başka biri?
Rob Vermeer

@RobVermeer Satır olmadan (yalnızca varsayılan bilgi ile), WordPress'in zaten URL'ye yönlendirebildiğini fark ettim. Örneğin, "bazı yayınlar" "herhangi bir şeye / bazı yayınlara" yönlendirir. Kod zirvesinde, kodun bir yerinde, sülük içermeyen CPT'ler için bir destek vardır, sadece varsayılan olarak yeniden yönlendirir. Palmiye
Ciantic

1

prettyboymp cevabı dün aldığımla hemen hemen aynı, ama bundan memnun değilim. prettyboymp'un cevabının bir kusuru var, /% postname% / aynı anda birden çok yazı tipinde kullanıldığında çalışmaz.

İşte cevabım, aynı zamanda mevcut yapıya bakar ve geri dönüş için bir dizi yazı tipi oluşturur. Bununla birlikte, bu durumda bir kusur var, eğer iki yazı tipi aynı sümüklüğe sahipse ve her ikisi de /% postname% / ise, her ikisini de gösterir.

class MyCustomPostType {
    /**
     * Register post type
     **/
    public static function register_post_type() {
        global $wp_rewrite;

        $args = array(
            'public' => true,
            'publicly_queryable' => true,
            'show_ui' => true,
            'show_in_menu' => true,
            'query_var' => true,
            'rewrite' => false,
            'capability_type' => 'post',
            'has_archive' => true,
            'hierarchical' => false,
            'menu_position' => null,
            'supports' => array('title','editor','thumbnail')
        );

        register_post_type('my_custom_post_type', $args);

        // Enables the pages to work simultaneously
        $wp_rewrite->use_verbose_page_rules = true;
        add_filter("rewrite_rules_array", array(__CLASS__, 'rewrite_rules_array'));
        add_action("parse_query", array(__CLASS__, 'parse_query'));
        add_filter("post_type_link", array(__CLASS__, 'post_type_link'), 1, 4);
    }

    public static function post_type_link($link, $post, $leavename=false, $sample=false) {
        if ($sample && ($begin = strpos($link, "?my_custom_post_type=")) !== false) {
            return substr($link, 0, $begin-1) . "/%my_custom_post_type%/";
        }
        return str_replace("?my_custom_post_type=", "", $link) . "/";
    }

    public static function parse_query($query) {
        global $wp, $wp_rewrite;

        // Is this query for /%post_name%/? Is it main request query?
        if (isset($query->query['name'])
            && substr($wp->matched_rule, 0, 7) == "([^/]+)"
            && isset($query->query)
            && isset($wp->query_vars)
            && $query->query == $wp->query_vars)
        {
            //echo '<p><h1>hit!</h1></p>';
            if (!($post_types = get_query_var("post_type"))) {
                if ($wp_rewrite->permalink_structure == "/%postname%/")
                    $post_types = array("post");
                else
                    $post_types = array();
            }

            if (is_array($post_types))
                $post_types[] = "my_custom_post_type";

            set_query_var("post_type", $post_types);
            //set_query_var("posts_per_page", 1);
        }
    }

    public static function rewrite_rules_array($array) {
        global $wp_rewrite;
        // Same rules as in /%post_name%/
        return array_merge($array, $wp_rewrite->generate_rewrite_rules("/%postname%/", EP_PERMALINK));
    }
}


add_action('init', array("MyCustomPostType", "register_post_type"));

Bazı post tiplerinin hiyerarşik olması mümkün mü? Ben kendim denedim, ama hiçbir şey işe yaramaz gibi görünüyor ... Mesaj ebeveyn / çocuk / ile bir ek olduğunu düşünüyor ... Ve eğer ebeveyn / çocuk / torun / 404 alır.
Rob Vermeer

1

Bir çözüm oluşturdum ve bununla ilgili bir sorun bulamadım. Lütfen bir sorun bulursan bana söyle

add_action('init', 'firmasite_resimlitarif_cpt', 0);
function firmasite_resimlitarif_cpt() 
{

// Yemek Tarifi

  $args = array(
    'public' => true,
    'show_in_menu' => true, 
    'permalink_epmask' => EP_NONE,
    'rewrite' => array('slug'=>'/','with_front'=>false),
    'has_archive' => false,
    'supports' => array('title','editor','thumbnail')
  ); 
  register_post_type('yemek',$args);

}


// http://wordpress.stackexchange.com/questions/37650/wordpress-3-3-custom-post-type-with-postname-permastruct
add_action("parse_query", 'firmasite_resimlitarif_parse_query');
function firmasite_resimlitarif_parse_query($query) {
    global $wp, $wp_rewrite;


    // Is this query for /%post_name%/? Is it main request query?
    if (isset($query->query['name'])
        && substr($wp->matched_rule, 0, 7) == "([^/]+)"
        && isset($query->query)
        && isset($wp->query_vars)
        && $query->query == $wp->query_vars)
    {
        if (!($post_types = get_query_var("post_type"))) {
            if ($wp_rewrite->permalink_structure == "/%postname%/")
                $post_types = array("post");
            else
                $post_types = array();
        }

        if (is_array($post_types)){ 
            $post_types[] = 'yemek';
            $post_types[] = 'page';
        }


        set_query_var("post_type", $post_types);
    } 
}

Yazı tipi adınızla 'yemek'i değiştirin.



0

Bunun için gelebileceğim en temiz cevap (herhangi bir önde gelen bilgi olmadan gerçekten özel bir yazı türüne ihtiyaç duyan bir eklenti oluşturuyorum) özel bir yazı türü kullanmak yerine özel bir sayfa şablonu kullanmaktır.

Bunu yaparak, "özel gönderi türünüz", sayfaya adım atma veya kalıcı bağlantılar hakkında endişelenmenize gerek kalmadan / gibi herhangi bir URL'ye sahip olabilir.

Bunu yapmak için aşağıdakileri yaptım:

  • Eklentimin içine özel sayfa şablonu ekleme
  • Sayfa şablonunu, sayfa düzenleyicide seçilebilecek şekilde ayarlama
  • Yalnızca sayfa şablonum için gösterilen özel meta kutular oluşturma

Bu, şunları yapmama izin verdi:

Aşağı taraflar

Tabii ki, bu sayfa veya yazı bağlantılarında durmuyor olsa da, birkaç belirgin dezavantajı var.

Arşiv yok Bir arşiviniz olmaz (isterseniz), özel şablonunuzu kullanarak tüm sayfaların arşivini çizmek için başka bir sayfa şablonu oluşturarak çözülebilir.

Sayfalar altında yönetiliyor Yönetici içinde tüm yazı türlerini bir araya getiren hoş bir sol gezinme çubuğunu alamazsınız.

Bu, sayfa listesine bir filtre ekleyerek (kullanılan sayfa şablonuna göre filtrelemenize izin vermek için), yeni bir sütunda kullanılan sayfa şablonlarını vb. Göstererek kısmen çözülebilir.


Bununla birlikte, kullanıcıların neden yeni bir özel sayfa oluşturduklarını merak etmelerine neden olmayacak bir şey istedim ve artık normal sayfalara ulaşamadıklarını veya yeni özel sayfanın sitelerinde mevcut bir sayfanın kaybolmasına neden olduğunu buldum.

Bunun gerçek bir çözüm olmadığını biliyorum , ama ihtiyaçlarım için harika çalışan bir alternatif.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.