Intereting Posts
the_post_thumbnail () получает URL-адрес изображения среднего размера получение страницы 404 для всех страниц, кроме дома. возможно постоянная ссылка Как я могу автоматически установить почтовый пул на основе заголовка сообщения во время публикации публикации? Настройка таблиц WP или добавление новых? Как вы применяете несколько скинов к сайту с помощью селектора «шаблонов», используя переключение стилей? Сообщение нижнего колонтитула администратора не отображается внизу Как проверить запрос поискового запроса Как ограничить доступ к видео на прямой URL-адрес Как получить имя и описание боковой панели в теме? Самый эффективный способ для структуры URL html Пользовательский тип сообщения или пользовательские таблицы перевод (i18n) должен начинаться с английского ПО? Моя связующая форма URL-адреса в html для PHP не работает Проверка длины строки в поле области администрирования onblur с помощью jQuery Как оценить массив get_posts с is_page?

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

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

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

// 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 }}