我需要为每个新的插件或定制安装添加一个定制的“封面”?

时间:2012-09-20 作者:Brandon Durham

我正在创建一个网站,基本上就像一本在线书,每个帖子都是一个章节。每一章都有一个定制的、专门设计的“封面”,这在Wordpress WYSIWYG中是无法设计的。每个封面都有某些方面可以模板化(比如h1、h2和单个段落——每个章节都有),但其他所有内容都将是每个章节的特色。此“封面”还将包含仅与本章相关的特定CSS。

理想情况下,我将能够在Wordpress之外设计和编写这些封面,并以某种方式通知每个帖子要使用哪个封面。这是否意味着Wordpress实际上导入了该代码,或者只是将其包含在php包含中,对我来说并不重要。我只是希望这是尽可能精简。

建议?

2 个回复
最合适的回答,由SO网友:kaiser 整理而成

另一种不调用页面属性的解决方案:

说明:去下载待办事项列表RW_Meta_Box Library. <我是作者/撰稿人之一

这些插件在这里你可以看到两个小插件(我专门为你的问题写的)。

输入第一个是RW元盒库的依赖项。您只需更改所需内容(用户上限检查)并将其上载到您的插件文件夹。您需要做的更改非常简单:搜索正确的User Role or Capability 并将其添加到当前可以阅读的位置\'edit_theme_options\'. 它应该与你的设计者的能力相匹配,而不是你的作者。

它添加了两个textarea元框。

