Пользовательская таксономия Wordpress (актеры), отображение сегодняшних дней рождения на главной странице с запросом

У меня есть веб-сайт с фильмами, где фильмы представлены в виде постов, а актеры — в виде пользовательской таксономии. Для моей пользовательской таксономии я добавил это в свой файл functions.php:

    $labels = array(
    'name'                       => _x( 'Actors', 'taxonomy general name', 'textdomain' ),
    'singular_name'              => _x( 'Actor', 'taxonomy singular name', 'textdomain' ),
    'search_items'               => __( 'Search Actors', 'textdomain' ),
    'popular_items'              => __( 'Popular Actors', 'textdomain' ),
    'all_items'                  => __( 'All Actors', 'textdomain' ),
    'parent_item'                => null,
    'parent_item_colon'          => null,
    'edit_item'                  => __( 'Edit Actor', 'textdomain' ),
    'update_item'                => __( 'Update Actor', 'textdomain' ),
    'add_new_item'               => __( 'Add New Actor', 'textdomain' ),
    'new_item_name'              => __( 'New Actor Name', 'textdomain' ),
    'separate_items_with_commas' => __( 'Separate actors with commas', 'textdomain' ),
    'add_or_remove_items'        => __( 'Add or remove actors', 'textdomain' ),
    'choose_from_most_used'      => __( 'Choose from the most used actors', 'textdomain' ),
    'not_found'                  => __( 'No actors found.', 'textdomain' ),
    'menu_name'                  => __( 'Actors', 'textdomain' ),
);

$args = array(
    'hierarchical'          => false,
    'labels'                => $labels,
    'show_ui'               => true,
    'show_admin_column'     => true,
    'update_count_callback' => '_update_post_term_count',
    'query_var'             => true,
    'rewrite'               => array( 'slug' => 'actor' ),
);

register_taxonomy( 'actor', 'post', $args );

Я добавил в таксономию актеров поле с датой их рождения (в формате гггг-мм-дд) в моем файле functions.php:

function crq_taxonomy_add_new_meta_field() {    
// this will add the custom meta field to the add new term page 
?>  
<div class="form-field">            
    <label for="term_meta[starbday]"><?php _e( 'Birthdate', 'responsivo' ); ?></label>          
    <input type="text" name="term_meta[starbday]" id="term_meta[starbday]" value="">        
    <p class="description"><?php _e( 'Enter Birthdate (in <em>yyyy-mm-dd</em> format)','responsivo' ); ?></p>   
</div>
<?php }
 add_action( 'actor_add_form_fields', 'crq_taxonomy_add_new_meta_field', 10, 2 );
// Edit term page
function crq_taxonomy_edit_meta_field($term) {
// put the term ID into a variable      
$t_id = $term->term_id;     
// retrieve the existing value(s) for this meta field. This returns an array        

$term_meta = get_option( "taxonomy_$t_id" );    
?>
<tr class="form-field">     
<th scope="row" valign="top">
<label for="term_meta[starbday]"><?php _e( 'Birthdate', 'responsivo' );     
?>      
</label>    
</th>               
<td>                
<input type="text" name="term_meta[starbday]" id="term_meta[starbday]" value="<?php echo esc_attr( $term_meta['starbday'] ) ? esc_attr( $term_meta['starbday'] ) : ''; ?>">     
<p class="description"><?php _e( 'Enter Birthdate (in <em>yyyy-mm-dd</em> format)','responsivo' ); ?></p>       
</td>   </tr>
add_action( 'actor_edit_form_fields', 'crq_taxonomy_edit_meta_field', 10, 2 );
// Save extra taxonomy fields callback function.
function save_taxonomy_custom_meta( $term_id ) {        
if ( isset( $_POST['term_meta'] ) ) {               
$t_id = $term_id;               
$term_meta = get_option( "taxonomy_$t_id" );        
$cat_keys = array_keys( $_POST['term_meta'] );              
foreach ( $cat_keys as $key ) {                     
if ( isset ( $_POST['term_meta'][$key] ) ) {    
$term_meta[$key] = $_POST['term_meta'][$key];           
}               
} 
// Save the option array.               
update_option( "taxonomy_$t_id", $term_meta );  
}}  
add_action( 'edited_actor', 'save_taxonomy_custom_meta', 10, 2 );  
add_action( 'create_actor', 'save_taxonomy_custom_meta', 10, 2 );

Я могу показать это поле на странице таксономии актера с помощью следующего кода в шаблоне таксономии:

<?php 
$birthd = $term_meta['starbday'];
echo date('F j, Y', strtotime($birthd)); 
?>

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

<ul>
    <?php 
    $todaymd = date('m-d');
    $args = array(
        'taxonomy' => 'actor',
        'orderby' => 'name'
        'order' => 'ASC',
        'hide_empty' => false,
        'meta_query' => array(
            array(
                'key' => 'starbday',
                'value' => '_____'.$todaymd, 
                'compare' => 'LIKE'
            )
        )
    );
    $terms = get_terms( 'actor', $args );
    foreach( $terms as $term ) { ?>
        <li><?php echo $term->name; ?></li>
    <?php } ?>
</ul>

Это вообще не работает, и ничего не отображается. Хотя это было бы так, если бы в сегодняшнюю дату не было дней рождения, даже если я изменю $todaymd на '03-15' (что, как я знаю, является месяцем и днем ​​​​рождения нескольких актеров), все равно ничего не отображается. Какие-либо предложения?

Я видел нечто подобное, заданное здесь... https://wordpress.stackexchange.com/questions/82323/how-can-i-get-the-actor-birthday-by-date, но на него не ответили, так как решение не сработало.


person Reid C.    schedule 29.03.2018    source источник
comment
Я что-то видел на make.wordpress.org/ core/2015/10/23/4-4-taxonomy-roundup о новом обновлении таксономии в WordPress 4.4, но я не уверен, как это применимо/не относится к этому.   -  person Reid C.    schedule 29.03.2018
comment
Это не работает, потому что вы использовали update_option() для сохранения метаданных термина. Во-вторых, хотя это и возможно, заставить работать запрос get_terms() довольно сложно; Я имею в виду, для поиска актеров с указанным днем ​​и месяцем рождения. Короче говоря, перенесите свои функции на использование update_term_meta()get_term_meta()). Затем вы можете сделать meta_query через, например, get_terms(). Я могу показать пример кода, если он вам все еще нужен.   -  person Sally CJ    schedule 29.03.2018
comment
Если бы вы могли предоставить пример кода, это было бы здорово!   -  person Reid C.    schedule 29.03.2018


