私はサイドバーのphpウィジェット、特定のカテゴリの同じpost_titleを持つすべての投稿に表示しようとしています。このコードはインターネット上にありますが、使い方はわかりません。ご協力ありがとうございます。
function get_multiple_posts_by_title($title) {
global $wpdb;
$posts_ids = array();
$posts = $wpdb->get_results( $wpdb->prepare( “SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type=’post_type’”, $title), OBJECT );
foreach ($posts as $post) {
$posts_ids[] = $post->ID;
}
return $posts_ids;
}
編集:これは私が使用する実際のコードです。
<?php
/*
Plugin Name: WPSE Get Duplicate Post Titles
Plugin URI: http://wordpress.stackexchange.com/q/220279/31545
Description: Displays posts with the same title in the sidear
Version: 1.0.0
Author: Pieter Goosen
Author URI: http://wordpress.stackexchange.com/users/31545/pieter-goosen
License: GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
add_filter( 'posts_where', function ( $where, $q ) use ( &$wpdb )
{
// Get the value from our new wpse_title_match query var
$title_match = $q->get( 'wpse_title_match' );
// Make sure we have a value, if not, bail
if ( !$title_match )
return $where;
/**
* Lets alter the SQL WHERE clause
*
* Note, this will be an exact 1 to 1 match, adjust as necessary
*/
$where .= $wpdb->prepare(
" AND {$wpdb->posts}.post_title = %s ",
$title_match
);
return $where;
}, 10, 2 );
class WPSE_Get_Duplicate_Post_titles extends WP_Widget
{
public function __construct()
{
parent::__construct(
'widget_get_duplicate_post_titles',
_x( 'Post Title duplicates', 'Post Title duplicates' ),
[ 'description' => __( 'Displays posts which share the same post title.' ) ]
);
$this->alt_option_name = 'widget_get_duplicate_post_titles';
add_action( 'save_post', [$this, 'flush_widget_cache'] );
add_action( 'deleted_post', [$this, 'flush_widget_cache'] );
add_action( 'switch_theme', [$this, 'flush_widget_cache'] );
}
public function widget( $args, $instance )
{
$cache = [];
if ( ! $this->is_preview() ) {
$cache = wp_cache_get( 'widget_bpfi', 'widget' );
}
if ( ! is_array( $cache ) ) {
$cache = [];
}
if ( ! isset( $args['widget_id'] ) ) {
$args['widget_id'] = $this->id;
}
if ( isset( $cache[ $args['widget_id'] ] ) ) {
echo $cache[ $args['widget_id'] ];
return;
}
ob_start();
$title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Post Title Duplicates' );
/** This filter is documented in wp-includes/default-widgets.php */
$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
// ADD YOUR CUSTOM PHP CODE HERE FOR EXECUTION TO DISPLAY ON FRONT END
// First make sure this a single post page
if ( is_single() ) { // We are on a single page
// Get the current post object
$post_object = $GLOBALS['wp_the_query']->get_queried_object();
// Run our query to get the posts with duplicate titles
$args = [
'posts_per_page' => -1, // Get all posts
'post_type' => 'post',
'wpse_title_match' => $post_object->post_title,
'post__not_in' => [$post_object->ID], // Exclude current post
'tax_query' => [
[
'taxonomy' => 'category',
'terms' => 'chroniques'
]
],
// Any other arguments
];
$loop = new WP_Query( $args );
// Run the loop
if ( $loop->have_posts() ) {
while ( $loop->have_posts ) {
$loop->the_post();
// Display your posts
the_title() . "\n";
}
wp_reset_postdata();
}
}
echo $args['after_widget'];
if ( ! $this->is_preview() ) {
$cache[ $args['widget_id'] ] = ob_get_flush();
wp_cache_set( 'widget_bpfi', $cache, 'widget' );
} else {
ob_end_flush();
}
}
public function update( $new_instance, $old_instance )
{
$instance = $old_instance;
$instance['title'] = strip_tags( $new_instance['title'] );
$this->flush_widget_cache();
$alloptions = wp_cache_get( 'alloptions', 'options' );
if ( isset($alloptions['widget_get_duplicate_post_titles']) )
delete_option('widget_get_duplicate_post_titles');
return $instance;
}
public function flush_widget_cache()
{
wp_cache_delete('widget_bpfi', 'widget');
}
public function form( $instance )
{
$title = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
?>
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" />
</p>
<?php
}
}
add_action( 'widgets_init', function ()
{
register_widget( 'WPSE_Get_Duplicate_Post_titles' );
});
add_filter( 'sidebars_widgets', function ( $sidebars_widgets )
{
// Return our filter when we are on admin screen
if ( is_admin() )
return $sidebars_widgets;
// Make sure we are not on the blog page, if we are, bail
if ( is_single() )
return $sidebars_widgets;
/**
* Widget we need to target. This should be the name/id we used to register it
*
* EXAMPLE
* parent::__construct(
'widget_get_duplicate_post_titles',
_x( 'Blog Page Featured Image', 'Blog page featured image' ),
[ 'description' => __( 'Displays the featured image for the pge set as blog page.' ) ]
);
*
*/
$custom_widget = 'widget_get_duplicate_post_titles';
// See if our custom widget exists is any sidebar, if so, get the array index
foreach ( $sidebars_widgets as $sidebars_key=>$sidebars_widget ) {
// Skip the wp_inactive_widgets set, we do not need them
if ( $sidebars_key == 'wp_inactive_widgets' )
continue;
// Only continue our operation if $sidebars_widget are not an empty array
if ( $sidebars_widget ) {
foreach ( $sidebars_widget as $k=>$v ) {
/**
* Look for our custom widget, if found, unset it from the $sidebars_widgets array
* @see stripos()
*/
if ( stripos( $v, $custom_widget ) !== false )
unset( $sidebars_widgets[$sidebars_key][$k] );
} // endforeach $sidebars_widget
} // endif $sidebars_widget
} // endforeach $sidebars_widgets
return $sidebars_widgets;
});
WordPressが提供している機能を利用しましょう。 WordPressが特定の機能を実行するためのネイティブ関数を提供するときはいつでも、カスタムSQLを使用することはほとんど常に推奨されていません。
私たちの投稿をクエリするために、WP_Query
を使用します。唯一の問題は、WP_Query
が特定の役職を持つ投稿を探す機能をサポートしていないことです。幸いなことに、ビルドSQLクエリがdbをクエリする直前にフィルタをかけることができます。このため、posts_where
フィルタを使用して、独自のカスタムパラメータwpse_title_match
( およびno、これはレスリング とは無関係)を導入します。
以下をプラグイン( recommended )またはテーマ関数ファイルに追加する必要があります。
add_filter( 'posts_where', function ( $where, $q ) use ( &$wpdb )
{
// Get the value from our new wpse_title_match query var
$title_match = $q->get( 'wpse_title_match' );
// Make sure we have a value, if not, bail
if ( !$title_match )
return $where;
/**
* Lets alter the SQL WHERE clause
*
* Note, this will be an exact 1 to 1 match, adjust as necessary
*/
$where .= $wpdb->prepare(
" AND {$wpdb->posts}.post_title = %s ",
$title_match
);
return $where;
}, 10, 2 );
この時点では、phpウィジェットの中にすべてをドロップするよりも、自分自身で適切なウィジェットを構築する方が良いでしょう。
これは私が最近やった修正されたウィジェットプラグインです here
class WPSE_Get_Duplicate_Post_titles extends WP_Widget
{
public function __construct()
{
parent::__construct(
'widget_get_duplicate_post_titles',
_x( 'Post Title duplicates', 'Post Title duplicates' ),
[ 'description' => __( 'Displays posts which share the same post title.' ) ]
);
$this->alt_option_name = 'widget_get_duplicate_post_titles';
add_action( 'save_post', [$this, 'flush_widget_cache'] );
add_action( 'deleted_post', [$this, 'flush_widget_cache'] );
add_action( 'switch_theme', [$this, 'flush_widget_cache'] );
}
public function widget( $args, $instance )
{
$cache = [];
if ( ! $this->is_preview() ) {
$cache = wp_cache_get( 'widget_bpfi', 'widget' );
}
if ( ! is_array( $cache ) ) {
$cache = [];
}
if ( ! isset( $args['widget_id'] ) ) {
$args['widget_id'] = $this->id;
}
if ( isset( $cache[ $args['widget_id'] ] ) ) {
echo $cache[ $args['widget_id'] ];
return;
}
ob_start();
$title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Post Title Duplicates' );
/** This filter is documented in wp-includes/default-widgets.php */
$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
// ADD YOUR CUSTOM PHP CODE HERE FOR EXECUTION TO DISPLAY ON FRONT END
// First make sure this a single post page
if ( is_single() ) { // We are on a single page
// Get the current post object
$post_object = $GLOBALS['wp_the_query']->get_queried_object();
// Run our query to get the posts with duplicate titles
$args = [
'posts_per_page' => -1, // Get all posts
'post_type' => 'post',
'wpse_title_match' => $post_object->post_title,
'post__not_in' => [$post_object->ID], // Exclude current post
'tax_query' => [
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'chroniques'
]
],
// Any other arguments
];
$loop = new WP_Query( $args );
// Run the loop
if ( $loop->have_posts() ) {
while ( $loop->have_posts() ) {
$loop->the_post();
// Display your posts
the_title() . "\n";
}
wp_reset_postdata();
}
}
echo $args['after_widget'];
if ( ! $this->is_preview() ) {
$cache[ $args['widget_id'] ] = ob_get_flush();
wp_cache_set( 'widget_bpfi', $cache, 'widget' );
} else {
ob_end_flush();
}
}
public function update( $new_instance, $old_instance )
{
$instance = $old_instance;
$instance['title'] = strip_tags( $new_instance['title'] );
$this->flush_widget_cache();
$alloptions = wp_cache_get( 'alloptions', 'options' );
if ( isset($alloptions['widget_get_duplicate_post_titles']) )
delete_option('widget_get_duplicate_post_titles');
return $instance;
}
public function flush_widget_cache()
{
wp_cache_delete('widget_bpfi', 'widget');
}
public function form( $instance )
{
$title = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
?>
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" />
</p>
<?php
}
}
add_action( 'widgets_init', function ()
{
register_widget( 'WPSE_Get_Duplicate_Post_titles' );
});
私がしたいのは、他のウィジェットが表示されていないときにサイドバーが空白スペースをレンダリングしないようにするために、完全にコンテキスト外のウィジェットを常に完全に削除することです。
here について説明したのと同じ方法を試すことができます。プラグインの一番下にこれを追加するだけです。
add_filter( 'sidebars_widgets', function ( $sidebars_widgets )
{
// Return our filter when we are on admin screen
if ( is_admin() )
return $sidebars_widgets;
// Make sure we are not on the blog page, if we are, bail
if ( is_single() )
return $sidebars_widgets;
/**
* Widget we need to target. This should be the name/id we used to register it
*
* EXAMPLE
* parent::__construct(
'widget_get_duplicate_post_titles',
_x( 'Blog Page Featured Image', 'Blog page featured image' ),
[ 'description' => __( 'Displays the featured image for the page set as blog page.' ) ]
);
*
*/
$custom_widget = 'widget_get_duplicate_post_titles';
// See if our custom widget exists is any sidebar, if so, get the array index
foreach ( $sidebars_widgets as $sidebars_key=>$sidebars_widget ) {
// Skip the wp_inactive_widgets set, we do not need them
if ( $sidebars_key == 'wp_inactive_widgets' )
continue;
// Only continue our operation if $sidebars_widget are not an empty array
if ( $sidebars_widget ) {
foreach ( $sidebars_widget as $k=>$v ) {
/**
* Look for our custom widget, if found, unset it from the $sidebars_widgets array
* @see stripos()
*/
if ( stripos( $v, $custom_widget ) !== false )
unset( $sidebars_widgets[$sidebars_key][$k] );
} // endforeach $sidebars_widget
} // endif $sidebars_widget
} // endforeach $sidebars_widgets
return $sidebars_widgets;
});
上記のすべてのコード 未テストであり PHP 5.4以降が必要
あなたはあなたのニーズに合うようにウィジェットのWP_Query
引数を調整するべきです。大文字で値を追加した場所はどこでも、適切な値を入力する必要があります。
両方のフィルタ機能を同じプラグインに追加することができるので、完全なプラグインは次のようになります。
<?php
/*
Plugin Name: WPSE Get Duplicate Post Titles
Plugin URI: https://wordpress.stackexchange.com/q/220279/31545
Description: Displays posts with the same title in the sidear
Version: 1.0.0
Author: Pieter Goosen
Author URI: https://wordpress.stackexchange.com/users/31545/pieter-goosen
License: GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
add_filter( 'posts_where', function ( $where, $q ) use ( &$wpdb )
{
// Get the value from our new wpse_title_match query var
$title_match = $q->get( 'wpse_title_match' );
// Make sure we have a value, if not, bail
if ( !$title_match )
return $where;
/**
* Lets alter the SQL WHERE clause
*
* Note, this will be an exact 1 to 1 match, adjust as necessary
*/
$where .= $wpdb->prepare(
" AND {$wpdb->posts}.post_title = %s ",
$title_match
);
return $where;
}, 10, 2 );
class WPSE_Get_Duplicate_Post_titles extends WP_Widget
{
public function __construct()
{
parent::__construct(
'widget_get_duplicate_post_titles',
_x( 'Post Title duplicates', 'Post Title duplicates' ),
[ 'description' => __( 'Displays posts which share the same post title.' ) ]
);
$this->alt_option_name = 'widget_get_duplicate_post_titles';
add_action( 'save_post', [$this, 'flush_widget_cache'] );
add_action( 'deleted_post', [$this, 'flush_widget_cache'] );
add_action( 'switch_theme', [$this, 'flush_widget_cache'] );
}
public function widget( $args, $instance )
{
$cache = [];
if ( ! $this->is_preview() ) {
$cache = wp_cache_get( 'widget_bpfi', 'widget' );
}
if ( ! is_array( $cache ) ) {
$cache = [];
}
if ( ! isset( $args['widget_id'] ) ) {
$args['widget_id'] = $this->id;
}
if ( isset( $cache[ $args['widget_id'] ] ) ) {
echo $cache[ $args['widget_id'] ];
return;
}
ob_start();
$title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Post Title Duplicates' );
/** This filter is documented in wp-includes/default-widgets.php */
$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
// ADD YOUR CUSTOM PHP CODE HERE FOR EXECUTION TO DISPLAY ON FRONT END
// First make sure this a single post page
if ( is_single() ) { // We are on a single page
// Get the current post object
$post_object = $GLOBALS['wp_the_query']->get_queried_object();
// Run our query to get the posts with duplicate titles
$args = [
'posts_per_page' => -1, // Get all posts
'post_type' => 'post',
'wpse_title_match' => $post_object->post_title,
'post__not_in' => [$post_object->ID], // Exclude current post
'tax_query' => [
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'chroniques'
]
],
// Any other arguments
];
$loop = new WP_Query( $args );
// Run the loop
if ( $loop->have_posts() ) {
while ( $loop->have_posts() ) {
$loop->the_post();
// Display your posts
the_title() . "\n";
}
wp_reset_postdata();
}
}
echo $args['after_widget'];
if ( ! $this->is_preview() ) {
$cache[ $args['widget_id'] ] = ob_get_flush();
wp_cache_set( 'widget_bpfi', $cache, 'widget' );
} else {
ob_end_flush();
}
}
public function update( $new_instance, $old_instance )
{
$instance = $old_instance;
$instance['title'] = strip_tags( $new_instance['title'] );
$this->flush_widget_cache();
$alloptions = wp_cache_get( 'alloptions', 'options' );
if ( isset($alloptions['widget_get_duplicate_post_titles']) )
delete_option('widget_get_duplicate_post_titles');
return $instance;
}
public function flush_widget_cache()
{
wp_cache_delete('widget_bpfi', 'widget');
}
public function form( $instance )
{
$title = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
?>
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" />
</p>
<?php
}
}
add_action( 'widgets_init', function ()
{
register_widget( 'WPSE_Get_Duplicate_Post_titles' );
});
add_filter( 'sidebars_widgets', function ( $sidebars_widgets )
{
// Return our filter when we are on admin screen
if ( is_admin() )
return $sidebars_widgets;
// Make sure we are not on the blog page, if we are, bail
if ( is_single() )
return $sidebars_widgets;
/**
* Widget we need to target. This should be the name/id we used to register it
*
* EXAMPLE
* parent::__construct(
'widget_get_duplicate_post_titles',
_x( 'Blog Page Featured Image', 'Blog page featured image' ),
[ 'description' => __( 'Displays the featured image for the pge set as blog page.' ) ]
);
*
*/
$custom_widget = 'widget_get_duplicate_post_titles';
// See if our custom widget exists is any sidebar, if so, get the array index
foreach ( $sidebars_widgets as $sidebars_key=>$sidebars_widget ) {
// Skip the wp_inactive_widgets set, we do not need them
if ( $sidebars_key == 'wp_inactive_widgets' )
continue;
// Only continue our operation if $sidebars_widget are not an empty array
if ( $sidebars_widget ) {
foreach ( $sidebars_widget as $k=>$v ) {
/**
* Look for our custom widget, if found, unset it from the $sidebars_widgets array
* @see stripos()
*/
if ( stripos( $v, $custom_widget ) !== false )
unset( $sidebars_widgets[$sidebars_key][$k] );
} // endforeach $sidebars_widget
} // endif $sidebars_widget
} // endforeach $sidebars_widgets
return $sidebars_widgets;
});
バンドルされたテーマの1つにあるcontent.php
テンプレート部分のソースコードを見ることで、ループ内のコードを拡張できます。