title: Prevent access to checkout without shipping method in WooCommerce
body: <p>I am trying to remove the proceed to checkout button and restrict access to the checkout page until a customer fills out the 'Calculate shipping' option on the basket page.</p>
  
  <p>I created a local shipping method that's restricted to multiple post/zipcodes. I then went and added this to my functions.php file.</p>
  
  <pre><code>function disable_checkout_button_no_shipping() {
    $package_counts = array();
  
    // get shipping packages and their rate counts
    $packages = WC()-&gt;shipping-&gt;get_packages();
    foreach( $packages as $key =&gt; $pkg )
        $package_counts[ $key ] = count( $pkg[ 'rates' ] );
  
    // remove button if any packages are missing shipping options
    if( in_array( 0, $package_counts ) )
        remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );
  }
  add_action( 'woocommerce_proceed_to_checkout', 'disable_checkout_button_no_shipping', 1 );
  </code></pre>
  
  <p>However when I test the site in different browsers and in incognito modes the 'Proceed to checkout' button is there. </p>
  
  <p>If I click on the 'Calculate shipping' link and not fill out the form but update it the button disappears. I basically want the button to appear when a customer fills out the 'Calculate shipping' form on the cart page (and have one of the postcodes in my shipping method) before being able to proceed to the checkout page.</p>