按自定义字段查询自定义岗位类型

时间:2013-12-13 作者:luke

一般信息

我使用插件WP-Types(WP-Types.com)创建了一个名为artist
在WP类型中,您还可以将另一个帖子类型设置为父帖子类型。默认情况下,这是不可能的;他们通过一个元查询实现了此功能,该查询的关键字为:”
“\\u wpcf\\u beliens\\u%POSTTYPE%\\u id”(在我的示例中)”_wpcf_belongs_artist_id“)
并且该值是父帖子的ID。

问题

通常,如果将页X设置为页Y的子页,则会有以下永久链接结构:
/page-Y/page-X/

我以为这个插件会采用这个,但它没有。例如,我使用“painting“使用ID24 作为父页和“picasso“使用ID72 作为子贴子,贴子类型为“艺术家”。所以这个:
/绘画/毕加索/
确实将我重定向到:
/艺术家/毕加索/
但输出了正确的内容。

我的解决方案越来越接近,因为付费支持无法帮助我,我必须自己尝试。为了编写自己的“自定义”重写规则,我首先必须知道正确的查询。我尝试手动获取我的内容:

指数php_wpcf\\u归属\\u艺术家\\u id=24(&;艺术家=毕加索将我重定向到:
/艺术家/毕加索_wpcf\\u归属\\u艺术家\\u id=24(&;艺术家=毕加索(picasso)
具有单个艺术家帖子的正确输出。

此:
索引。php_wpcf\\u beliens\\u artist\\u id=24只输出我的头版。

唯一或多或少的变化是:
/绘画/毕加索/?艺术家=毕加索_wpcf\\u属于\\u艺术家\\u id=24和:
/绘画/毕加索/?艺术家=毕加索这些不会将我重定向到/艺术家/毕加索/…或任何地方,但会输出正确的单个艺术家帖子。

Here 您可以在WP类型的支持论坛中找到更多变体和整个线程。

第一步可能是使用类似“parent\\u id”的queryvar获取正确的内容。之后,我可以开始处理重写规则本身,可能会出现问题,因为顶级(%pagename%和%parent\\u id%)的双重使用。这可能会混淆WordPress。

2017年12月更新我尝试了这段代码,以获取所有带有元字段“\\u wpcf\\u beliens\\u artist\\u id”和从URL检索到的元值(/?parent\\u id=24)的帖子。不幸的是,它似乎不起作用。它使我的子菜单的辅助查询崩溃,只输出正常查询的结果。

add_filter(\'query_vars\', \'custom_query_vars\');
function custom_query_vars($vars) {
    $vars[] = \'parent_id\';
    return $vars;
}

function parent_query( $query ) {
    // Exclude
    if( $query->is_admin == 1 && !$query->is_main_query() && !$query->is_archive == 1 ) {
        return;
    }
    // retrieve field name / value from URL if exist
    $custom_field = \'_wpcf_belongs_artist_id\';
    $custom_value = ( $_GET[\'parent_id\'] ) ? stripslashes( $_GET[\'parent_id\'] ) : \'\';
    if( $custom_field ) {
        // add meta key requirement -- we’ll return all posts with some ‘color’
        $query->set( \'meta_key\', \'_wpcf_belongs_artist_id\' );
        if( $custom_value ) {
            // build meta value requirement -- we’ll return only blue
            $query->set( \'meta_value\', $custom_value );
        }
    }
}
add_action( \'pre_get_posts\', \'parent_query\' );

3 个回复
SO网友:Matthew Boynes

你已经很接近了。以下是您正在尝试的工作示例:

class Wpse_126374 {

    public function __construct() {
        add_action( \'init\', array( $this, \'rewrites\' ) );
        add_action( \'pre_get_posts\', array( $this, \'pre_get_posts\' ) );
    }

    public function rewrites() {
        add_rewrite_tag( \'%parent_id%\', \'(\\d+)\' );
    }

    public function pre_get_posts( $query ) {
        // Don\'t run this on admin pages or secondary queries
        if ( is_admin() || ! $query->is_main_query() || $query->is_archive() )
            return;

        if ( \'\' != ( $parent_id = get_query_var( \'parent_id\' ) ) ) {
            $query->set( \'meta_key\', \'_wpcf_belongs_artist_id\' );
            $query->set( \'meta_value\', $parent_id );
        }
    }

}
$wpse_126374 = new Wpse_126374;
这应该允许您parent_id=24 在URL中。

SO网友:adelval

我认为这个问题是不适定的。如果你加上两幅毕加索的画,会发生什么?你想让/painting1/picasso和/painting2/picasso都指向同一个“单一艺术家帖子”?我认为这是可能的,但我很确定这是不必要的复杂(并可能导致SEO问题)。

另一方面,因为艺术家和绘画是不同类型的实体,我认为毕加索在/艺术家/毕加索下展示是非常好的,这篇文章链接到他创作的任何绘画。

使用父关系是错误的。一幅画(通常)只有一位作者,但一位艺术家可以创作出许多画。但是一个帖子只能有一个家长,因此一个艺术家帖子不应该成为其某幅画的孩子,否则一旦你添加了同一作者的另一幅画,你就有麻烦了。

相反,你应该让艺术家成为绘画的财产。您可以通过为绘画添加一个自定义字段来实现这一点,也可以使用类型的贴子关系或其他设备来强制该自定义字段的值引用艺术家的贴子类型。

使用这种方法,您的问题不会“解决”,而是会消失。

SO网友:Manolo

使用时不需要从函数返回任何内容pre_get_posts:

function 
if( $query->is_admin() || !$query->is_main_query() || $query->is_archive() ) {
//Do your stuff

结束

相关推荐

有人知道如何在页脚加载jQuery吗?

我已经尝试了我所知道和阅读过的所有方法,将jquery库移动到页脚,包括以下内容和以下内容的所有可能变体:function add_scripts() { wp_deregister_script(\'jquery\'); wp_register_script(\'jquery\', \'https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js\', false, \'1.8.3\',