meta_query ที่มีค่าเมตาเป็นอาร์เรย์ลำดับ


37

ฉันกำลังทำงานในโครงการที่ฉันสร้างประเภทโพสต์ที่กำหนดเองและข้อมูลที่กำหนดเองที่ป้อนผ่านกล่องเมตาที่เชื่อมโยงกับประเภทโพสต์ที่กำหนดเองของฉัน ไม่ว่าด้วยเหตุผลใดฉันจึงตัดสินใจเขียนโค้ดเมตาบ็อกในลักษณะที่อินพุตในแต่ละเมท็อกซ์เป็นส่วนหนึ่งของอาเรย์ ตัวอย่างเช่นฉันกำลังเก็บลองจิจูดและละติจูด:

<p> 
    <label for="latitude">Latitude:</label><br /> 
    <input type="text" id="latitude" name="coordinates[latitude]" class="full-width" value="" /> 
</p> 
<p>     
    <label for="longitude">Longitude:</label><br /> 
    <input type="text" id="longitude" name="coordinates[longitude]" class="full-width" value="" /> 
</p>

ไม่ว่าจะด้วยเหตุผลใดฉันชอบความคิดที่ว่ามีการเข้า postmeta เอกพจน์สำหรับแต่ละ metabox ที่save_postตะขอฉันบันทึกข้อมูลดังนี้:

update_post_meta($post_id, '_coordinates', $_POST['coordinates']);

ฉันทำสิ่งนี้เพราะฉันมีสาม metaboxes และฉันชอบเพียงแค่มี 3 postmeta ค่าสำหรับแต่ละโพสต์; อย่างไรก็ตามฉันได้ตระหนักถึงปัญหาที่อาจเกิดขึ้นกับสิ่งนี้แล้ว ฉันอาจต้องการใช้ WP_Query เพื่อดึงโพสต์บางอย่างตามค่าเมตาเหล่านี้ ตัวอย่างเช่นฉันอาจต้องการรับโพสต์ทั้งหมดที่มีค่าละติจูดสูงกว่า 50 หากฉันมีข้อมูลนี้ในฐานข้อมูลทีละรายการบางทีอาจใช้คีย์latitudeฉันจะทำสิ่งต่อไปนี้:

$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => '50',
            'compare' => '>'
        )
    )
 );
$query = new WP_Query( $args );

เนื่องจากฉันมีละติจูดเป็นส่วนหนึ่งของ_coordinatespostmeta สิ่งนี้จะไม่ทำงาน

ดังนั้นคำถามของฉันคือมีวิธีใช้meta_queryในการสอบถามอาร์เรย์ลำดับเหมือนที่ฉันมีในสถานการณ์นี้หรือไม่

คำตอบ:


37

ไม่เป็นไปไม่ได้และอาจเป็นอันตรายได้

ฉันขอแนะนำอย่างยิ่งให้คุณยกเลิกการเก็บข้อมูลของคุณและแก้ไขขั้นตอนการบันทึกของคุณ สิ่งที่คล้ายกันนี้ควรแปลงข้อมูลของคุณเป็นรูปแบบใหม่:

$args = array(
    'post_type' => 'my-post-type',
    'meta_key' => '_coordinates',
    'posts_per_page' => -1
 );
$query = new WP_Query( $args );
if($query->have_posts()){
    while($query->have_posts()){
        $query->the_post();
        $c = get_post_meta($post->id,'_coordinates',true);
        add_post_meta($post->ID,'_longitude',$c['longitude']);
        add_post_meta($post->ID,'_latitude',$c['latitude']);
        delete_post_meta($post->ID,'_coordinates',$c);
    }
}

จากนั้นคุณจะสามารถค้นหาได้ตามที่คุณต้องการด้วยปุ่มแต่ละปุ่ม

หากคุณต้องการเก็บหลายลองจิจูดและหลายละติจูดคุณสามารถจัดเก็บเมตาโพสต์หลายรายการด้วยชื่อเดียวกัน เพียงใช้พารามิเตอร์ที่สามของget_post_metaและมันจะคืนค่าทั้งหมดเป็นอาร์เรย์

เหตุใดคุณจึงไม่สามารถสืบค้นข้อมูลที่อยู่ในลำดับต่อเนื่องได้

