在另一自定义发布类型中显示来自一种自定义发布类型的数据

时间:2018-09-01 作者:verism

我正在从事一个项目,我们将创建两种不同的自定义帖子类型:机器和查询。这些机器帖子将由管理员创建,只是一个待售物品的列表(尽管这不是一个电子商务网站)。然而,用户将通过前端显示的表单创建查询。当用户提交查询时,他们必须选择是购买还是出售-如果他们购买,则还必须指定一台机器。

客户表示,他们希望能够在“查询管理”列和“查询编辑”页面中看到查询与哪台机器相关。这显然是不可编辑的,但它可以是机器帖子标题、SKU或指向机器编辑页面或前端的链接,也可以是它们的任意组合。

所以我的问题是:

创建和保存查询栏类型时,是否有方法查询机器的栏类型(即随用户查询一起提交的机器),并使用该机器的行数据向查询栏添加一个字段,然后可以在查询编辑页或管理栏上显示该字段?

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

在表单中添加一个允许选择machine. 您可以使用get_posts 生成select 要素:

$args = [
    \'posts_per_page\' => -1,
    \'post_type\' => \'machine\'
];
$machines = get_posts( $args );
if( ! empty( $machines ) ){
    echo \'<select name="_machine_id">\';
    foreach( $machines as $machine ){
        echo \'<option value="\' . $machine->ID . \'" >\' . get_the_title( $machine ) . \'</option>\';
    }
    echo \'</select>\';
}
将该值保存在post meta中enquiry 在密钥下发布_machine_id.

将机器列添加到enquiry 发布类型列表屏幕,使用manage_$post_type_posts_columns 过滤器:

function wpd_enquiry_posts_columns( $columns ) {
    $columns[\'machine\'] = \'Machine\';
    return $columns;
}
add_filter( \'manage_enquiry_posts_columns\', \'wpd_enquiry_posts_columns\' );
接下来,使用manage_$post_type_posts_custom_column 为每个帖子在该列中输出值的操作:

function wpd_enquiry_column( $column, $post_id ) {
    if ( \'machine\' === $column ) {
        // get the machine ID saved in meta
        $machine_id = get_post_meta( $post_id, \'_machine_id\', true );
        if( $machine_id ){
            // get the machine post
            $machine = get_post( $machine_id );
            if( is_object( $machine ) ){
                echo get_the_title( $machine );
            }
        } else {
            echo \'none\';
        }
    }
}
add_action( \'manage_enquiry_posts_custom_column\', \'wpd_enquiry_column\', 10, 2 );
对于个人enquiry 在编辑屏幕之后,您可以添加一个元框来显示机器。这里我们添加了一个元框:

function wpd_machine_meta_box() {
    add_meta_box( \'machine-id\', \'Machine\', \'wpd_display_machine_meta_box\', \'enquiry\' );
}
add_action( \'add_meta_boxes\', \'wpd_machine_meta_box\' );
然后是元框的显示功能:

function wpd_display_machine_meta_box( $post ) {
    $machine_id = get_post_meta( $post->ID, \'_machine_id\', true );
    if( $machine_id ){
        $machine = get_post( $machine_id );
        if( is_object( $machine ) ){
            echo get_the_title( $machine );
        }
    } else {
        echo \'none\';
    }
}
这里我们只是一个静态值的简单显示,您还可以在元框中生成一个表单字段,就像上面的第一个函数一样,并钩住post_save 允许管理员更新该值。

SO网友:jdp

我认为你的答案在于在链接回查询帖子的机器帖子类型上添加元数据。您在查询页面上的表单将有一个选择字段,其中包含所有可供购买的机器。选择控件中每个选项的值将是机器post的ID。

当用户提交表单时,将equieri Post ID保存为机器Post的元键/值。我用绳子machine_enquiry 作为元键。

add_post_meta($machine_post_id, \'machine_enquiry\', $enquiry_post_id);
这将为您提供机器帖子中每台机器的一系列查询,因为您可能对每台机器有多个查询。

您还可以从将机器post ID放入查询帖子的meta中获得一些好处。只要您不允许查询多台机器,这将起作用。

update_post_meta($enquiry_post_id, \'machine_enquiry\', $machine_post_id);

结束