<?php
! defined( \'ABSPATH\' ) AND exit;
/** Plugin Name: (#65707) »kaiser« Add Meta Boxes */

function wpse65707_add_meta_boxes()
{
    // Don\'t add it for all users, but only for your designers
    if (
        ! current_user_can( \'edit_theme_options\' ) # CHANGE ME!!!
        OR ! class_exists( \'RW_Meta_Box\' )
    )
        return;

    $prefix = \'wpse65707_\';
    $meta_boxes[] = array(
        // Meta box id, UNIQUE per meta box
         \'id\' => \'cover\'
        // Meta box title - Will appear at the drag and drop handle bar
        ,\'title\' => \'Designers Space\'
        // Post types, accept custom post types as well - DEFAULT is array(\'post\'); (optional)
        ,\'pages\' => array( \'post\' )
        // Where the meta box appear: normal (default), advanced, side; optional
        ,\'context\' => \'normal\'
        // Order of meta box: high (default), low; optional
        ,\'priority\' => \'high\'
        // List of meta fields
        ,\'fields\' => array(
            array(
                 \'name\' => \'Styles\'
                ,\'desc\' => "Only valid CSS here"
                ,\'id\'   => "{$prefix}styles"
                ,\'type\' => \'textarea\'
                ,\'std\'  => "h1 { color: #009ee0; }"
                ,\'cols\' => "40"
                ,\'rows\' => "8"
            ),
            array(
                 \'name\' => \'MarkUp\'
                ,\'desc\' => "Only valid HTML here"
                ,\'id\'   => "{$prefix}markup"
                ,\'type\' => \'textarea\'
                ,\'std\'  => "<h1>Hello Me!</h1>"
                ,\'cols\' => "40"
                ,\'rows\' => "8"
            )
        )
    );

    # Add additional Meta Boxes here.
    # For example a drop-down with a list of users that
    # have a custom role of "Designer"
    # (Hint) Use the "Members" plugin for that and 
    # WP_User_Query to get the users as values

    foreach ( $meta_boxes as $meta_box )
        new RW_Meta_Box( $meta_box );
}
# Performance: Only load on post edit & new admin UI screens.
add_action( \'load-post-new.php\', \'wpse65707_add_meta_boxes\' );
add_action( \'load-post.php\', \'wpse65707_add_meta_boxes\' );
输出这个现在关心我们的输出。

它的首要任务是将我们的风格添加到wp_head-钩这样,我们就可以注入设计师添加的任何自定义样式。

它所做的第二件事是将当前帖子ID添加到post_class 的筛选器post_class(); 模板标记。这样,我们就可以轻松地只针对当前的帖子内容,而不针对其他内容。

rd功能是一个解析器。此解析器允许设计者通过抽象层(Custom)添加模板标记%Template Tags%. 所以在wpse65707_custom_post_styles_parser 将替换为set template标记。函数本身是的筛选器回调the_content, 因此,无论你使用什么主题,你都不需要改变任何东西来让它工作。

<?php
! defined( \'ABSPATH\' ) AND exit;
/** Plugin Name: (#65707) »kaiser« Custom Post Styles */

// Add custom styles to the `wp_head` hook in the header.php file.
function wpse65707_custom_post_styles()
{
    $styles = get_post_meta( get_the_ID(), \'wpse65707_styles\', true );
    $styles = str_replace( 
         \'%ID%\'
        ,get_the_ID()
        ,$styles
    );

    return print "<style type=\'text/css>{$styles}</style>";
}
add_action( \'wp_head\', \'wpse65707_custom_post_styles\' );

// Add the plain ID to the post classes for easier styling
// Prevents overriding everything else outside
function wpse65707_post_class ( $classes )
{
    $classes[] = get_the_ID();
    return $classes;
} 
add_filter ( \'post_class\' , \'wpse65707_post_class\' );

// Parse the content to add Template tags on the fly
function wpse65707_custom_post_styles_parser( $content )
{
    $markup = get_post_meta( get_the_ID(), \'wpse65707_markup\', true );
    return strtr(
         $markup
        ,array(
             \'%CONTENT%\' => $content
            ,\'%AUTHOR%\'  => get_the_author()
            // Add other template tags here
         )
    );
}
add_filter( \'the_content\', \'wpse65707_custom_post_styles_parser\' );
模板:single.php &;header.php

只有这两个文件中的以下模板标记才是使用主题时最重要的内容:

  • header.php must 有一个wp_head() 标记
  • single.php must 使用post_class(); post container div/article HTML标记上的函数
  • single.php must 使用the_content(); 以显示其内容很简单:每个模板标记都允许在wpse65707_custom_post_styles_parser(), 将与您的设计师所写的内容进行交换。

    // Example content for the "MarkUp"-Meta Box
    <h1>Hello Me!</h1>
    <h2>A fairy tale by %AUTHOR%</h2>
    This is story of love and joy.
    %CONTENT%
    <p>We hope you liked it.</p>
    
    现在%CONTENT% 替换为实际帖子内容,并%AUTHOR%, 具有作者显示名称。请随意扩展它。

    重要的是,您的设计师只需使用标签should 用于为其样式添加前缀:%ID% 标签这可以确保他们没有针对当前文章容器之外的任何内容。

    就是这些人

SO网友:kaiser

自定义标记:发布模板

使用页面模板。

function wpse65707_post_templates()
{
   add_post_type_support( \'post\', \'page-attributes\' );
}
add_action( \'init\', \'wpse65707_post_templates\' );
然后只需为每个自定义布局上载一个新模板。

自定义外观:条件样式要在帖子中添加css,只需添加一个新的样式表,您只需为该页面排队即可。

function wpse65707_single_styles()
{
    if ( ! is_single() )
        return;

    wp_enqueue_style(
         \'style_\'.get_the_ID()
        ,get_stylesheet_directory_uri().\'/single-styles/style-\'.get_the_ID().\'.css\'
        ,array()
        ,filemtime( get_stylesheet_directory().\'/single-styles/style-\'.get_the_ID().\'.css\' )
    );
}
add_action( \'wp_enqueue_scripts\', \'wpse65707_single_styles\' );
这样,您只需添加一个名为~/single-styles 添加到主题,然后添加名为style-IDHERE.css 到仅为该页排队的文件夹。因此,这是一种与上下文样式表类似的东西。

玩得高兴

结束