MySQL มองว่ามันเป็นเพียงสตริงและไม่สามารถแยกมันออกเป็นข้อมูลที่มีโครงสร้างได้ การแยกข้อมูลดังกล่าวออกเป็นข้อมูลที่มีโครงสร้างเป็นสิ่งที่รหัสด้านบนทำ

คุณอาจสามารถสืบค้นบางส่วนของวันที่ได้ แต่สิ่งนี้จะไม่น่าเชื่อถือสุดแพงช้าและเปราะบางมากโดยมีกรณีขอบจำนวนมาก ข้อมูลต่อเนื่องไม่ได้มีไว้สำหรับการสืบค้น SQL และไม่ได้จัดรูปแบบตามปกติและคงที่

นอกเหนือจากค่าใช้จ่ายในการค้นหาสตริงบางส่วนแล้วข้อความค้นหาโพสต์ช้าและข้อมูลต่อเนื่องสามารถเปลี่ยนแปลงได้ขึ้นอยู่กับสิ่งต่าง ๆ เช่นความยาวของเนื้อหาทำให้การค้นหามีราคาแพงอย่างไม่น่าเชื่อถ้าเป็นไปไม่ได้

หมายเหตุเกี่ยวกับการจัดเก็บเรคคอร์ด / นิติบุคคล / วัตถุเป็นวัตถุที่ต่อเนื่องกันใน Meta

คุณอาจต้องการบันทึกเร็กคอร์ดธุรกรรมในโพสต์เมตาหรือโครงสร้างข้อมูลอื่น ๆ ในเมตาดาต้าของผู้ใช้จากนั้นพบปัญหาข้างต้น

วิธีแก้ปัญหาที่นี่ไม่ใช่การแยกเมตาโพสต์ออกเป็นรายบุคคล แต่เพื่อให้ทราบว่าเมตาไม่ควรเริ่มต้นด้วย แต่เป็นประเภทโพสต์ที่กำหนดเอง ตัวอย่างเช่นบันทึกหรือบันทึกสามารถเป็นประเภทโพสต์ที่กำหนดเองโดยมีโพสต์ต้นฉบับเป็นผู้ปกครองหรือเข้าร่วมผ่านทางคำศัพท์ทางภาษี

ความปลอดภัยและวัตถุที่เป็นอนุกรม

การจัดเก็บวัตถุ PHP ที่ต่อเนื่องกันผ่านserializeฟังก์ชั่นอาจเป็นอันตรายซึ่งโชคไม่ดีที่การส่งวัตถุไปยัง WordPress จะทำให้ได้รับการจัดลำดับ เนื่องจากเมื่อวัตถุถูกทำให้เป็นอนุกรมวัตถุจะถูกสร้างขึ้นและวิธีการปลุกและตัวสร้างทั้งหมดจะถูกดำเนินการ สิ่งนี้อาจดูเหมือนไม่ใช่เรื่องใหญ่จนกระทั่งผู้ใช้จัดการการป้อนข้อมูลที่สร้างขึ้นอย่างระมัดระวังนำไปสู่การเรียกใช้โค้ดจากระยะไกลเมื่อข้อมูลถูกอ่านจากฐานข้อมูลและยกเลิกการทำให้เป็นอนุกรมโดย WordPress

สิ่งนี้สามารถหลีกเลี่ยงได้โดยใช้ JSON แทนซึ่งทำให้การสืบค้นง่ายขึ้น แต่ก็ง่ายกว่า / เร็วกว่ามากในการจัดเก็บข้อมูลอย่างถูกต้องและหลีกเลี่ยงข้อมูลที่มีโครงสร้างแบบอนุกรมเพื่อเริ่มต้นด้วย


5
สำหรับคนที่ผ่านไปอย่าหยุดอ่าน: คำตอบที่เป็นประโยชน์ (และล่าสุด) มีอยู่ด้านล่าง
Erenor Paz

จะเกิดอะไรขึ้นถ้าฉันมีรหัสประจำตัวที่หลากหลายให้บันทึก - และพวกเขาไม่ได้แสดงรหัสที่แตกต่างกันที่ฉันสามารถบันทึกไว้ภายใต้เช่น 'ละติจูด' เป็นต้นมันเป็นเพียงคีย์เดียวสำหรับทุกคน (เช่นเมื่อบันทึกความสัมพันธ์เป็นต้น) ถ้าอย่างนั้นจะทำอย่างไร? วิธีการแก้ปัญหาของ @ rabni?
trainoasis