Ответы (1)


На самом деле, Салли Джей, я понял это благодаря https://www.wphub.com/blog/posts/adding-metadata-taxonomy-terms/ (упс! неправильная ссылка! см. дополнение ниже) для раздела functions.php и обновления домашней страницы с этим:

<ul>
     <?php 
     $todaymd = date('m-d');
     $args = array(
         'taxonomy' => 'actor',
         'orderby' => 'name',
         'order' => 'ASC',
     );
     $terms = get_terms( $args );
     foreach( $terms as $term ) { 
         $starbday = get_term_meta($term->term_id, 'starbday', true);
         if((substr($starbday,5,5)) == $todaymd) { ?>
               <li><?php echo $term->name; ?></li>
         <?php } else { }} ?>
</ul>

Сейчас это работает, но кажется не самым эффективным способом (поскольку я вытаскиваю всех актеров, а затем фильтрую их, а не фильтрую при их получении), но это работает.

Спасибо за помощь!

ОБНОВЛЕНИЕ Поскольку я указал неправильную ссылку выше, вот что сейчас находится в моем файле functions.php:

// Add term page for Actor, Director and Book Author Taxonomies
add_action('actor_add_form_fields', 'crq_metabox_add', 10, 1); 
add_action('actor_edit_form_fields', 'crq_metabox_edit', 10, 1);

function crq_metabox_add($tag) {
?>
    <div class="form-field">            
        <label for="crq_starbday"><?php _e( 'Birthdate', 'responsivo' ); ?></label>         
        <input type="text" name="crq_starbday" id="crq_starbday" value="">      
        <p class="description"><?php _e( 'Enter Birthdate (in <em>yyyy-mm-dd</em> format)','responsivo' ); ?></p>   
    </div>
<?php }

// Edit term page for Actor, Director and Book Author Taxonomies

function crq_metabox_edit($tag) {
?>

<tr class="form-field">
    <th scope="row" valign="top">
        <label for="crq_starbday"><?php _e( 'Birthdate', 'responsivo' ); ?></label>
    </th>
    <td>
        <input type="text" name="crq_starbday" id="crq_starbday" value="<?php echo get_term_meta($tag->term_id, 'crq_starbday', true); ?>" />
        <p class="description"><?php _e( 'Enter Birthdate (in <em>yyyy-mm-dd</em> format)','responsivo' ); ?></p>       
    </td>   
</tr>
<?php 
}

// Save extra fields for Actor, Director and Book Author Taxonomies

add_action( 'created_actor', 'save_taxonomy_metadata', 10, 1 );  
add_action( 'edited_actor', 'save_taxonomy_metadata', 10, 1 );

function save_taxonomy_metadata($term_id)
{
    if (isset($_POST['crq_starbday'])) {
        update_term_meta( $term_id, 'crq_starbday', $_POST['crq_starbday']); 
    }
}

... который использует новый (er) update_term_meta(). Я пытался использовать meta_query() на главной странице, но это не отображало никаких результатов (вероятно, потому, что $todaymd и starbday такие разные (starbday — это гггг-мм-дд, а $todaymd — это просто мм-дд). тоже работа.

person Reid C.    schedule 30.03.2018
comment
Если вы перешли на использование update_term_meta() для сохранения метаданных, у вас не должно возникнуть проблем с использованием meta_query с функцией get_terms(). т.е. 'meta_query' => array( array( 'key' => 'starbday', value => $todaymd, 'compare' => 'LIKE' ) );. Но я имею в виду нативную функцию update_term_meta() в WordPress версии 4.4.0 и выше. знак равно - person Sally CJ; 30.03.2018
comment
На самом деле, meta_query теперь работает с LIKE. Я забыл, что обновил свое поле до crq_starbday. Благодарю вас! - person Reid C.; 30.03.2018