Intereting Posts
Как использовать тот же адрес электронной почты для нескольких пользователей в Multisite версии 4.7 Удаление ярлыка «WordPress» из строки заголовка Всякий раз, когда я делюсь фразой wordpress, автоматически добавляется, может ли кто-нибудь помочь? кто-нибудь может помочь мне узнать, что происходит не так? Изменить название сайта и описание html-тегов, если не домашняя страница Чтобы получать текущие данные страницы с помощью пользовательских перехватов при загрузке страницы Код обновления виджета не работает Доступ к плагинам для обычных пользователей не только администратор Как обрабатывать почтовые форматы? Ограничение пользователей для просмотра только пользовательских таксономий, которые они ввели? Удаление ассоциированных носителей при удалении страницы Следующая страница ссылки не работает категория URL-структуры Ошибка «достаточных разрешений» для администратора после дублирования базы данных WP для новой установки Как найти meta_values ​​для вызова

Назначение настраиваемого параметра для каждого сообщения в запросе

Я пытаюсь добавить инкрементную переменную в каждое сообщение, которое появляется в серии запросов. Цель состоит в том, чтобы вычислить вес для каждого результата, чтобы иметь возможность заказать все позже.

Это то, что я придумал до сих пор, но я делаю что-то неправильно, поскольку весы, кажется, складываются во всем мире, а не для каждого конкретного сообщения.

// set the variables $author_id = get_the_author_meta('ID'); $tags_id = wp_get_post_tags($post->ID); $first_tag = $tags_id[0]->term_id; $categories_id = wp_get_post_categories($post->ID); $weight = 0; // loop for same tag $by_tag = new WP_Query(array( 'tag__in' => $first_tag, 'posts_per_page' => '5' )); // attempting to assign values to posts - unsuccessfully if ($by_tag): foreach ($by_tag as $post): setup_postdata($post->ID); $weight += 2; endforeach; endif; // add ids to array if ( $by_tag->have_posts() ) { while ( $by_tag->have_posts() ) { $by_tag->the_post(); $add[] = get_the_id(); }} // loop for same category $by_category = new WP_Query(array( 'category__in' => $categories_id, 'posts_per_page' => '5' )); // same as before if ($by_category): foreach ($by_category as $post): setup_postdata($post->ID); $weight += 1; endforeach; endif; // add ids to array if ( $by_category->have_posts() ) { while ( $by_category->have_posts() ) { $by_category->the_post(); $add[] = get_the_id(); }} // loop array of combined results $related = new WP_Query(array( 'post__in' => $add, 'post__not_in' => array($post->ID), 'orderby' => $weight, 'order' => 'DESC', 'posts_per_page' => '10' )); // show them if ( $related->have_posts() ) { while ( $related->have_posts() ) { $related->the_post(); // [template] }} 

Solutions Collecting From Web of "Назначение настраиваемого параметра для каждого сообщения в запросе"

Это аккуратная идея!

Способ решения этой проблемы – создать ассоциативный массив идентификаторов сообщений, сопоставленных с их индивидуальными весами. Поскольку весы являются субъективными, то есть представляют собой значение отношений других сообщений с отображаемой в данный момент почтой, не имеет смысла хранить эти веса в базе данных каждый раз, когда вы обрабатываете эти отношения, и, таким образом, мы можем " t используйте WP_Query для упорядочения полученных сообщений; поэтому вместо этого вам нужно будет перестроить их на основе отсортированного массива весов.

К сожалению, поскольку мы не можем определить, какой вес какой-либо одной связанной должности до запроса таксономий, чтобы рассчитать наиболее «ценные» сообщения, которые мы должны запросить во всех связанных сообщениях, то есть с использованием запросов с аргументами, которые ограничивают число результатов не будет работать, поскольку вы не можете окончательно знать, что те, кто вернулся, имеют высокие значения.

Это приводит к тому, что эти связанные должности работают несколько дорого, вычислительно – в идеале вы в конечном итоге улучшаете процесс хранения наиболее релевантных связанных должностей и публикуете их по мере необходимости. Это можно сделать, сохранив их в метаданных предметной записи и только обновив этот список с запланированной операцией или сохранив связанные записи в качестве временных данных, а затем обновите только этот список, когда истекает переходный период.


Реализация

В приведенной ниже (полностью непроверенной, скорее всего, не вполне функциональной) функции возникает объект post (представляющий тему «subject») и имена таксономии сопоставления массива с целыми значениями (представляющие, сколько «весовых» должностей должно получать для совместного использования термина в это таксономия с предметом). Он возвращает экземпляр WP_Query с массивом posts отсортированным в соответствии с рассчитанными весами.

Я думаю, это несколько отличается от того, что вам нужно, поскольку оно учитывает все термины субъекта (что также делает его более дорогостоящим), но он должен дать вам некоторые идеи.