1
คุณสามารถเก็บคีย์ได้มากกว่าหนึ่งครั้งคู่ของค่าคีย์นั้นไม่ซ้ำกัน สำหรับความสัมพันธ์นั่นคือสิ่งที่ taxonomies ใช้สำหรับถ้าคุณใช้เมตาเพื่อทำแผนที่หลายสิ่งหลายอย่างใส่อะไรลงไปในเทอมอนุกรมวิธานแทน
Tom J Nowell

24

ฉันยังเจอกับสถานการณ์เช่นนี้ นี่คือสิ่งที่ฉันทำ:

$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => sprintf(':"%s";', $value),
            'compare' => 'LIKE'
        )
    )
);

หวังว่าความช่วยเหลือนี้


1
ฉันชอบวิธีนี้มาก น่าเสียดายที่นี่ไม่สามารถใช้งานได้เมื่อ$valueเป็น ID ในกรณีนั้นฉันแนะนำให้สร้างฟังก์ชั่นเพื่อเพิ่มตัวละครในแต่ละองค์ประกอบของอาเรย์ก่อนที่จะบันทึกข้อมูลและฟังก์ชั่นอื่นเพื่อลบตัวอักษรก่อนที่จะใช้ข้อมูล วัดนี้i:2ดัชนีที่ต่อเนื่องกันจะไม่สับสนกับi:D2ข้อมูล "ของจริง" พารามิเตอร์การสืบค้นเมตาควรจะกลายเป็น'value' => sprintf(':"D%s";', $value),และคุณจะให้การทำงานที่ถูกต้องของคำตอบที่ยอดเยี่ยมนี้!
Erenor Paz

วิธีนี้ใช้ได้ผลสำหรับฉัน
วิษณุ

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน ไม่ต้องตกใจขนาดเล็กเมื่อฉันเห็นการแก้ปัญหาที่ได้รับการยอมรับว่า
เชนโจนส์

@Erenor Paz ฉันเพิ่งโพสต์โซลูชันที่ทำงานได้ดีกับทั้ง ID และ Strings: wordpress.stackexchange.com/a/299325/25264
Pablo SG Pacheco

การใช้LIKEเป็นวิธีที่ยอดเยี่ยมและรวดเร็วในการทำให้เซิร์ฟเวอร์ของคุณล่ม (ไม่พูดถึงผลบวกปลอม) คุณควรมีการแคชที่ดีมาก
Mark Kaplun

10

คุณจะสูญเสียความสามารถในการสืบค้นข้อมูลของคุณในลักษณะที่มีประสิทธิภาพเมื่อทำการซีเรียลไลซ์รายการลงในฐานข้อมูล WP

ประสิทธิภาพโดยรวมในการประหยัดและเพิ่มกำไรที่คุณคิดว่าคุณประสบความสำเร็จโดยการทำให้เป็นอนุกรมจะไม่เป็นที่สังเกตได้ในทุกระดับ คุณอาจได้ขนาดฐานข้อมูลที่เล็กกว่าเล็กน้อย แต่ค่าใช้จ่ายของธุรกรรม SQL นั้นจะหนักถ้าคุณเคยค้นหาเขตข้อมูลเหล่านั้นและลองเปรียบเทียบในลักษณะที่มีประโยชน์และมีความหมาย

ให้บันทึกการทำให้เป็นอนุกรมสำหรับข้อมูลที่คุณไม่ต้องการสืบค้นในลักษณะนั้น แต่จะเข้าถึงแบบพาสซีฟโดยตรงด้วยการเรียก WP API โดยตรงget_post_meta()- จากฟังก์ชั่นนั้นคุณสามารถคลายรายการซีเรียลไลซ์เพื่อเข้าถึงคุณสมบัติอาร์เรย์ได้

ในความเป็นจริงได้กำหนดมูลค่าของจริงตามที่;

$meta = get_post_meta( $post->ID, 'key', true );

จะส่งคืนข้อมูลเป็นอาร์เรย์ซึ่งคุณสามารถทำซ้ำได้ตามปกติ

