Woocommerce — пользовательский запрос с коротким кодом в пользовательской вкладке тайм — аут-почему?

#wordpress #woocommerce

#wordpress #woocommerce

Вопрос:

Я следил за некоторыми онлайн-уроками по созданию пользовательской вкладки на странице «Моя учетная запись» в woocommerce. Все идет хорошо, примите предложение о добавлении шорткода в содержимое пользовательской вкладки.

Код для регистрации пользовательской вкладки выглядит следующим образом:

 //add new tab to my account  function bbloomer_add_premium_support_endpoint() {  add_rewrite_endpoint( 'mijn-elearning', EP_ROOT | EP_PAGES ); }   add_action( 'init', 'bbloomer_add_premium_support_endpoint' );   // 2. Add new query var   function bbloomer_premium_support_query_vars( $vars ) {  $vars[] = 'mijn-elearning';  return $vars; }   add_filter( 'query_vars', 'bbloomer_premium_support_query_vars', 0 );   // ------------------ // 3. Insert the new endpoint into the My Account menu   function bbloomer_add_premium_support_link_my_account( $items ) {  $items['mijn-elearning'] = 'Mijn Elearnings';  return $items; }   add_filter( 'woocommerce_account_menu_items', 'bbloomer_add_premium_support_link_my_account' );   // ------------------ // 4. Add content to the new tab   function bbloomer_premium_support_content() {  echo do_shortcode('[dashboard_student]'); }   add_action( 'woocommerce_account_mijn-elearning_endpoint', 'bbloomer_premium_support_content' );  

шорткод определяется следующим образом:

 function dashboard_function($atts = array(),$html = 'test',$name) {  ob_start();  $query = New WP_QUERY( array ('post_type'=gt;'programma','posts_per_page'=gt;-1,'meta_query' =gt; array( array( 'key' =gt; 'level', 'value' =gt; 'programma', 'compare' =gt; 'LIKE'),),),);  while($query-gt;have_posts()){  $html .= 'lt;ligt;lt;a href="'.get_the_permalink.'"gt;'.get_the_title().'lt;/agt;lt;/ligt;';  }  $html .= 'lt;/ulgt;';  wp_reset_postdata();  ob_get_clean();  return $html; } add_shortcode('dashboard_student','dashboard_function');  function add_to_init() {  add_shortcode('dashboard_student','dashboard_function'); } add_action('init','add_to_init');  

Однако, похоже, что запрос на пользовательской вкладке невозможен. Он застревает, и даже когда я предоставляю полный доступ к памяти сервера, я получаю фатальную ошибку: «Разрешенный размер памяти 536870912 байт исчерпан» (или любое большее число).

Есть какие-нибудь идеи?

Ответ №1:

Вам нужно добавить the_post() функцию.

 /**  * Sets up the current post.  *  * Retrieves the next post, sets up the post, sets the 'in the loop'  * property to true.  *  * @since 1.5.0  *  * @global WP_Post $post Global post object.  */ public function the_post() {  global $post;  $this-gt;in_the_loop = true;   if ( -1 == $this-gt;current_post ) { // Loop has just started.  /**  * Fires once the loop is started.  *  * @since 2.0.0  *  * @param WP_Query $query The WP_Query instance (passed by reference).  */  do_action_ref_array( 'loop_start', array( amp;$this ) );  }   $post = $this-gt;next_post();  $this-gt;setup_postdata( $post ); }  

Я пересмотрел ваш кодекс. Попробуйте выполнить приведенный ниже код.

 function dashboard_function($atts = array(),$html = 'test',$name) {  ob_start();  $query = New WP_QUERY(   array(  'post_type' =gt; 'programma',  'posts_per_page' =gt; -1,  'meta_query' =gt; array(   array(   'key' =gt; 'level',   'value' =gt; 'programma',   'compare' =gt; 'LIKE'  )  )  )  );   $html = 'lt;ulgt;';  if( $query-gt;have_posts() ) {   while($query-gt;have_posts()){   $query-gt;the_post();  $html .= 'lt;ligt;lt;a href="'.get_the_permalink().'"gt;'.get_the_title().'lt;/agt;lt;/ligt;';  }   wp_reset_postdata();   }  $html .= 'lt;/ulgt;';    ob_get_clean();   return $html; } add_shortcode('dashboard_student','dashboard_function');  

Комментарии:

1. Я могу подтвердить, что это работает. В принципе, вы добавили if($query-gt;есть сообщения()); я никогда не понимал, зачем это нужно?

2. if($query-gt;have posts()); это проверит, действительно ли запрос нашел какие-либо сообщения.

3. ах, теперь я вижу, что редактирование находится в $query-gt;the_post()! Моя ставка, спасибо тебе!