保留中の投稿を公開しているモデレータ(編集者ロールを持つユーザ)の名前をリストしようとしています。最新の10の公開された投稿と作者を表示するダッシュボードウィジェットを作成しましたが、それを公開したユーザーを取得するのに問題があります。私はthe_modified_author
がそれであるかもしれないと思いました、しかし誰がその投稿を公開したかを知るより良い方法があるかどうか私にはわかりませんか?これが私のコードです。
function dashboard_widget_function() {
$args = array( 'post_status' => 'publish', 'numberposts' => '10', 'post_type' => 'post');
$recent_posts = wp_get_recent_posts( $args );
echo '<table><tr>
<th>Post Title</th>
<th>Author</th>
<th>Moderated by</th></tr>';
foreach( $recent_posts as $recent ){
$post_author = get_user_by( 'id', $recent['post_author'] );
echo '<tr><td><a href="' . get_permalink($recent["ID"]) . '" title="Read: '.esc_attr($recent["post_title"]).'" >' . $recent["post_title"].'</a></td>';
echo '<td>'. $post_author->display_name .'</td>';
echo '<td>'.get_the_modified_author().'</td></tr>';
}
echo '</table>';
}
get_the_modified_author()
が機能していないのは、WordPressループ内で使用されているからです。 wp_get_recent_posts()
はグローバルな投稿オブジェクトを設定しません。これは、投稿を編集した最後の人の名前を取得するためのget_the_modified_author()
を簡単なコードに置き換える、元のコードに基づく完全な例です(これは基本的にget_the_modified_author()
の機能です)。
__コード__
コメントからのフィードバックに基づいて編集: このコードは、/**
* Add a widget to the dashboard.
*
* This function is hooked into the 'wp_dashboard_setup' action below.
*/
function example_add_dashboard_widgets() {
wp_add_dashboard_widget(
'example_dashboard_widget', // Widget slug.
'Example Dashboard Widget', // Title.
'example_dashboard_widget_function' // Display function.
);
}
add_action( 'wp_dashboard_setup', 'example_add_dashboard_widgets' );
function example_dashboard_widget_function() {
$items_to_show = 10;
$counter = 0;
$recent_posts = wp_get_recent_posts( [
'post_status' => 'publish',
'numberposts' => '50', // More than we want, but tries to ensure we have enough items to display.
'post_type' => 'post'
] );
echo '<table>
<tr>
<th>Post Title</th>
<th>Author</th>
<th>Moderated by</th>
</tr>';
foreach ( $recent_posts as $recent ) {
$post_author = get_user_by( 'id', $recent['post_author'] );
$last_user_id = get_post_meta( $recent['ID'], '_edit_last', true );
$last_user = get_userdata( $last_user_id );
// Bail out of the loop if we've shown enough items.
if ( $counter >= $items_to_show ) {
break;
}
// Skip display of items where the author is the same as the moderator:
if ( $post_author->display_name === $last_user->display_name ) {
continue;
}
echo '<tr><td><a href="' . get_permalink( $recent['ID'] ) . '" title="Read: ' .
esc_attr( $recent['post_title'] ).'" >' . $recent['post_title'].'</a></td>';
echo '<td>'. esc_html( $post_author->display_name ) .'</td>';
echo '<td>'. esc_html( $last_user->display_name ) .'</td></tr>';
$counter++;
}
echo '</table>';
}
の項目の表示をスキップします。ただし、必要以上の項目をクエリしているため、最も効率的なコードではありません。これは、いくつかの項目をスキップして、表示する項目が少なくとも10項目あることを確認したい($post_author->display_name === $last_user->display_name
= 10)ことを望んでいるためです($items_to_show
= 10)。
次のようにして、最後に投稿を公開したユーザーのIDを_wpse_user_last_published
投稿メタキーの値として保存できます。
add_action( 'transition_post_status', function( $new_status, $old_status, $post )
{
if(
$new_status !== $old_status
&& 'publish' === $new_status
&& 'post' === get_post_type( $post )
)
update_post_meta( $post->ID, '_wpse_user_last_published', get_current_user_id() );
}, 10, 3 );
投稿を一覧表示するときに、この情報を取得できます。
より詳細で高速な検索のためには、カスタムログテーブルを作成することをお勧めします。