如何在循环中控制自定义POST类型的输出?

时间:2020-01-15 作者:Matthew Brown aka Lord Matt

我正在研究一种新的内容类型。让我们称之为酒店客房(虽然不是,但相似之处已经足够好了)。

现在,对于每个房间,我都会有一个标题和描述,但我也会有很多元数据-床、海景、房间号、大小、夏季价格、冬季价格等等。

我希望我的自定义类型可以处理任何主题。这意味着我需要提供一种为index.php, single.php, 等等显然,呈现元数据是其中的一大部分。

我该怎么做?

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

我假设您正在插件中创建自定义帖子类型,如果您想让它与任何主题一起工作的话。

在这种情况下,我建议在插件中构建模板,并在那里调用所有元数据。

示例:

/* Filter the single_template with our custom function*/
add_filter(\'single_template\', \'my_custom_template\');

function my_custom_template($single) {

    global $post;

    /* Checks for single template by post type */
    if ( $post->post_type == \'POST TYPE NAME\' ) {
        if ( file_exists( PLUGIN_PATH . \'/Custom_File.php\' ) ) {
            return PLUGIN_PATH . \'/Custom_File.php\';
        }
    }

    return $single;

}
您可以进一步优化它,并添加一个函数来检查主题是否有一个yourposttype。php,如果它存在的话就使用它,而不是插件版本,这样开发人员就可以轻松地重写它。示例:

    $themeurl  = get_theme_file_path("/single-yourposttype.php");
    $pluginurl = plugin_dir_path( dirname( __FILE__ ) ) . \'single-yourposttype.php\';

    if( file_exists( $themeurl ) ) {
        include( $themeurl );
    } elseif( file_exists( $pluginurl ) ) {

        require "$pluginurl";
    }
我希望这有帮助。

SO网友:kaiser

我建议不要添加布局,而是添加标记并提供覆盖它的选项。最好的方法是添加一个钩子,用户可以将其添加到主题模板中。

// Theme template file
do_action( \'hotel_rooms\' );

// Your plugin hooks in there:
add_action( \'hotel_rooms\', \'callback\' );
function callback() {
    echo "I am displaying details about a hotel room";
}
您还可以将此过程分为两步,以提供更精确的控制:

// Themes template or another (child?) plugin
// [] is an array and the default.
$data = add_filter( \'hotel_room_data\', [] );

// Plugin
apply_filters( \'hotel_room_data\', …etc. );
Two stepped: 吃自己的狗粮,并将过滤器应用于自己的循环和标记。

add_action( \'hotel_rooms\', \'callback\' );
function callback() {
    $data = apply_filters( \'hotel_room_data\', …etc. );
    foreach ( $data as $room ) {
        print $room[\'size\'];
    }
}

相关推荐

Modals using loops and ACF

我试图制作一个页面,查询特定类别(“景点”)的每一篇帖子。我已经能够成功地获得帖子,我只需要让modals工作。我在我的循环中做了一个按钮,它的标题是循环所在的任何帖子。我希望这样,每当人们单击该按钮时,它就会打开一个模式,显示代码中ACF I列表中的所有字段。不过,我有一些问题。由于某种原因,我无法让javascript正常工作。现在都在页面模板文件中,但我已经尝试通过函数将脚本排队。php等。我的猜测是,我正在尝试制作文档。getElementsByClassName而不是documents。getE