คุณสามารถมุ่งเน้นไปที่การเพิ่มประสิทธิภาพฐานข้อมูล / ไซต์อื่น ๆ เช่นแคช, CSS และการลดขนาด JS และการใช้บริการเช่น CDN หากคุณต้องการ เพื่อชื่อ แต่ไม่กี่ .... WordPress Codex เป็นจุดเริ่มต้นที่ดีที่จะค้นพบเพิ่มเติมในหัวข้อนั้น: ที่นี่


3

ฉันเพิ่งจัดการกับเขตข้อมูลต่อเนื่องและสามารถค้นหาได้ ไม่ได้ใช้ meta_query แต่ใช้แบบสอบถาม SQL

global $wpdb; 

$search = serialize('latitude').serialize(50);

$query = $wpdb->prepare("SELECT `post_id`
FROM `wp_postmeta`
WHERE `post_id` IN (SELECT `ID` FROM `wp_posts` WHERE `post_type` = 'my-post-type')
AND `meta_key` = '_coordinates'
AND `meta_value` LIKE '%s'",'%'.$search.'%');

$ids = $wpdb->get_col($query);

$args = array(
    'post__in' => $ids
    'post_type' => 'team' //add the type because the default will be 'post'
);

$posts = get_posts($args);

แบบสอบถามจะค้นหาโพสต์ด้วยการจับคู่ post_type ก่อนดังนั้นจำนวนของเร็กคอร์ด wp_postmeta จะน้อยกว่าในการกรอง จากนั้นฉันได้เพิ่มคำสั่ง where เพื่อลดแถวเพิ่มเติมโดยการกรองmeta_key

รหัสท้ายสุดเป็นอาร์เรย์ที่จำเป็นสำหรับ get_posts

PS จำเป็นต้องใช้ MySQL v5.6 หรือสูงกว่าเพื่อประสิทธิภาพของแบบสอบถามย่อยที่ดี


1

ตัวอย่างนี้ช่วยฉันได้จริงๆ มันเป็นพิเศษสำหรับปลั๊กอิน S2Members (ซึ่งทำให้ข้อมูลเมตาของผู้ใช้เป็นอนุกรม) แต่จะช่วยให้คุณสามารถค้นหาส่วนหนึ่งของอาร์เรย์ที่มีลำดับภายใน meta_key

มันทำงานได้โดยใช้ฟังก์ชั่น MySQL REGEXP

นี่คือแหล่งที่มา

นี่คือรหัสที่สอบถามผู้ใช้ทุกคนที่อาศัยอยู่ในสหรัฐอเมริกา ฉันแก้ไขมันได้อย่างง่ายดายเพื่อค้นหาหนึ่งในช่องลงทะเบียนที่กำหนดเองของฉันและทำให้มันใช้งานได้ในเวลาไม่นาน

  <?php
global $wpdb;
$users = $wpdb->get_results ("SELECT `user_id` as `ID` FROM `" . $wpdb->usermeta . 
          "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_custom_fields' AND 
           `meta_value` REGEXP '.*\"country_code\";s:[0-9]+:\"US\".*'");
if (is_array ($users) && count ($users) > 0)
    {
        foreach ($users as $user)
            {
                $user = /* Get full User object now. */ new WP_User ($user->ID);
                print_r($user); /* Get a full list of properties when/if debugging. */
            }
    }
?>

1

ฉันคิดว่ามีวิธีแก้ไข 2 วิธีที่สามารถลองแก้ปัญหาของผลลัพธ์ที่จัดเก็บเป็นทั้งสตริงและจำนวนเต็ม อย่างไรก็ตามเป็นสิ่งสำคัญที่จะบอกว่าคนอื่นชี้ให้เห็นว่ามันเป็นไปไม่ได้ที่จะรับประกันความถูกต้องของผลลัพธ์ที่เก็บเป็นจำนวนเต็มเนื่องจากค่าเหล่านี้ที่เก็บไว้เป็นอาร์เรย์ต่อเนื่องดัชนีและค่าจะถูกเก็บไว้ในรูปแบบเดียวกัน ตัวอย่าง:

array(37,87);

จะถูกเก็บเป็นอาร์เรย์ต่อเนื่องเช่นนี้

a:2:{i:0;i:37;i:1;i:87;}

หมายเหตุi:0เป็นตำแหน่งแรกของอาร์เรย์และi:37เป็นค่าแรก รูปแบบเหมือนกัน แต่เราไปหาคำตอบกัน


1) โซลูชัน REGEXP

วิธีนี้ใช้ได้ผลกับฉันไม่ว่าค่าเมตาจะถูกบันทึกเป็นสตริงหรือตัวเลข / รหัสก็ตาม อย่างไรก็ตามมันใช้REGEXPซึ่งไม่เร็วเท่ากับการใช้LIKE

$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => '\;i\:' . $value . '\;|\"' . $value . '\";',
            'compare' => 'REGEXP'
        )
    )
);

