#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()! Моя ставка, спасибо тебе!