Eklentideki özel yazı türü için özel arşiv sayfası oluşturma


11

"My_plugin_lesson" adlı özel bir yazı türü oluşturan bir eklenti yazıyorum:

$args = array (
    'public' => true,
    'has_archive' => true,
    'rewrite' => array('slug' => 'lessons', 'with_front' => false)
);
register_post_type ('my_plugin_lesson', $args);

Özel gönderi türünün bir arşivi vardır ve arşivin URL'si:

http://example.com/lessons

Bu arşivin görünümünü özelleştirmek istiyorum; Yazıları standart WordPress blog yayını arşivi yerine tablo biçiminde listelemek istiyorum. archive-my_plugin_lesson.phpDosyayı oluşturarak temada özel bir arşiv şablonunun oluşturulabileceğini anlıyorum ; Ancak, eklentinin herhangi bir tema ile çalışmasını istiyorum.

Tema dosyası eklemeden veya değiştirmeden arşiv sayfasının içeriğini nasıl değiştirebilirim?

Düzenleme:archive_template Filtre kancası kullanabileceğimi anlıyorum . Bununla birlikte, tüm bunlar, yine de temaya özgü olması gereken tema şablonunun yerini almaktadır. Örneğin, her tema şablonu gerekecektir hemen get_header, get_sidebarve get_footerişlevleri, ancak içerik kimliği ne olmalıdır <div>olmak? Bu her tema için farklıdır.

Yapmak istediğim, içeriğin kendisini kendi içeriğimle değiştirmek ve bunu özel yazı türüm için arşiv sayfasının yerine kullanmak.

Yanıtlar:


12

İhtiyacınız olan şey template_includefiltreyi takmak ve şablonunuzu eklentinin içine seçici olarak yüklemek.

İyi bir uygulama olarak, eklentinizi dağıtmayı planlıyorsanız , eklenti sürümünü kullanmıyorsanız temada olup olmadığını archive-my_plugin_lesson.php(veya belki de myplugin/archive-lesson.php) kontrol etmelisiniz .

Bu şekilde kullanıcılar eklenti kodunu düzenlemeden temayı (veya alt temayı) kullanarak şablonu değiştirebilirler.

Bu, popüler eklentiler, örneğin WooCommmerce, sadece bir isim söylemek için kullanılan yöntemdir.

add_filter('template_include', 'lessons_template');

function lessons_template( $template ) {
  if ( is_post_type_archive('my_plugin_lesson') ) {
    $theme_files = array('archive-my_plugin_lesson.php', 'myplugin/archive-lesson.php');
    $exists_in_theme = locate_template($theme_files, false);
    if ( $exists_in_theme != '' ) {
      return $exists_in_theme;
    } else {
      return plugin_dir_path(__FILE__) . 'archive-lesson.php';
    }
  }
  return $template;
}

Codex for hakkında daha fazla bilgi


Bu hala temanın şablon dosyasının yerini alıyor, değil mi? Eklentimin archive-lesson.php dosyasına ne koyabilirim? Her temayla çalışmak farklı olmalı. Varsayılan "Yirmi" temalar bile içeriği çevreleyen bölme / bölüm kapları üzerinde anlaşamazlar.
Ben Miller - Monica'yı hatırla

7

Aşağıdaki archive_templatetemayı kullanarak bir temanın arşiv şablonunun içeriğini işlemek için kancayı kullanabilirsiniz , ancak bir şablon temelde herhangi bir eski şey içerebileceği göz önüne alındığında, temaların sadece bir kısmını işleyebileceksiniz. .

Şema, şablonu filtredeki bir dizeye ( $tpl_str) yüklemek, archive_templateiçeriğinizi değiştirmek, dizeyi dahil etmek (hile kullanarak eval( '?>' . $tpl_str );) ve ardından include"wp-include / template-loader.php" işsiz hale gelir.

Aşağıda, eklenti içinde kullandığım kodun, "klasik" şablonları kullanan get_template_partve arşivden ziyade tek şablonları işlemeyle ilgilenen, ancak başlamanıza yardımcı olması gereken, saldırıya uğramış bir sürümü var . Kurulum, eklentinin boş bir dosya ("null.php") ve içerik şablonlarını (örneğin "content-single-posttype1.php", "content-archive-postype1.php") tutan "şablonlar" adlı bir alt dizine sahip olmasıdır. yanı sıra tek bir durum için "single.php" şablonunu geri yükler ve get_template_partbu dizinde görünen özel bir sürümünü kullanır .

define( 'MYPLUGIN_FOLDER', dirname( __FILE__ ) . '/' );
define( 'MYPLUGIN_BASENAME', basename( MYPLUGIN_FOLDER ) );

add_filter( 'single_template', 'myplugin_single_template' );
add_filter( 'archive_template', 'myplugin_archive_template' );