2) LIKE Solution

ฉันไม่แน่ใจเกี่ยวกับความแตกต่างด้านประสิทธิภาพ แต่นี่เป็นโซลูชันที่ใช้LIKEและใช้ได้กับทั้งจำนวนและสตริง

 $args = array(
        'post_type' => 'my-post-type',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => 'latitude',
                'value' => sprintf(':"%s";', $value),
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'latitude',
                'value' => sprintf(';i:%d;', $value),
                'compare' => 'LIKE'
            )
        )
    );

REGEXPดีในบางสถานการณ์ แต่ถ้าคุณสามารถใช้LIKEฉันคิดว่ามันเป็นวิธีที่ดีกว่า ลิงก์เก่า แต่ก็มีประโยชน์มากในความคิดของฉัน: thingsilearn.wordpress.com/2008/02/28/… :-)
Erenor Paz

@ErenorPaz คุณพูดถูก LIKEเร็วกว่า. แต่นี่เป็นวิธีแก้ปัญหาที่ใช้ได้กับทั้งสตริงและหมายเลข
Pablo SG Pacheco

ใช่ .. ดังนั้นคำตอบคือ (เช่นเคย): ขึ้นอยู่กับสถานการณ์หากคุณสามารถใช้ "LIKE"; มันเป็นที่นิยมมิฉะนั้น REGEXP จะทำเช่นกัน :-)
Erenor ลาปาซ

@ErenorPaz ฉันแก้ไขคำตอบของฉันโดยเพิ่มโซลูชันใหม่ที่ใช้LIKEแต่ใช้ได้กับทั้งตัวเลขและสตริง ฉันไม่แน่ใจเกี่ยวกับประสิทธิภาพเพราะต้องเปรียบเทียบผลลัพธ์ที่ใช้OR
Pablo SG Pacheco

ตรง !!! ซึ่งฉันต้องได้ผลลัพธ์เช่นนี้ .... ขอบคุณมาก !!!
kuldip Makadiya

0

หลังจากอ่านเคล็ดลับในการรันการWP_Queryกรองโดยใช้อาร์เรย์ต่อไปนี้เป็นวิธีสุดท้ายที่ฉันทำ: โดยการสร้างอาร์เรย์ของค่าที่คั่นด้วยเครื่องหมายจุลภาคโดยใช้ implode ร่วมกับ$wpdbแบบสอบถาม SQL แบบกำหนดเองที่ใช้FIND_IN_SETเพื่อค้นหารายการที่คั่นด้วยเครื่องหมายจุลภาค

(นี่คล้ายกับคำตอบของ Tomas แต่มีประสิทธิภาพน้อยกว่าเล็กน้อยสำหรับแบบสอบถาม SQL)

1. ใน functions.php:

ในไฟล์ functions.php ของคุณ (หรือที่ใดก็ตามที่คุณตั้งค่ากล่องเมตา) ในการyourname_save_post()ใช้ฟังก์ชั่น

update_post_meta($post->ID, 'checkboxArray', implode(",", $checkboxArray)); //adding the implode

เพื่อสร้างอาร์เรย์ที่มีค่าคั่นด้วยเครื่องหมายจุลภาค

นอกจากนี้คุณยังจะต้องเปลี่ยนตัวแปรเอาต์พุตของคุณในyourname_post_meta()ฟังก์ชั่นการสร้างกล่องเมตาของผู้ดูแลระบบเป็น

$checkboxArray = explode(",", get_post_custom($post->ID)["checkboxArray"][0]); //adding the explode

2. ในไฟล์ PHP เทมเพลต:

ทดสอบ: ถ้าคุณเรียกใช้get_post_meta( $id );คุณจะเห็นcheckboxArrayว่าเป็นอาร์เรย์ที่มีค่าที่คั่นด้วยเครื่องหมายจุลภาคของคุณแทนที่จะเป็นอาร์เรย์ที่ต่อเนื่องกัน

