对于给定的帖子类型,这是设置样式的最佳(也是唯一的)选项吗?

时间:2017-02-28 作者:user114431

首先感谢您的阅读,并对我的知识不足表示歉意。

我有一个WP网站运行一个主题和一个子主题。我用西班牙语、英语和葡萄牙语三种语言运行它;为了处理翻译,我使用WPML插件。

我的问题是,在翻译的公文包和联系人页面中,该网站看起来并不像我想要的那样。在对WPML支持的结束进行了大量研究之后,得出的结论是,我的开发人员的子主题包括额外的CSS表单,这些表单被意外地设置为特定于帖子/页面的级别。因此,造型如图所示:

CSSSheetPageLevelStyling

CMorePageSpecificStyling

联系人ID帖子也是如此。

因此,在这个场景中,WMPL支持解决方案是“复制”脚本,只需在复制的行中更改post id。

我认为这是一个短期的解决方案,似乎在将来发生以下任何情况时,我都必须再次这样做:

-我想创建第二个公文包页面-我想添加一种新的语言,无论出于何种原因,我删除公文包或联系人页面并重新创建,它将有一个新的帖子ID

所以问题是:难道不是另一种以更“干净”的方式实现这一目标的选择吗?我不知道怎么做,但我想在CSS中会这样说,对于公文包来说,样式应该是这些-无论哪种语言-;对于接触,样式应为这些等

我的开发人员说这种方法是错误的,但对我来说,他们的解释毫无意义。

任何建议都将不胜感激

干杯

2 个回复
SO网友:montrealist

你的假设完全正确。CSS应never 绑定到帖子ID,因为它们总是可以更改的(例如,如果您决定将帖子迁移到其他安装)。

您可以始终将控制权切换到管理仪表板。

在一篇文章/页面中添加一个自定义字段,您希望以一种特殊的方式设置其样式(在您的示例中,所有语言版本的文章/页面中都有相同的自定义字段)。让我们假设它会wpse_custom_class. 将其添加到每个帖子/页面;该值将为portfolio 对于本例。

将此代码添加到functions.php (复制自this answer). 当页面加载时,它将查找一个自定义字段,并将其值作为CSS类插入HTML主体元素中。

function wpse_filter_post_class( $classes ) {
    $my_post_class = get_post_meta($post->ID, "wpse_custom_class");

    if( $my_post_class != \'\' ) {
        $classes[] = $my_post_class;
    }
    return $classes;
}

add_filter( \'post_class\', \'wpse_filter_post_class\' );
您的设计师现在可以这样使用它:

.portfolio #content .main {
    max-width: 100%;
}
这是管理方面的更多工作(您或设计师需要手动进入并为所有定制样式的页面指定这些CSS类),但最终它有助于实现非常灵活且经得起未来考验的解决方案。

SO网友:Fayaz

为什么不使用特定于ID的CSS规则:

发布特定于ID的CSS只能是一个快速修复方法,这远远不是最佳实践。Post ID在许多情况下都不可靠。例如:

你可能会删除一篇帖子,并用一篇新帖子替换。

将来您可能需要将站点迁移到另一台服务器。

您可能正在创建更新版本的帖子/页面,并希望在替换旧帖子/页面之前查看新帖子/页面。

在所有这些情况下,帖子ID可能会发生变化,而那些特定于ID的CSS将不再适用。因此,您必须再次更新CSS以满足您的设计需要。WordPress是非常可定制的,因此没有任何场景需要使用基于post ID的CSS规则。对于更成熟的开发和设计实践,强烈建议不要使用特定于ID的CSS规则。相反,请使用以下选项之一:

使用页面模板:

WordPress支持page templates 对于长期使用的页面和版本4.7 WordPress支持page templates for any post type. 如果你有WordPress4.7 或更高版本,然后您可以为子主题中的任何帖子或页面创建特定的页面模板。

这样,您根本不需要任何特定于ID的CSS,因为一旦您拥有这些特定的模板,无论何时您需要对任何页面或帖子进行相同的设计,您只需从帖子或页面编辑器中选择相同的模板。仅此而已。之后,该页面模板的设计将应用于page, postcustom post type.

使用post_class 筛选挂钩:

如果您不想转到管理面板中的不同页面或帖子来分配特定模板(可能您有很多页面/帖子),那么您可以使用post_class 过滤器挂钩。这样,您就可以为需要它们的不同帖子和页面分配独特的CSS类,并根据这些CSS类设置样式。例如,假设您有一个自定义的帖子类型movie &;您需要不同的CSS类movie 条目。然后在你的主题中functions.php 文件中,可以添加以下代码:

add_filter( \'post_class\', \'movie_post_class\' );
function movie_post_class( $class ) {
    if ( get_post_type() === \'movie\' ) {

        // remove these CSS classes from movie entries
        $remove = array( \'css-class-to-remove\', \'another-class-to-remove\' );
        $class = array_diff( $class, $remove );

        // add these custom CSS classes to movie entries
        $add = array( \'custom-movie\', \'my-movie-class\' );
        $class = array_merge( $add, $class );
    }
    return $class;
}
现在,您可以使用以下CSS以电影实体为目标:

.custom-movie {
    background-color: gold;
}
使用body_class 过滤器挂钩:在某些情况下,如果您不想使用页面模板,并且需要对整个页面设计进行更通用的控制(与post_class 将提供),然后您可以修改<body> 使用body_class 过滤器挂钩(与post_class 过滤器挂钩)。像这样:

add_filter( \'body_class\', \'movie_body_class\' );
function movie_body_class( $class ) {
    if ( is_single() && get_post_type() === \'movie\' ) {

        // remove these CSS classes from body class
        $remove = array( \'css-class-to-remove\', \'another-class-to-remove\' );
        $class = array_diff( $class, $remove );

        // add these custom CSS classes to body class of a movie post
        $add = array( \'custom-movie\', \'my-movie-class\' );
        $class = array_merge( $add, $class );
    }
    return $class;
}
现在,您可以使用以下CSS以电影自定义贴子页面为目标:

body.custom-movie .any-inner-content-class {
    color: blue;
}
由于此自定义类是在<body>, 您可以通过这种方式将页面中的任何元素作为目标。

相关推荐

Pre_Get_Posts仅按管理员角色显示帖子

我正在尝试筛选查询,以仅显示由具有管理员角色的用户发布的帖子。我已经创建了一个pre\\u get\\u posts操作,并尝试使用$query->set只过滤类别页面中的帖子。。。到目前为止我有这个function remove_unvetted_authors() { $query->set( \'role\', \'administrator\' ); } if (is_category()) { add_action( \'pr