function myplugin_single_template( $template ) {
    static $using_null = array();

    // Adjust with your custom post types.
    $post_types = array( 'posttype1', );

    if ( is_single() || is_archive() ) {
        $template_basename = basename( $template );
        // This check can be removed.
        if ( $template == '' || substr( $template_basename, 0, 4 ) == 'sing' || substr( $template_basename, 0, 4 ) == 'arch' ) {
            $post_type = get_post_type();
            $slug = is_archive() ? 'archive' : 'single';
            if ( in_array( $post_type, $post_types ) ) {
                // Allow user to override.
                if ( $single_template = myplugin_get_template( $slug, $post_type ) ) {
                    $template = $single_template;
                } else {
                    // If haven't gone through all this before...
                    if ( empty( $using_null[$slug][$post_type] ) ) {
                        if ( $template && ( $content_template = myplugin_get_template( 'content-' . $slug, $post_type ) ) ) {
                            $tpl_str = file_get_contents( $template );
                            // You'll have to adjust these regexs to your own case - good luck!
                            if ( preg_match( '/get_template_part\s*\(\s*\'content\'\s*,\s*\'' . $slug . '\'\s*\)/', $tpl_str, $matches, PREG_OFFSET_CAPTURE )
                            || preg_match( '/get_template_part\s*\(\s*\'content\'\s*,\s*get_post_format\s*\(\s*\)\s*\)/', $tpl_str, $matches, PREG_OFFSET_CAPTURE )
                            || preg_match( '/get_template_part\s*\(\s*\'content\'\s*\)/', $tpl_str, $matches, PREG_OFFSET_CAPTURE )
                            || preg_match( '/get_template_part\s*\(\s*\'[^\']+\'\s*,\s*\'' . $slug . '\'\s*\)/', $tpl_str, $matches, PREG_OFFSET_CAPTURE ) ) {
                                $using_null[$slug][$post_type] = true;
                                $tpl_str = substr( $tpl_str, 0, $matches[0][1] ) . 'include \'' . $content_template . '\'' . substr( $tpl_str, $matches[0][1] + strlen( $matches[0][0] ) );
                                // This trick includes the $tpl_str.
                                eval( '?>' . $tpl_str );
                            }
                        }
                    }
                    if ( empty( $using_null[$slug][$post_type] ) ) {
                        // Failed to parse - look for fall back template.
                        if ( file_exists( MYPLUGIN_FOLDER . 'templates/' . $slug . '.php' ) ) {
                            $template = MYPLUGIN_FOLDER . 'templates/' . $slug . '.php';
                        }
                    } else {
                        // Success! "null.php" is just a blank zero-byte file.
                        $template = MYPLUGIN_FOLDER . 'templates/null.php';
                    }
                }
            }
        }
    }
    return $template;
}

function myplugin_archive_template( $template ) {
    return myplugin_single_template( $template );
}

Özel get_template_part:

/*
 * Version of WP get_template_part() that looks in theme, then parent theme, and finally in plugin template directory (sub-directory "templates").
 * Also looks initially in "myplugin" sub-directory if any in theme and parent theme directories so that plugin templates can be kept separate.
 */
function myplugin_get_template( $slug, $part = '' ) {
    $template = $slug . ( $part ? '-' . $part : '' ) . '.php';

    $dirs = array();

    if ( is_child_theme() ) {
        $child_dir = get_stylesheet_directory() . '/';
        $dirs[] = $child_dir . MYPLUGIN_BASENAME . '/';
        $dirs[] = $child_dir;
    }

    $template_dir = get_template_directory() . '/';
    $dirs[] = $template_dir . MYPLUGIN_BASENAME . '/';
    $dirs[] = $template_dir;
    $dirs[] = MYPLUGIN_FOLDER . 'templates/';

    foreach ( $dirs as $dir ) {
        if ( file_exists( $dir . $template ) ) {
            return $dir . $template;
        }
    }
    return false;
}

Tamlık için, geleneği kullanan "single.php" in geri dönüşü get_template_part:

<?php
get_header(); ?>

    <div id="primary" class="content-area">
        <div id="content" class="clearfix">
            <?php while ( have_posts() ) : the_post(); ?>

            <?php if ( $template = myplugin_get_template( 'content-single', get_post_type() ) ) include $template; else get_template_part( 'content', 'single' ); ?>

                <?php
                    // If comments are open or we have at least one comment, load up the comment template
                    if ( comments_open() || '0' != get_comments_number() ) :
                        comments_template();
                    endif;
                ?>

            <?php endwhile; ?>

        </div><!-- #content -->
    </div><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

1

Aynı soruyu düşünmeye başladım ve bu, ortaya koyduğum varsayımsal çözüm:

  • Eklenti içinde, arşiv döngünüzü istediğiniz şekilde çıkaran bir kısa kod oluşturun.
  • Özel gönderi türünü oluştururken, 'arşiv' seçeneğini etkinleştirmeyin.
  • Döngü içeriğinizin tüm stillerini kontrol eden bir stil sayfası ekleyin.

Eklenti etkinleştirildiğinde, wp_insert_post kullanarak adın yazı tipi ve içeriğin kısa kod olduğu bir sayfa oluşturun.

Ek stil değerlendirmeleri için kısa kodda seçenekler sunabilir veya temaya özgü veya özel stillerle eşleşmesi için posta kabına sınıflar ekleyebilirsiniz. Kullanıcı ayrıca sayfayı düzenleyerek döngüden önce / sonra ek içerik ekleyebilir.


OP olmamama rağmen aynı soruna bir çözüm arıyordum. Hipotetik çözümünüzü takip ettim ve şimdi pratikte de işe yaradığını onaylayabiliyorum.
Lucio Crusca

Hey harika! Bu birileri için yararlı oldu sevindim. Bunu tamamen unutmuştum.
SkyShab

0

Filtreyi kullanabilirsiniz single_template. Kodeks'den alınan temel bir örnek :

function get_custom_post_type_template($single_template) {
     global $post;

     if ($post->post_type == 'my_post_type') {
          $single_template = dirname( __FILE__ ) . '/post-type-template.php';
     }
     return $single_template;
}

add_filter( "single_template", "get_custom_post_type_template" );

Bir arşiv şablonu için filtre kancası olduğunu düşünüyorum archive_template, ancak bunun yapmaya çalıştığım şey için işe yarayacağını sanmıyorum. Sorumu daha fazla bilgi ile düzenledim.
Ben Miller - Monica'yı hatırla
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.