ตอนนี้เราสร้างแบบสอบถาม SQL $wpdbที่กำหนดเองของเราโดยใช้

global $wpdb;

$search = $post->ID;

$query = "SELECT * FROM wp_posts
          WHERE FIND_IN_SET( $search, (
              SELECT wp_postmeta.meta_value FROM wp_postmeta
              WHERE wp_postmeta.meta_key = 'blogLocations'
              AND wp_postmeta.post_id = wp_posts.ID )
          )
          AND ( wp_posts.post_type = 'post' )
          AND ( wp_posts.post_status = 'publish' );";

$posts = $wpdb->get_results($query);

foreach ($posts as $post) {
    //your post content here
}

สังเกตFIND_IN_SETว่านั่นคือสิ่งที่เวทมนตร์เกิดขึ้น

ตอนนี้ ... เนื่องจากฉันใช้SELECT *สิ่งนี้จะส่งคืนข้อมูลโพสต์ทั้งหมดและภายในforeachคุณสามารถสะท้อนสิ่งที่คุณต้องการได้ (ทำprint_r($posts);ถ้าคุณไม่รู้ว่ามีอะไรรวมอยู่) ไม่ได้ตั้งค่า "การวนซ้ำ" สำหรับ คุณ (ฉันชอบวิธีนี้) แต่สามารถแก้ไขได้อย่างง่ายดายเพื่อตั้งค่าลูปถ้าคุณต้องการ (ดูที่setup_postdata($post);codex คุณอาจต้องเปลี่ยนSELECT *เพื่อเลือกเฉพาะโพสต์ ID และประเภทที่$wpdb->get_resultsถูกต้อง$wpdb- - ดู Codex สำหรับ$wpdbยังสำหรับข้อมูลเกี่ยวกับการที่มีจำนวน จำกัด )

เอาละมันต้องใช้ความพยายามบ้างเล็กน้อย แต่เนื่องจากwp_queryไม่สนับสนุนการทำค่าที่เป็น'compare' => 'IN'อนุกรมหรือคั่นด้วยจุลภาค shim นี้เป็นตัวเลือกที่ดีที่สุดของคุณ!

หวังว่านี่จะช่วยใครซักคน


0

หากคุณใช้likeโอเปอเรเตอร์การเปรียบเทียบในคิวรีเมตาดาต้าของคุณควรจะทำงานได้ดีเพื่อดูภายในอาเรย์แบบอนุกรม

$wp_user_search = new WP_User_Query(array(
    'meta_query' => array(
        array(
            'key'     => 'wp_capabilities',
            'value'   => 'subscriber',
            'compare' => 'not like'
            )
        )
    )
);

ผลลัพธ์ใน:

[query_where] => WHERE 1=1 AND (
  ( wp_usermeta.meta_key = 'wp_capabilities' 
  AND CAST(wp_usermeta.meta_value AS CHAR) NOT LIKE '%subscriber%' )

0

หากข้อมูลเมตาของฉันเป็นประเภทอาเรย์ฉันใช้วิธีนี้ในการสืบค้นโดยเมตา:

$args = array(
    'post_type' => 'fotobank',
    'posts_per_page' => -1,
    'meta_query' => array(
            array(
                   'key' => 'collections',
                   'value' => ':"'.$post->ID.'";',
                   'compare' => 'LIKE'
            )
     )
);
$fotos = new WP_Query($args);

สิ่งนี้อาจนำไปสู่ผลลัพธ์ที่ไม่พึงประสงค์เมื่อโพสต์ ID มีค่าเดียวกันกับ id ของสตริงที่ทำให้เป็นอนุกรม
Erenor Paz

0

ฉันอยากรู้อยากเห็นเกี่ยวกับคำตอบข้างต้นที่meta_queryมีการกำหนดเป้าหมายที่สำคัญแทนlatitude _coordinatesต้องไปและทดสอบว่ามันเป็นไปได้จริง ๆ ใน meta query เพื่อกำหนดเป้าหมายคีย์เฉพาะภายในอาร์เรย์ที่ทำให้เป็นอนุกรม :)

เห็นได้ชัดว่าไม่ใช่กรณี

ดังนั้นทราบว่าคีย์ที่ถูกต้องไปยังเป้าหมายที่เป็นแทน_coordinateslatitude

