在wordpress中批量更新所有分类术语

tyg4sfes  于 2022-12-03  发布在  WordPress
关注(0)|答案(2)|浏览(157)

我的自定义帖子类型“references”有一个名为“references_count”的自定义字段。它有一个数值。
我有一个名为“country”的自定义分类,其中包含一个名为“country_count”的术语自定义字段。

**背景:**自定义帖子类型“references”保存了 * 城市 * 以及该城市 * 中的 * 客户数量。该值保存在字段“references_count”中。在自定义分类中,存在国家/地区。对于每个国家/地区,都存在 * 引用总数 *。
**示例:**在“柏林”城市中有3个客户端。在“慕尼黑”城市中有2个客户端。分类术语“德国”包括此国家/地区中所有城市的总和。因此,在此示例中,分类术语“Germany”的“country_count”值为5,即每个城市的引用的总和。

我写的这段代码是有效的,如果我保存每个分类术语的话。

add_action( 'edited_country', 'update_counter_for_countries', 10, 2 );
 
function update_counter_for_countries( $term_id ) {

// Get posts with term
$args = array(
    'post_type' => 'reference',
    'posts_per_page' => -1,
    'tax_query' => array(
        array(
        'taxonomy' => 'country',
        'field' => 'term_id',
        'terms' => $term_id
        )
    )
);
$the_query = new WP_Query( $args );

// sum values in posts
$sumTerm = 0;
if ( $the_query->have_posts() ) {
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        $number = get_field( 'references_count', get_the_ID() );
        $sumTerm = $sumTerm + $number;
    }
}
wp_reset_postdata();

// update field in term
update_field( 'country_count', $sumTerm, 'country'.'_'.$term_id );
}

**问题:**我有100多个国家/地区(分类术语),因此我必须单独保存每个术语才能继续工作。
**我正在寻找的:**有没有一种方法可以一次更新/保存所有的自定义分类术语,这样我就不必分别更新每个术语了?我检查了很多插件,但没有找到任何插件可以提供“批量编辑”或“批量保存”分类术语的可能性。如果可能的话,我更喜欢没有插件的解决方案。我非常感谢任何提示,非常感谢。

ctehm74n

ctehm74n1#

您可以使用此代码一次性更新所有术语。只需确保备份数据库以备不时之需。
此代码将遍历所有术语,并且只运行一次。之后,您可以删除此代码。
为了使此代码仅在您的IP上运行,请将www.example.com更改111.111.111.111为您的IP地址。

if($_SERVER["REMOTE_ADDR"]=='111.111.111.111'){
//run only my ip
    add_action("init","update_all_terms_in_one_go");
}

function update_all_terms_in_one_go(){
    session_start();
    if(isset($_SESSION['all_terms_updated']) && $_SESSION['all_terms_updated'] == "done"){
        return;
    }
    $taxonomy = "country";
    $terms = get_terms([
        'taxonomy' => $taxonomy,
        'hide_empty' => false,
    ]);
    foreach ($terms as $term) {
        update_counter_for_countries( $term->term_id );
    }
    $_SESSION['all_terms_updated'] = "done";
    echo "ALL TAXONOMY TERMS UPDATED";
    die();

}

function update_counter_for_countries( $term_id ) {
// Get posts with term
    $args = array(
        'post_type' => 'reference',
        'posts_per_page' => -1,
        'tax_query' => array(
            array(
                'taxonomy' => 'country',
                'field' => 'term_id',
                'terms' => $term_id
            )
        )
    );
    $the_query = new WP_Query( $args );

// sum values in posts
    $sumTerm = 0;
    if ( $the_query->have_posts() ) {
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
            $number = get_field( 'references_count', get_the_ID() );
            $sumTerm = $sumTerm + $number;
        }
    }
    wp_reset_postdata();
// update field in term
    update_field( 'country_count', $sumTerm, 'country'.'_'.$term_id );
}
bgibtngc

bgibtngc2#

我希望有一个整洁的管理页面,带有一个按钮来批量更新我所有的分类术语。这个过程应该使用 AJAX ,所以它可以花一段时间,而不会让用户感到困惑。应该有状态消息。

