如何将CPT中的多个元字段用作后永久链接

时间:2021-05-09 作者:Spix

我使用Jetengine创建了一个自定义的帖子类型,名为;“汽车”;和这样的元域“;“型号”"E;制造商"E;年份。。等等,我想要的是使用多个元字段作为post permalink,并且只针对我的CPT”;“汽车”;(这一个我不确定),目前我的代码如下所示:

add_action(\'save_post\', \'set_slug\');

function set_slug($post_id){
    $new_slug = get_post_meta($post_id,\'maker\', true);
    $post_type = get_post_type($post,\'cars\', true);
    $post_args = array(
        \'ID\' => $post_id,
        \'post_name\' => $new_slug,
    );
    
    // unhook this function to prevent infinite loop
    remove_action( \'save_post\', \'set_slug\' );

    wp_update_post($post_args);
    // re-hook this function
    add_action( \'save_post\', \'set_slug\' );
}
我试图在彼此旁边添加更多的元字段,但没有成功,只使用了第一个元字段

我还是新手,非常感谢您的帮助。

谢谢

Edit:

我试图在我的CPT帖子中加入更多的元域,如下所示:“;www.mywebsite。com/汽车/制造商车型年”;

目前,我的代码如下所示,其工作方式符合我的要求post permalink但我想知道如何添加更多的元字段,并使其符合特定CPT的条件

add_action(\'save_post\', \'set_slug\');
if (get_post_type($post_object->ID) == \'car\') {
    function set_slug($post_id){
    $new_slug = get_post_meta($post_id, true);
    $post_args = array(
        \'ID\' => $post_id,
        \'post_name\' => $new_slug,
    );
    // unhook this function to prevent infinite loop
    remove_action( \'save_post\', \'set_slug\' );
}
    wp_update_post($post_args);
    // re-hook this function
    add_action( \'save_post\', \'set_slug\' );
}
我还应该添加以下内容:我有另一个代码,可以从我的表单字段设置帖子标题,如表单1:制造商+车型+年份=BMW-M3-2011Post title = Post permalink

只有当我在代码中将$new\\u slug设置为高于$new\\u slug=get\\u post\\u meta($post\\u id,true)的$new\\u slug时,这个才有效;

如果我把这弄糊涂了,我很抱歉,我不是故意的。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

仅使用第一个元字段

是的,这是因为$new_slug 只包含一个元maker.

所以如果你想添加其他元modelyear, 还有一个鼻涕虫<maker>-<model>-<year>, 您可以尝试下面的代码-只需替换$new_slug = get_post_meta($post_id,\'maker\', true); 在代码中使用以下内容:

注意:您应该使用first snippet 在问题中

// List of meta that will be added to the post slug (post_name). Just add another
// get_post_meta() if you want to add another meta to the slug. And just reposition
// the array items based on your preferences, e.g. you could put the \'year\' before
// \'maker\'.
$meta = array(
    get_post_meta( $post_id, \'maker\', true ),
    get_post_meta( $post_id, \'model\', true ),
    get_post_meta( $post_id, \'year\', true ),
);

$new_slug = implode( \'-\', array_filter( $meta ) );
仅针对我的CPT“;“汽车”;

你可以使用get_post_type() 像这样:

add_action( \'save_post\', \'set_slug\' );
function set_slug( $post_id ) {
    // Do nothing if the post type is NOT "cars".
    if ( \'cars\' !== get_post_type( $post_id ) ) {
        return;
    }

    // ... your code here.
}
但更简单的选择是使用save_post_<post type> hook 而不是save_post 像这样:

add_action( \'save_post_cars\', \'set_slug\' );
function set_slug( $post_id ) {
    // ... your code here.
}

其他注释只需删除$post_type = get_post_type($post,\'cars\', true); 从您的代码。

更新帖子之前,您应该确保slug与$new_slug 变量例如,添加以下内容after 以上$new_slug = implode( \'-\', array_filter( $meta ) );:

if ( strtolower( $new_slug ) === get_post_field( \'post_name\', $post_id ) ) {
    return;
}
  • “li>
  • ”;set\\U slug“设置”;是一个非常通用的名称,因此请使用一个足够唯一的更好的名称,例如。wpse_387941_set_slug.. (并确保在remove_action()add_action() 电话)。

  • 相关推荐

    列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

    这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在