根据 Wordpress 中的自定义字段值批量重写帖子 slug

Posted

技术标签:

【中文标题】根据 Wordpress 中的自定义字段值批量重写帖子 slug【英文标题】:Bulk rewrite post slugs based on custom field value in Wordpress 【发布时间】:2012-07-28 12:31:37 【问题描述】:

基本上,我有一个名为“Parts”的自定义帖子类型设置,其中当前包含 5,000 多个帖子。每个部件都有许多自定义字段,包括“部件号”。目前各部分的网址为:

http://site.com/parts/name-of-part/

我宁愿拥有的是:

http://site.com/parts/XXXX-608-AB/(这是零件号,存储为自定义字段“partno”。)

我认为我需要做两件事:

1) 根据自定义字段“partno”,创建一个脚本以批量编辑每个现有部件的所有 slug。

2) 挂钩到 Wordpress 函数以触发它始终根据自定义字段“partno”为新零件创建 slug。

有没有人知道如何完成这些方面的一个或两个方面?

更新:下面是我最终用于更改现有帖子的代码

// Set max posts per query
$max = 500;
$total = 5000; 

for($i=0;$i<=$total;$i+=$max) 

$parts = get_posts(array('post_type' => 'parts', 'numberposts' => $max, 'offset' => $i));

    // loop through every part
    foreach ( $parts as $part ) 

    // get part number
    $partno = get_post_meta( $part->ID, 'partno', true );   

    $updated_post = array();
    $updated_post['ID'] = $part->ID;
    $updated_post['post_name'] = $partno;
    wp_update_post( $updated_post ); // update existing posts
    echo $part->ID;
    

更新:下面是我在 functions.php 中用于更改正在进行的帖子的代码 (部分感谢https://wordpress.stackexchange.com/questions/51363/how-to-avoid-infinite-loop-in-save-post-callback)

add_action('save_post', 'my_custom_slug');
function my_custom_slug($post_id) 
     //Check it's not an auto save routine
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
        return;

 //Perform permission checks! For example:
    if ( !current_user_can('edit_post', $post_id) ) 
        return; 

    //If calling wp_update_post, unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'my_custom_slug');

    //call wp_update_post update, which calls save_post again. E.g:
if($partno != '')
        wp_update_post(array('ID' => $post_id, 'post_name' =>get_post_meta($post_id,'partno',true)));

    // re-hook this function
    add_action('save_post', 'my_custom_slug');

【问题讨论】:

【参考方案1】:

1) 创建一个新页面并为其分配一个新的页面模板,比如说site.com/updateupdate.php。 update.php里面写给你批量机制:

<?php // grab all your posts
$parts = get_posts(array('post_type' => 'parts', 'numberposts' => -1,))

// loop through every part
foreach ( $parts as $part ) 

    // get part number
    $partno = get_post_meta( $part->ID, 'parto', true );

    $updated_post = array();
    $updated_post['ID'] = $part->ID;
    $updated_post['post_name'] = $partno;
    wp_update_post( $updated_post ); // update existing posts

 ?>

您可以将它放在主题中的任何位置,但我喜欢为此创建一个页面,以便我可以轻松地使用它运行 cron 作业。

接下来是更改每个新创建帖子的 slug 的功能:

<?php function change_default_slug($id) 

    // get part number
    $partno = get_post_meta( $id, 'parto', true );
    $post_to_update = get_post( $id );

    // prevent empty slug, running at every post_type and infinite loop
    if ( $partno == '' || $post_to_update['post_type'] != 'parts' || $post_to_update['post_name'] == $partno )
        return;

    $updated_post = array();
    $updated_post['ID'] = $id;
    $updated_post['post_name'] = $partno;
    wp_update_post( $updated_post ); // update newly created post


add_action('save_post', 'change_default_slug'); ?>

上面的代码在每次保存帖子时运行(例如,第一次发布时)并将新的 post_name 设置为部件号。

【讨论】:

这看起来很棒!我现在将尝试实施。还有一个问题:有没有办法防止意外复制?例如,如果两个零件的零件编号相同,会发生什么?我认为 wp_update_post 没有考虑到这一点。 好的,我发现 wp_update_post 确实考虑了这一点的答案。它将检查 post_name 是否有重复项。

以上是关于根据 Wordpress 中的自定义字段值批量重写帖子 slug的主要内容,如果未能解决你的问题,请参考以下文章

如何从一组自定义字段值中显示 Wordpress 帖子

WordPress中的自定义表单并将值存储到自定义数据库中

在 localhost、Wordpress 和自定义字段上重写 img src url

根据 WooCommerce 中的自定义字段值将文本添加到订单摘要

PHP Wordpress中的自定义字段

Wordpress中的自定义字段