在发布时将元值添加到自定义帖子类型

时间:2014-12-27 作者:MattR

我有一个客户请求将所有特定自定义帖子类型(称为“自定义作业”)的帖子设置为自动包含在Yoast SEO插件的网站地图中。

我发现为了做到这一点,帖子需要一个元键“\\u yoast\\u wpseo\\u sitemap-include”,值为“always”。因此,我尝试使用{status}{post\\u type}钩子调用函数,如下所示:

function on_jobs_publish( $post_ID ) {
    global $wpdb;
    $wpdb->insert( 
        \'iCrewzWp_postmeta\', 
        array( 
            \'post_id\' => $post->ID,
            \'meta_key\' => \'_yoast_wpseo_sitemap-include\',
            \'meta_value\' => \'always\'
        ), 
        array( 
            \'%d\',
            \'%s\',
            \'%s\'
        ) 
    );
}
add_action(  \'publish_custom-jobs\',  \'on_jobs_publish\', 10, 1 );
这几乎奏效了。它将元数据信息添加到数据库中,但post\\u id始终设置为0。我也尝试过传递和使用$post和$ID变量,但没有成功。你知道我如何将自定义帖子的id传递到此函数中,以便将元信息与发布的帖子关联吗?

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

你在使用一个未定义的$post->ID 变量,因为没有对任何$post 代码中的对象;相反,请使用$post_ID 函数中检索到的变量:

function on_jobs_publish( $post_ID ) {
   global $wpdb;
   $wpdb->insert( 
       \'iCrewzWp_postmeta\', 
            array( 
                \'post_id\' => $post_ID,
                \'meta_key\' => \'_yoast_wpseo_sitemap-include\',
                \'meta_value\' => \'always\'
        ), 
        array( 
            \'%d\',
            \'%s\',
            \'%s\'
        ) 
    );
}
add_action(  \'publish_custom-jobs\',  \'on_jobs_publish\', 10, 1 );
此外,与其使用global $wp_query 并运行insert方法,我认为用户update_post_meta 作用

function on_jobs_publish( $post_ID ) {
    update_post_meta($post_ID, \'_yoast_wpseo_sitemap-include\', \'always\' );
}
add_action(  \'publish_custom-jobs\',  \'on_jobs_publish\', 10, 1 );
请注意publish_{post-type} 当post将状态从任何值更改为“发布”时,将触发操作。这意味着,如果帖子已经发布,并且您尝试更新它,则不会执行此功能。如果需要在不考虑post状态的情况下执行它,请使用save_post 行动挂钩:

function on_jobs_publish( $post_ID, $post ) {
    //Check that the post type being edited is our custom post type
    if ( $post->post_type != \'custom-jobs\' ) {
        return;
    }
    update_post_meta($post_ID, \'_yoast_wpseo_sitemap-include\', \'always\' );
}
add_action(  \'save_post\',  \'on_jobs_publish\', 10, 2 );
还有一条关于未来的建议。当您使用wpdb 类,就像使用insert方法一样,从不使用完整的表名,而是将前缀替换为$wpdb->prefix 所有物这样更安全。例如,在代码中:

   global $wpdb;
   $wpdb->insert( 
       $wpdb->prefix.\'_postmeta\',
   //Rest of the code

SO网友:brobken

我认为您不应该手动更新wpdb或post meta,而应该在插件中搜索正确的设置。

也许Yoast Seo无法查看您的自定义帖子类型,因为\'public\' => true 创建cpt时未设置?

结束