$args = array(
     'post_type' => 'my-post-type',
     'meta_query' => array(
         array(
             'key' => '_coordinates',
             'value' => sprintf(':"%s";', $value),
             'compare' => 'LIKE'
         )
     )
 );

หมายเหตุ:

  1. วิธีการนี้ทำให้สามารถกำหนดเป้าหมายการแข่งขันที่แน่นอนได้เท่านั้น ดังนั้นสิ่งต่างๆเช่นละติจูดทั้งหมดที่สูงกว่า 50จึงเป็นไปไม่ได้

  2. หากต้องการให้มีการแข่งขัน substring 'value' => sprintf(':"%%%s%%";', $value),หนึ่งสามารถใช้ (ยังไม่ได้ทดสอบ)


-1

ฉันมีคำถามเดียวกัน บางทีคุณอาจต้องการพารามิเตอร์ 'type'? ลองดูคำถามที่เกี่ยวข้องนี้: Custom Field Query - Value Meta คือ Array

อาจลอง:

    $ args = array (
    'post_type' => 'my-post-type'
    'meta_query' => อาร์เรย์ (
        array (
            'key' => 'ละติจูด'
            'value' => '50'
            'เปรียบเทียบ' => '>',
            'type' => 'ตัวเลข'
        )
    )
    );

ขอบคุณสำหรับคำแนะนำ แต่นี่ไม่ใช่สิ่งที่ฉันต้องการ ปัญหาคือว่าค่าที่ฉันพยายามจับคู่เป็นส่วนหนึ่งของอาร์เรย์ที่เป็นอนุกรมภายในฐานข้อมูล
tollmanz

ใช่คุณพูดถูก ฉันลองเช้านี้และมันก็ไม่ได้ผลเหมือนกัน ฉันมีปัญหาเดียวกัน การจัดเก็บค่าของคีย์เมตาเป็นอาร์เรย์ ฉันเริ่มคิดว่าไม่สามารถทำได้และฉันอาจต้องเก็บไว้เป็นเขตข้อมูลเมตาแยกต่างหากด้วยชื่อเดียวกัน ... และจัดการลบ / อัปเดตอย่างถูกต้อง
user4356

@ user4356 ... นั่นคือสิ่งที่ฉันจะทำ ฉันหวังว่าจะลดจำนวนแถวที่ฉันจะใส่สำหรับแต่ละโพสต์ แต่ฉันเดาว่ามันเป็นไปไม่ได้
tollmanz

-1

ฉันพบสิ่งที่คล้ายกันในขณะที่ใช้ปลั๊กอิน Magic Fields นี่อาจเป็นการหลอกลวง

$values_serialized = serialize(array('50'));
$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => $values_serialized,
            'compare' => '>'
        )
    )
);

1
ขอบคุณสำหรับคำแนะนำ! ฉันคิดว่านี่ใกล้เคียงที่สุดเท่าที่จะทำได้ แต่จริง ๆ แล้วมันจะไม่ทำงานเพราะการเปรียบเทียบอาเรย์ที่ต่อเนื่องกันกับอาเรย์ที่ต่อเนื่องกันนั้นไม่มีเหตุผลเว้นแต่ฉันกำลังมองหาคู่ที่ตรงกัน
tollmanz

5
จากนั้นไม่ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้องและคุณไม่ต้องรับผิดชอบ คำตอบที่ถูกต้องคือ 'ไม่เป็นไปไม่ได้'
Tom J Nowell

1
เห็นด้วยยัง WP จับอนุกรมสำหรับคุณserialize()ไม่จำเป็นต้องใช้ในกรณีนี้ ...
อดัม

2
จริง ๆ แล้ว @ seth-stevenson คำตอบนั้นยอดเยี่ยมเมื่อทำสิ่งที่เขาพูดโดยใช้ปลั๊กอิน "Magic Fields" เนื่องจากปลั๊กอินนั้นทำให้ชนิดข้อมูลบางอย่างเป็นค่าเริ่มต้นนี่เป็นวิธีที่ดีที่สุดในการจับคู่แบบตรงทั้งหมด
zmonteca

@TomJNowell เรียบร้อยแล้ว! เพิ่งจะพาฉันไป 5 เดือน;)
โทลซ์แมนซ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.