'tax_query' аргумент 'tax_query' для экземпляра WP_Query из всех соответствующих таксономий, вы можете использовать один запрос, чтобы получить каждое сообщение, которое разделяет соответствующий термин с субъектом вместо одного для каждой таксономии. Это делает код немного более запутанным, чем использование функций, связанных с тегами и категориями, и аргументов WP_Query но сокращение количества запросов обычно является целесообразной оптимизацией.

 function wpse_232759_get_term_related_query( $post = null, $shared_taxonomy_values = null, $query_args = [] ) { $subject = get_post( $post ); $subject_id = $subject->ID; $subject_taxonomies = get_object_taxonomies( $subject ); $subject_term_ids = []; $post_weights = []; if( !isset( $shared_taxonomy_values ) ) { $shared_taxonomy_values = [ 'category' => 1, // Sharing a category is worth 1 point by default 'post_tag' => 1 // Sharing a tag is worth 1 point by default ]; } // Build a WP_Query 'tax_query' argument to find every post that shares a tag or category $shared_term_tax_query = [ 'relation' => 'OR' ]; foreach( $shared_taxonomy_values as $taxonomy_name => $shared_term_value ) { // If the subject doesn't actually use this taxonomy, move on if( !in_array( $taxonomy_name, $subject_taxonomies ) ) continue; // Record the subject's term ids in this taxonomy $subject_term_ids[ $taxonomy_name ] => array_map( function( $term ) { return $term->term_id; }, get_the_terms( $subject, $taxonomy_name ) ); // Add to the tax_query $shared_term_tax_query[] = [ 'taxonomy' => $taxonomy_name, 'terms' => $subject_term_ids[ $taxonomy_name ] ]; } // Add generated query args to any supplied by the user $query_args[ 'post__not_in' ] = $subject_id; // Ignore the subject $query_args[ 'tax_query' ] = $shared_term_tax_query; // Get all posts with a shared term in a taxonomy with value $term_related_query = new WP_Query( $query_args ); // Increment the weight of each related post for every term it shares foreach( $tax_related_query->posts as $object ) { foreach( $shared_taxonomy_values as $taxonomy_name => $shared_term_value ) { // Get an array of this post's term ids in this taxonomy $object_tax_term_ids = array_map( function( $term ) { return $term->term_id; }, get_the_terms( $object, $taxonomy_name ) ); // Create an array containing the term ids for this taxonomy that both the subject and this post share $shared_tax_term_ids = array_intersect( $subject_term_ids[ $taxonomy_name ], $object_tax_term_ids ); // If this post doesn't have a weight yet, create it and set it to "0" if( !isset( $post_weights[ $object->ID ] ) ) $post_weights[ $object->ID ] = 0; // Add to this post's weight the value for a shared term in this taxonomy multiplied by the number of shared terms $post_weights[ $object->ID ] += $shared_term_value * count( $shared_tax_term_ids ); } } // Re-arrange the related posts array based on the calculated weights by using a custom sorting function $term_related_query->posts = usort( $term_related_query->posts, function( $a, $b ) { if( $post_weights[ $a->ID ] === $post_weights[ $b->ID ] ) return 0; // The posts have the same weight if( $post_weights[ $a->ID ] > $post_weights[ $b->ID ] ) return 1; // Post $a has a larger weight than post $b return -1; // Post $b has a larger weight than post $a } ); // Return the related posts query with modified post order return $term_related_query; } 

Затем эту функцию можно использовать как таковую:

 // Get a term-related WP_Query object with posts organized by weight, // where a shared category is worth 1 pt and a shared tag worth 2 $related_query = wpse_232759_get_term_related_query( $post, [ 'category' => 1, 'post_tag' => 2 ] ); // Loop through all term-related posts - display the 5 with the highest weights if( $related_query->have_posts() ) { while( $related_query->have_posts() && $related_query->current_post < 5 ) { $related_query->the_post(); ?> <!-- Related post markup --> <?php } } 

Вот полный рабочий код для тех, кому он может понадобиться:

 $tags_id = wp_get_post_tags($post->ID); $first_tag = $tags_id[0]->term_id; $categories_id = wp_get_post_categories($post->ID); $first_category = $categories_id[0]; $by_tag = new WP_Query( array( 'post__not_in' => array($post->ID), 'tag__in' => $first_tag ) ); if ( $by_tag->have_posts() ) { while ( $by_tag->have_posts() ) { $by_tag->the_post(); $add[] = get_the_id(); $weight[$post->ID] += 2; wp_reset_query(); }} $by_category = new WP_Query( array( 'post__not_in' => array($post->ID), 'category__in' => $categories_id ) ); if ( $by_category->have_posts() ) { while ( $by_category->have_posts() ) { $by_category->the_post(); $add[] = get_the_id(); $weight[$post->ID] += 1; wp_reset_query(); }} arsort($weight); foreach ($weight as $key => $value) { $posts_ordered[] = $key; } $related = new WP_Query( array( 'post__in' => $posts_ordered, 'orderby' => 'post__in','posts_per_page' => '60') ); if ( $related->have_posts() ) { while ( $related->have_posts() ) { $related->the_post(); // template }}