最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

php - add_filter() inside another add_filter()

matteradmin6PV0评论

I'm simply trying to call one (update post description) if the other signals out of stock. They both work perfectly independently:

function single_product_short_description( $post_excerpt ){
    global $product;

    $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;

    if ( is_single( $product_id ) )
      $post_excerpt = '<p class="some-class">' . __( "Out of stock short desc here", "woocommerce" ) . '</p>';

    return $post_excerpt;
}

function custom_get_availability( $availability, $_product ) {
  global $product, $bar, $progress;
  $stock = $product->get_total_stock();
  $progress = 100-$stock;   
  $bar = do_shortcode('[wp_progress_bar text="Tickets Sold - " pc='.$progress.']');

  if ( $_product->is_in_stock() ) {
    $availability['availability'] = __($bar, 'woocommerce');
  }
  if ( !$_product->is_in_stock() ) {
    add_filter( 'woocommerce_short_description', 'single_product_short_description', 10, 1 );
  }
  return $availability;
}

add_filter( 'woocommerce_get_availability', 'custom_get_availability', 1, 2);

What am I doing wrong?

I'm simply trying to call one (update post description) if the other signals out of stock. They both work perfectly independently:

function single_product_short_description( $post_excerpt ){
    global $product;

    $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;

    if ( is_single( $product_id ) )
      $post_excerpt = '<p class="some-class">' . __( "Out of stock short desc here", "woocommerce" ) . '</p>';

    return $post_excerpt;
}

function custom_get_availability( $availability, $_product ) {
  global $product, $bar, $progress;
  $stock = $product->get_total_stock();
  $progress = 100-$stock;   
  $bar = do_shortcode('[wp_progress_bar text="Tickets Sold - " pc='.$progress.']');

  if ( $_product->is_in_stock() ) {
    $availability['availability'] = __($bar, 'woocommerce');
  }
  if ( !$_product->is_in_stock() ) {
    add_filter( 'woocommerce_short_description', 'single_product_short_description', 10, 1 );
  }
  return $availability;
}

add_filter( 'woocommerce_get_availability', 'custom_get_availability', 1, 2);

What am I doing wrong?

Share Improve this question asked Mar 24, 2019 at 18:57 eddiewastakeneddiewastaken 1111 bronze badge 1
  • I would guess that the call to woocommerce_short_description you're trying to hook into has already happened when you add that hook in woocommerce_get_availability. – mrben522 Commented Mar 24, 2019 at 19:26
Add a comment  | 

1 Answer 1

Reset to default 0

I would use do_action instead of add_filter. While similar, you are hooking into an action verse filtering a function. close, but different.

 function custom_get_availability( $availability, $_product ) {
   global $product, $bar, $progress;
   $stock = $product->get_total_stock();
   $progress = 100-$stock;   
   $bar = do_shortcode('[wp_progress_bar text="Tickets Sold - " pc='.$progress.']');

   if ( $_product->is_in_stock() ) {
     $availability['availability'] = __($bar, 'woocommerce');
   }
   if ( !$_product->is_in_stock() ) {
     do_action( 'woocommerce_short_description', single_product_short_description' );
   }
   return $availability;
   }



 function single_product_short_description( $post_excerpt )
  {
     global $product;
     remove_action( 'woocommerce_short_description', single_product_short_description' );


     $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;

     if ( is_single( $product_id ) )
        $post_excerpt = '<p class="some-class">' . __( "Out of stock short desc here", "woocommerce" ) . '</p>';


return $post_excerpt;
 }

Good article on the subject: https://wpsmith/2011/the-difference-between-do_action-add_action-and-add_filter/

Articles related to this article

Post a comment

comment list (0)

  1. No comments so far