我正在尝试编写一个函数,将我的自定义帖子类型与与与自定义帖子类型同名的页面“配对”。
其目的是,当保存自定义帖子类型时,它会检查是否有与自定义帖子类型帖子同名的页面,如果有,它会从该页面提取id,并将其作为CPT帖子的父id。对我来说,保持它们之间的联系是一种很有技巧的方式(自定义帖子类型的帖子从页面继承了不同的值)。
然而,我无法让它工作,它会给我一个id,但它是错误的id(它会获取id最高的页面的id),不确定我做错了什么。
以下是当前代码:
function find_parent_for_cpt( $data , $postarr ) {
global $post;
if ($post->post_type != \'post\' || \'page\'){
$post_type = $post->post_type;
$mypages = get_pages();
foreach($mypages as $page){
if($page->post_title==$post_type) {
$data[ \'post_parent\' ] = $page->ID;
return $data;
}
}
}
}
add_filter( \'wp_insert_post_data\' , \'find_parent_for_cpt\' , \'99\', 2 );
最合适的回答,由SO网友:Milo 整理而成
你的职能有一些问题。第一$data
包含post类型,因此我们在那里查看。你的if语句不能像那样工作,你必须单独检查条件。要查找匹配的页面,只需使用WP_Query
:
function find_parent_for_cpt( $data ) {
if ( $data[\'post_type\'] != \'post\' && $data[\'post_type\'] != \'page\' ):
$args = array(
\'name\' => $data[\'post_type\'],
\'post_type\' => array( \'page\' )
);
$match = new WP_Query( $args );
if( $match->post_count == 1 )
$data[ \'post_parent\' ] = $match->post->ID;
endif;
return $data;
}
add_filter( \'wp_insert_post_data\' , \'find_parent_for_cpt\' , \'99\', 2 );
还要注意,无论是否修改,都必须返回post数据。您可能会遇到的另一个问题是,除了post和page之外,还有其他post类型不是您的自定义类型,我假设此操作会被触发。最好显式测试自定义类型,以决定是否分配父类型。