所以在第一步我添加了一个新的管理页面到WordPress后端。

add_action( 'admin_menu', array( $this, 'my_admin_page' ) );

function my_admin_page() {
    add_menu_page(
        __('Bulk Terms'), // page title
        __('Bulk Terms'), // menu title
        'manage_options', // user capabilities
        'options-page', // menu slug
        'my_output_function', // output function
        'dashicons-admin-generic', // menu icon
        77 // menu position
    );
}

在输出函数中,我放置了一个带有按钮的表单,用于批量更新条款,以及一些状态消息。

function my_output_function() {
    echo '<div class="wrap">';
        echo '<form action="admin.php?page=options-page" method="post">';
            wp_nonce_field( 'ajax_validation', 'nonce' ); // security feature
            submit_button('Update Terms', 'primary', 'submitOptions', false);
        echo '</form>';
        echo '<div id="processing" style="display:none;">Please wait</div>';
        echo '<div id="error" style="display:none;">Something went wrong</div>';
        echo '<div id="success" style="display:none;">Done!</div>';
    echo '</div>';
}

在第二步中,我必须为 AJAX 调用将脚本文件入队:

add_action( 'admin_enqueue_scripts', 'my_ajax_scripts' );

function my_ajax_scripts() {
  // Check if on specific admin page
  global $pagenow;
  if (( $pagenow == 'admin.php' ) && ($_GET['page'] == 'options-page')):
    wp_enqueue_script( 'ajaxcalls', plugin_dir_url( __FILE__ ).'/js/ajax-calls.js', array('jquery'), '1.0.0', true );

    wp_localize_script( 'ajaxcalls', 'ajax_object', array(
      'ajaxurl' => admin_url( 'admin-ajax.php' ),
      'ajaxnonce' => wp_create_nonce( 'ajax_validation' )
    ) );
  endif;
}

并创建批量更新我的所有税收术语的函数:

function options_page_action() {
    $taxonomy = "country";
    $terms = get_terms([
        'taxonomy' => $taxonomy,
        'hide_empty' => false,
    ]);
    foreach ($terms as $term) {
        $term_id = $term->term_id;
        // Get posts with term
        $args = array(
            'post_type' => 'reference',
            'posts_per_page' => -1,
            'tax_query' => array(
                array(
                    'taxonomy' => 'country',
                    'field' => 'term_id',
                    'terms' => $term_id
                )
            )
        );
        $the_query = new WP_Query( $args );

        // sum values in posts
        $sumTerm = 0;
        if ( $the_query->have_posts() ) {
            while ( $the_query->have_posts() ) {
                $the_query->the_post();
                $number = get_field( 'references_count', get_the_ID() );
                $sumTerm = $sumTerm + $number;
            }
        }
        wp_reset_postdata();
        // update field in term
        update_field( 'country_count', $sumTerm, 'country'.'_'.$term_id );
    }
    $result = array( 'status' => 'success' ); // create response
    wp_send_json_success( $result ); // send response
    wp_die(); // close ajax request
}

第三步,在ajax_calls. js文件中,我使用click事件调用函数,以便使用ajax更新分类术语。

$( '#submitOptions' ).click( function(event) {
  event.preventDefault();
  $('#submitOptions').css('cssText','display:none;');
  $('#processing').css('cssText','display: block;');
  $.ajax({
    type: 'POST',
    url: ajax_object.ajaxurl,
    data: {
        action: 'options_page_action',
        nonce: ajax_object.ajaxnonce
    },
    success: function( response ) {
      if( response['data']['status'] == 'success' ) {
        $('#processing').css('cssText','display:none;');
        $('#success').css('cssText','display:block;');
      }
    },
    error: function() {
      $('#processing').css('cssText','display:none;');
      $('#error').css('cssText','display:block;');
    }
  });
});

有消息表明该功能正在运行,它显示消息时,它完成或有一个错误。这样,用户将始终知道发生了什么事时,批量更新条款。

相关问题